Erlang R15B added ErlDrvSSizeT typedef, and R16B added erl_drv_output_term function and deprecated the old equivalent. Is there a way to test for these differences with preprocessor macros in order to support older Erlang versions with the same code?
- 167,066
- 35
- 309
- 487
1 Answers
You can use the ERL_DRV_EXTENDED_MAJOR_VERSION and ERL_DRV_EXTENDED_MINOR_VERSION macro values, supplied in erl_driver.h, to make decisions about features. Whenever the driver API changes, these values are suitably incremented. These increments are always explained in the Erlang/OTP release notes.
For example, Erlang/OTP R15B changed some API function parameter types from int to a new type ErlDrvSizeT to better cope with 64-bit platforms. You can test for this and compensate for it for older pre-R15B versions using the code below:
#if ERL_DRV_EXTENDED_MAJOR_VERSION < 2
typedef int ErlDrvSizeT;
#endif
This typedef allows you to use the type ErlDrvSizeT even for older driver versions.
As of this writing, Erlang/OTP version 17.3 and version 6.2 of the Erlang runtime system (erts) are current. For erts 6.2, ERL_DRV_EXTENDED_MAJOR_VERSION and ERL_DRV_EXTENDED_MINOR_VERSION have the values 3 and 1, respectively. The changes in this Erlang/OTP commit created these version values.
- 19,847
- 3
- 31
- 46