summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/rebar_port_compiler.erl102
-rw-r--r--src/rebar_utils.erl38
2 files changed, 88 insertions, 52 deletions
diff --git a/src/rebar_port_compiler.erl b/src/rebar_port_compiler.erl
index 8236842..efd5cf3 100644
--- a/src/rebar_port_compiler.erl
+++ b/src/rebar_port_compiler.erl
@@ -42,47 +42,47 @@
%% {arch_regex(), "priv/foo.so", ["c_src/foo.c"]}
%% {"priv/foo", ["c_src/foo.c"]}
%%
-%% * port_envs - Erlang list of key/value pairs which will control
-%% the environment when running the compiler and linker.
+%% * port_env - Erlang list of key/value pairs which will control
+%% the environment when running the compiler and linker.
%%
-%% By default, the following variables are defined:
-%% CC - C compiler
-%% CXX - C++ compiler
-%% CFLAGS - C compiler
-%% CXXFLAGS - C++ compiler
-%% LDFLAGS - Link flags
-%% ERL_CFLAGS - default -I paths for erts and ei
-%% ERL_LDFLAGS - default -L and -lerl_interface -lei
-%% DRV_CFLAGS - flags that will be used for compiling
-%% DRV_LDFLAGS - flags that will be used for linking
-%% EXE_CFLAGS - flags that will be used for compiling
-%% EXE_LDFLAGS - flags that will be used for linking
-%% ERL_EI_LIBDIR - ei library directory
-%% DRV_CXX_TEMPLATE - C++ command template
-%% DRV_CC_TEMPLATE - C command template
-%% DRV_LINK_TEMPLATE - Linker command template
-%% EXE_CXX_TEMPLATE - C++ command template
-%% EXE_CC_TEMPLATE - C command template
-%% EXE_LINK_TEMPLATE - Linker command template
-%% PORT_IN_FILES - contains a space separated list of input
-%% file(s), (used in command template)
-%% PORT_OUT_FILE - contains the output filename (used in
-%% command template)
+%% By default, the following variables are defined:
+%% CC - C compiler
+%% CXX - C++ compiler
+%% CFLAGS - C compiler
+%% CXXFLAGS - C++ compiler
+%% LDFLAGS - Link flags
+%% ERL_CFLAGS - default -I paths for erts and ei
+%% ERL_LDFLAGS - default -L and -lerl_interface -lei
+%% DRV_CFLAGS - flags that will be used for compiling
+%% DRV_LDFLAGS - flags that will be used for linking
+%% EXE_CFLAGS - flags that will be used for compiling
+%% EXE_LDFLAGS - flags that will be used for linking
+%% ERL_EI_LIBDIR - ei library directory
+%% DRV_CXX_TEMPLATE - C++ command template
+%% DRV_CC_TEMPLATE - C command template
+%% DRV_LINK_TEMPLATE - Linker command template
+%% EXE_CXX_TEMPLATE - C++ command template
+%% EXE_CC_TEMPLATE - C command template
+%% EXE_LINK_TEMPLATE - Linker command template
+%% PORT_IN_FILES - contains a space separated list of input
+%% file(s), (used in command template)
+%% PORT_OUT_FILE - contains the output filename (used in
+%% command template)
%%
-%% Note that if you wish to extend (vs. replace) these variables,
-%% you MUST include a shell-style reference in your definition.
-%% e.g. to extend CFLAGS, do something like:
+%% Note that if you wish to extend (vs. replace) these variables,
+%% you MUST include a shell-style reference in your definition.
+%% e.g. to extend CFLAGS, do something like:
%%
-%% {port_envs, [{"CFLAGS", "$CFLAGS -MyOtherOptions"}]}
+%% {port_env, [{"CFLAGS", "$CFLAGS -MyOtherOptions"}]}
%%
-%% It is also possible to specify platform specific options
-%% by specifying a triplet where the first string is a regex
-%% that is checked against Erlang's system architecture string.
-%% e.g. to specify a CFLAG that only applies to x86_64 on linux
-%% do:
+%% It is also possible to specify platform specific options
+%% by specifying a triplet where the first string is a regex
+%% that is checked against Erlang's system architecture string.
+%% e.g. to specify a CFLAG that only applies to x86_64 on linux
+%% do:
%%
-%% {port_envs, [{"x86_64.*-linux", "CFLAGS",
-%% "$CFLAGS -X86Options"}]}
+%% {port_env, [{"x86_64.*-linux", "CFLAGS",
+%% "$CFLAGS -X86Options"}]}
%%
compile(Config, AppFile) ->
@@ -152,10 +152,10 @@ setup_env(Config) ->
%% Extract environment values from the config (if specified) and
%% merge with the default for this operating system. This enables
%% max flexibility for users.
- DefaultEnvs = filter_envs(default_env(), []),
- PortEnvs = port_envs(Config),
- OverrideEnvs = global_defines() ++ filter_envs(PortEnvs, []),
- RawEnv = apply_defaults(os_env(), DefaultEnvs) ++ OverrideEnvs,
+ DefaultEnv = filter_env(default_env(), []),
+ PortEnv = port_env(Config),
+ OverrideEnv = global_defines() ++ filter_env(PortEnv, []),
+ RawEnv = apply_defaults(os_env(), DefaultEnv) ++ OverrideEnv,
expand_vars_loop(merge_each_var(RawEnv, [])).
%% ===================================================================
@@ -381,9 +381,11 @@ is_expandable(InStr) ->
nomatch -> false
end.
-port_envs(Config) ->
- PortEnvs = rebar_config:get_list(Config, port_envs, []),
- %% TODO: remove migration of deprecated port_envs (DRV_-/EXE_-less vars)
+port_env(Config) ->
+ %% TODO: remove support for deprecated port_envs option
+ PortEnv = rebar_utils:get_deprecated_list(Config, port_envs, port_env,
+ [], "soon"),
+ %% TODO: remove migration of deprecated port_env DRV_-/EXE_-less vars
%% when the deprecation grace period ends
WarnAndConvertVar = fun(Var) ->
New = "DRV_" ++ Var,
@@ -406,23 +408,23 @@ port_envs(Config) ->
({Var, Val}) ->
{ConvertVar(Var), ReplaceVars(Val)}
end,
- [Convert(Env) || Env <- PortEnvs].
+ [Convert(EnvVar) || EnvVar <- PortEnv].
%%
%% Filter a list of env vars such that only those which match the provided
%% architecture regex (or do not have a regex) are returned.
%%
-filter_envs([], Acc) ->
+filter_env([], Acc) ->
lists:reverse(Acc);
-filter_envs([{ArchRegex, Key, Value} | Rest], Acc) ->
+filter_env([{ArchRegex, Key, Value} | Rest], Acc) ->
case rebar_utils:is_arch(ArchRegex) of
true ->
- filter_envs(Rest, [{Key, Value} | Acc]);
+ filter_env(Rest, [{Key, Value} | Acc]);
false ->
- filter_envs(Rest, Acc)
+ filter_env(Rest, Acc)
end;
-filter_envs([{Key, Value} | Rest], Acc) ->
- filter_envs(Rest, [{Key, Value} | Acc]).
+filter_env([{Key, Value} | Rest], Acc) ->
+ filter_env(Rest, [{Key, Value} | Acc]).
erts_dir() ->
diff --git a/src/rebar_utils.erl b/src/rebar_utils.erl
index eafcf0e..bb05597 100644
--- a/src/rebar_utils.erl
+++ b/src/rebar_utils.erl
@@ -46,6 +46,8 @@
expand_env_variable/3,
vcs_vsn/2,
get_deprecated_global/3,
+ get_deprecated_list/4, get_deprecated_list/5,
+ get_deprecated_local/4, get_deprecated_local/5,
delayed_halt/1]).
-include("rebar.hrl").
@@ -235,9 +237,12 @@ vcs_vsn_1(Vcs, Dir) ->
end.
get_deprecated_global(OldOpt, NewOpt, When) ->
- case rebar_config:get_global(NewOpt, undefined) of
+ get_deprecated_global(OldOpt, NewOpt, undefined, When).
+
+get_deprecated_global(OldOpt, NewOpt, Default, When) ->
+ case rebar_config:get_global(NewOpt, Default) of
undefined ->
- case rebar_config:get_global(OldOpt, undefined) of
+ case rebar_config:get_global(OldOpt, Default) of
undefined ->
undefined;
Old ->
@@ -248,6 +253,21 @@ get_deprecated_global(OldOpt, NewOpt, When) ->
New
end.
+
+get_deprecated_list(Config, OldOpt, NewOpt, When) ->
+ get_deprecated_list(Config, OldOpt, NewOpt, undefined, When).
+
+get_deprecated_list(Config, OldOpt, NewOpt, Default, When) ->
+ get_deprecated_3(fun rebar_config:get_list/3,
+ Config, OldOpt, NewOpt, Default, When).
+
+get_deprecated_local(Config, OldOpt, NewOpt, When) ->
+ get_deprecated_local(Config, OldOpt, NewOpt, undefined, When).
+
+get_deprecated_local(Config, OldOpt, NewOpt, Default, When) ->
+ get_deprecated_3(fun rebar_config:get_local/3,
+ Config, OldOpt, NewOpt, Default, When).
+
deprecated(Old, New, Opts, When) when is_list(Opts) ->
case lists:member(Old, Opts) of
true ->
@@ -287,6 +307,20 @@ delayed_halt(Code) ->
%% Internal functions
%% ====================================================================
+get_deprecated_3(Get, Config, OldOpt, NewOpt, Default, When) ->
+ case Get(Config, NewOpt, Default) of
+ Default ->
+ case Get(Config, OldOpt, Default) of
+ Default ->
+ Default;
+ Old ->
+ deprecated(OldOpt, NewOpt, When),
+ Old
+ end;
+ New ->
+ New
+ end.
+
%% We do the shell variable substitution ourselves on Windows and hope that the
%% command doesn't use any other shell magic.
patch_on_windows(Cmd, Env) ->