In April I wrote about how I use the
platform_define feature of rebar to make deprecated types work without removing
warnings_as_errors. I have switched to erlang.mk since then, but needed a similar feature for one of my libraries.
Since erlang.mk only uses make, adding support for a
platform_define-like feature is very straightforward.
otp_release = $(shell erl -noshell -eval 'io:format("~s", [erlang:system_info(otp_release)]), init:stop()') otp_17plus = $(shell echo $(otp_release) | grep -q -E "^[[:digit:]]+$$" ; echo $$?)
The first variable (
otp_release) will contain the OTP version (e.g.
17). The second variable (
otp_17plus) will be either
1, depending on wether or not
otp_release matches a regular expression. The regular expression checks if
otp_release is just a number (e.g.
17) or not (e.g.
That’s enough to conditionally add options to
ifeq ($(otp_17plus),0) ERLC_OPTS += -Dnamespaced_types=1 TEST_ERLC_OPTS += -Dnamespaced_types=1 endif
This will define
namespaced_types only on Erlang 17+, allowing us to use the same
ifdef-switch from April.