Current section
Files
Jump to
Current section
Files
rebar.config.script
%% Copyright © 2018 Pierre Fenoll ‹pierrefenoll@gmail.com›
%% See LICENSE for licensing information.
%% -*- coding: utf-8 -*-
begin
%% From https://github.com/erlang/rebar3/blob/c48435a/src/rebar_utils.erl#L489-L526
OTP_VSN = {X,Y,Z} =
case erlang:system_info(otp_release) of
%% If OTP <= R16, otp_release is already what we want.
"R16B01" -> {"16", "1", "0"};
"R16B02" -> {"16", "2", "0"};
"R16B03" -> {"16", "3", "0"};
"R16B03-1" -> {"16", "3", "1"};
%% If OTP >= 17.x, erlang:system_info(otp_release) returns just the
%% major version number, we have to read the full version from
%% a file. See http://www.erlang.org/doc/system_principles/versions.html
%% Read vsn string from the 'OTP_VERSION' file and return as list without
%% the "\n".
Rel ->
Split = fun (Bin) -> binary:split(Bin, [<<$.>>,<<$->>], [global]) end,
ToXYZ = fun ([X,Y]) -> {X, Y, "0"};
([X,Y,<<"rc",_/binary>>]) -> {X, Y, "0"};
([X,Y,Z|_]) -> {X, Y, Z}
end,
File = filename:join([code:root_dir(), "releases", Rel, "OTP_VERSION"]),
{ok,Vsn} = file:read_file(File),
Size = byte_size(Vsn),
%% The shortest vsn string consists of at least two digits
%% followed by "\n". Therefore, it's safe to assume Size >= 3.
{SizeMinus1,SizeMinus3} = {Size - 1, Size - 3},
case Vsn of
<<VSN:SizeMinus3/binary, "**\n">> ->
%% The OTP documentation mentions that a system patched
%% using the otp_patch_apply tool available to licensed
%% customers will leave a '**' suffix in the version as a
%% flag saying the system consists of application versions
%% from multiple OTP versions. We ignore this flag and
%% drop the suffix, given for all intents and purposes, we
%% cannot obtain relevant information from it as far as
%% tooling is concerned.
ToXYZ(Split(VSN));
<<VSN:SizeMinus1/binary, "\n">> ->
ToXYZ(Split(VSN))
end
end,
Data = ["-define(_internal_otp_vsn_", X,$_,Y,$_,Z, ", true).", $\n],
DepsDir = case os:getenv("REBAR_LIB_DEPS") of
false -> "_build/default/lib";
[] -> "_build/default/lib";
Dir ->
Dir
end,
Dst = case filelib:is_regular(filename:join("src","otp_vsn.app.src")) of
false ->
filename:join(
%["_build","default","lib","otp_vsn","include","internal_otp_vsn.hrl"
[DepsDir,"otp_vsn","include","internal_otp_vsn.hrl"
]);
true ->
%% Current app is this app itself
filename:join("include", "internal_otp_vsn.hrl")
end,
ok = file:write_file(Dst, Data),
CONFIG
end.