Guidance For: 0.25.0 | 0.24.0 | 0.23.0 | 0.22.0 | 0.21.0 | 0.20.0 | 0.19.0 | 0.18.0 | 0.17.0 | 0.16.0 | 0.15.0 | 0.14.0 | 0.13.0 | 0.12.0 | 0.11.0
Thrift supports many programming languages and has an impressive test suite that exercises most of the languages, protocols, and transports. Each build exercises a matrix of thousands of possible combinations. Each language typically has a minimum required version as well as support libraries - some mandatory and some optional. The information provided below will help you assess whether you can use Apache Thrift with your project. Obviously this is a complex matrix to maintain and may not be correct in all cases - if you spot an error please inform the developers using the mailing list, or better yet, Edit on GitHub.
Apache Thrift currently uses two build systems. The autoconf build system is
the most complete and builds all supported languages, however it does not support
Windows. The cmake build system works on Linux and Windows, and has been
designated by the project to replace autoconf however this transition will
take quite some time to complete. During that transition, the cmake build will
not support all languages.
The Language/Library Levels indicate the minimum and maximum versions that are used in the continuous integration environments (Appveyor, GitHub Actions) for Apache Thrift. Other language levels may be supported for each language, however tested less thoroughly; check the README file inside each lib directory for additional details. Note: while a language may contain support for protocols, transports, and servers, the extent to which each is tested as part of the overall build process varies. The definitive integration test for the project is called the “cross” test which executes a test matrix with clients and servers communicating across languages.
Thrift’s core transport (supported by all languages) is TSocket. Thrift’s core protocol is TBinary, supported by all languages except for JavaScript.
Apache Thrift targets the versions of each language runtime and toolchain that are still receiving upstream support – active or security – at the time a Thrift release is cut. Once a version reaches its upstream end of life it becomes a candidate for removal from the tested matrix and from the minimum version listed for that language below.
This is a guideline, not a hard rule. Where the cost of keeping an older, already end-of-life version working is small, the project may continue to support it as a courtesy, and several languages do. Support is withdrawn when keeping it is no longer practical – most clearly when the end-of-life version carries defects that affect Thrift and that its upstream will no longer fix. When a minimum version advances, the reason is recorded in the release notes.
The Min column below is the lowest version the CI matrix exercises for each
language; it is the effective minimum the project stands behind for that release.
| Language | Since | Build Systems | Lang/Lib Levels (Tested) | Field types | Low-Level Transports | Transport Wrappers | Protocols | Servers | Open Issues | |||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| autoconf | cmake | Min | Max | Uuid | Domain | File | Memory | Pipe | Socket | TLS | Framed | Header | http | zlib | Binary | Compact | JSON | Multiplex | Forking | Nonblocking | Simple | Threaded | ThreadPool | |||
| C (glib) | 0.6.0 | ![]() | ![]() |
2.48.2 | 2.56.4 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
C (glib) |
| C++ | 0.2.0 | ![]() | ![]() |
C++11 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
C++ | |
| Common LISP | 0.12.0 | ![]() | ![]() |
SBCL 1.4.x | SBCL 1.5.3 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
Common LISP |
| Dlang | 0.9.0 | ![]() | ![]() |
2.087.0 | 2.087.0 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
D |
| Dart | 0.10.0 | ![]() | ![]() |
3.2.0 | 3.13.3 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
Dart |
| Delphi | 0.8.0 | ![]() | ![]() |
2010 | Athens 12.2 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
Delphi |
| .NET | 0.13.0 | ![]() | ![]() |
.NET Standard 2.x, net8, net9, net10 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
.NET | |
| Erlang | 0.3.0 | ![]() | ![]() |
25.3 | 28.5 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
Erlang |
| Go | 0.7.0 | ![]() | ![]() |
1.26 | 1.27 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
Go |
| Haxe | 0.9.3 | ![]() | ![]() |
4.1.5 | 4.2.5 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
Haxe |
| Java (SE) | 0.2.0 | ![]() | ![]() |
8 | 17 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
Java SE |
| Java (ME) | 0.5.0 | ![]() | ![]() |
unknown | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
Java ME | |
| Javascript | 0.3.0 | ![]() | ![]() |
ES5 | ES6 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
Javascript |
| Kotlin | 0.17.0 | ![]() | ![]() |
2.4.10 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
Kotlin | |
| Lua | 0.9.2 | ![]() | ![]() |
5.3 | 5.4 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
Lua |
| node.js | 0.6.0 | ![]() | ![]() |
20.x | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
node.js | |
| node.ts | 0.12.0 | ![]() | ![]() |
5.7.2 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
node.ts | |
| OCaml | 0.2.0 | ![]() | ![]() |
4.04.0 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
OCaml | |
| Perl | 0.2.0 | ![]() | ![]() |
5.22.1 | 5.26.1 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
Perl |
| PHP | 0.2.0 | ![]() | ![]() |
8.2 | 8.5 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
PHP |
| Python | 0.2.0 | ![]() | ![]() |
3.10 | 3.14 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
Python |
| Ruby | 0.2.0 | ![]() | ![]() |
3.0.7 | 4.0.0 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
Ruby |
| Rust | 0.11.0 | ![]() | ![]() |
1.83.0 | 1.85.1 | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
Rust |
| Smalltalk | 0.2.0 | ![]() | ![]() |
unknown | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
Smalltalk | |
| Language | Since | autoconf | cmake | Min | Max | Uuid | Domain | File | Memory | Pipe | Socket | TLS | Framed | Header | http | zlib | Binary | Compact | JSON | Multiplex | Forking | Nonblocking | Simple | Threaded | ThreadPool | Open Issues |
| Build Systems | Lang/Lib Levels (Tested) | Field types | Low-Level Transports | Transport Wrappers | Protocols | Servers | ||||||||||||||||||||
Some entries in the table carry a condition that a single cell cannot express:
rustls
feature, which is off by default. See
TLS in the
Rust README.TServer::listen_uds is compiled on Unix platforms only.options.release = 8,
so 8 and 17 are the tested bounds rather than a maximum supported release.