From bc5aebcf5fb8e314b10a069a6f6cb6ad272ac828 Mon Sep 17 00:00:00 2001 From: Anthony Molinaro Date: Thu, 12 May 2011 14:14:24 -0700 Subject: [PATCH] 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. --- src/rebar_port_compiler.erl | 52 +++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/src/rebar_port_compiler.erl b/src/rebar_port_compiler.erl index 9b19045..19c6f79 100644 --- a/src/rebar_port_compiler.erl +++ b/src/rebar_port_compiler.erl @@ -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"} ].