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"} ].