Change logic to support more port env use cases

The logic changes from strict overrides to a hybrid for merging os_env
and defaults, whereby defaults are chosen if they are not set in the
os_env or if the defaults contains substitutions (at which point os
environment is substituted).

This still means that rebar.config works as it did before, where it
overrides or substitutes based on the use of $VAR, but that default
and os environment merging works such that the common cases of
providing CC or LDFLAGS in the users environment or command line work
as you might expect.  In that CC is overriden by the os environment
unless rebar.config overrides it, and LDFLAGS from the user environment
is appended or prepended based on defaults and rebar.config.

Addresses problems with https://github.com/basho/rebar/pull/71
Also keeps the fix for bug 255.
This commit is contained in:
Anthony Molinaro 2011-05-12 14:14:24 -07:00
parent 096e56d61c
commit bc5aebcf5f

View file

@ -153,7 +153,7 @@ setup_env(Config) ->
DefaultEnvs = filter_envs(default_env(), []),
PortEnvs = rebar_config:get_list(Config, port_envs, []),
OverrideEnvs = filter_envs(PortEnvs, []),
RawEnv = DefaultEnvs ++ OverrideEnvs ++ os_env(),
RawEnv = apply_defaults(os_env(), DefaultEnvs) ++ OverrideEnvs,
expand_vars_loop(merge_each_var(RawEnv, [])).
%% ===================================================================
@ -266,7 +266,24 @@ compiler(".c++") -> "$CXX";
compiler(".C") -> "$CXX";
compiler(_) -> "$CC".
%%
%% Given a list of {Key, Value} variables, and another list of default
%% {Key, Value} variables, return a merged list where the rule is if the
%% default is expandable expand it with the value of the variable list,
%% otherwise just return the value of the variable.
%%
apply_defaults(Vars, Defaults) ->
dict:to_list(
dict:merge(fun(Key, VarValue, DefaultValue) ->
case is_expandable(DefaultValue) of
true ->
expand_env_variable(DefaultValue,
Key, VarValue);
false -> VarValue
end
end,
dict:from_list(Vars),
dict:from_list(Defaults))).
%%
%% Given a list of {Key, Value} environment variables, where Key may be defined
%% multiple times, walk the list and expand each self-reference so that we
@ -324,6 +341,16 @@ expand_vars(Key, Value, Vars) ->
[], Vars).
%%
%% Given a string, determine if it is expandable
%%
is_expandable(InStr) ->
case re:run(InStr,"\\\$",[{capture,none}]) of
match -> true;
nomatch -> false
end.
%%
%% Given env. variable FOO we want to expand all references to
%% it in InStr. References can have two forms: $FOO and ${FOO}
@ -374,17 +401,20 @@ default_env() ->
{"ERLANG_ARCH", integer_to_list(8 * erlang:system_info(wordsize))},
{"ERLANG_TARGET", rebar_utils:get_arch()},
{"solaris.*-64$", "CFLAGS", "-D_REENTRANT -m64"}, % Solaris specific flags
{"solaris.*-64$", "CXXFLAGS", "-D_REENTRANT -m64"},
{"solaris.*-64$", "LDFLAGS", "-m64"},
%% Solaris specific flags
{"solaris.*-64$", "CFLAGS", "-D_REENTRANT -m64 $CFLAGS"},
{"solaris.*-64$", "CXXFLAGS", "-D_REENTRANT -m64 $CXXFLAGS"},
{"solaris.*-64$", "LDFLAGS", "-m64 $LDFLAGS"},
{"darwin9.*-64$", "CFLAGS", "-m64"}, % OS X Leopard flags for 64-bit
{"darwin9.*-64$", "CXXFLAGS", "-m64"},
{"darwin9.*-64$", "LDFLAGS", "-arch x86_64"},
%% OS X Leopard flags for 64-bit
{"darwin9.*-64$", "CFLAGS", "-m64 $CFLAGS"},
{"darwin9.*-64$", "CXXFLAGS", "-m64 $CXXFLAGS"},
{"darwin9.*-64$", "LDFLAGS", "-arch x86_64 $LDFLAGS"},
{"darwin10.*-32", "CFLAGS", "-m32"}, % OS X Snow Leopard flags for 32-bit
{"darwin10.*-32", "CXXFLAGS", "-m32"},
{"darwin10.*-32", "LDFLAGS", "-arch i386"}
%% OS X Snow Leopard flags for 32-bit
{"darwin10.*-32", "CFLAGS", "-m32 $CFLAGS"},
{"darwin10.*-32", "CXXFLAGS", "-m32 $CXXFLAGS"},
{"darwin10.*-32", "LDFLAGS", "-arch i386 $LDFLAGS"}
].