diff options
| -rw-r--r-- | src/rebar_app_discover.erl | 13 | ||||
| -rw-r--r-- | test/rebar_compile_SUITE.erl | 73 | 
2 files changed, 61 insertions, 25 deletions
| diff --git a/src/rebar_app_discover.erl b/src/rebar_app_discover.erl index 21dea29..0c97ad7 100644 --- a/src/rebar_app_discover.erl +++ b/src/rebar_app_discover.erl @@ -52,7 +52,7 @@ do(State, LibDirs) ->                          Name = rebar_app_info:name(AppInfo),                          case enable(State, AppInfo) of                              true -> -                                {AppInfo1, StateAcc1} = merge_opts(AppInfo, StateAcc), +                                {AppInfo1, StateAcc1} = merge_opts(TopLevelApp, AppInfo, StateAcc),                                  OutDir = filename:join(DepsDir, Name),                                  AppInfo2 = rebar_app_info:out_dir(AppInfo1, OutDir),                                  ProjectDeps1 = lists:delete(Name, ProjectDeps), @@ -91,9 +91,9 @@ format_error({missing_module, Module}) ->  %% some configuration like erl_opts must be merged into a subapp's opts  %% while plugins and hooks need to be kept defined to only either the  %% top level state or an individual application. --spec merge_opts(rebar_app_info:t(), rebar_state:t()) -> +-spec merge_opts(root | binary(), rebar_app_info:t(), rebar_state:t()) ->      {rebar_app_info:t(), rebar_state:t()}. -merge_opts(AppInfo, State) -> +merge_opts(TopLevelApp, AppInfo, State) ->      %% These steps make sure that hooks and artifacts are run in the context of      %% the application they are defined at. If an umbrella structure is used and      %% they are defined at the top level they will instead run in the context of @@ -104,7 +104,12 @@ merge_opts(AppInfo, State) ->      Name = rebar_app_info:name(AppInfo1),      %% We reset the opts here to default so no profiles are applied multiple times -    AppInfo2 = rebar_app_info:apply_overrides(rebar_state:get(State1, overrides, []), AppInfo1), +    AppInfo2 = case TopLevelApp of +        Name -> % don't apply to the root app +            AppInfo; +        _ -> % apply overrides when in an umbrella project or on deps +            rebar_app_info:apply_overrides(rebar_state:get(State1, overrides, []), AppInfo1) +    end,      AppInfo3 = rebar_app_info:apply_profiles(AppInfo2, CurrentProfiles),      %% Will throw an exception if checks fail diff --git a/test/rebar_compile_SUITE.erl b/test/rebar_compile_SUITE.erl index 44f20d7..8389ebc 100644 --- a/test/rebar_compile_SUITE.erl +++ b/test/rebar_compile_SUITE.erl @@ -27,7 +27,7 @@ all() ->       profile_deps, deps_build_in_prod, only_deps,       override_deps, override_add_deps, override_del_deps,       override_opts, override_add_opts, override_del_opts, -     apply_overrides_exactly_once, +     apply_overrides_exactly_once, override_only_deps,       profile_override_deps, profile_override_add_deps, profile_override_del_deps,       profile_override_opts, profile_override_add_opts, profile_override_del_opts,       include_file_relative_to_working_directory, include_file_in_src, @@ -1442,10 +1442,11 @@ override_del_deps(Config) ->      ).  override_opts(Config) -> -    AppDir = ?config(apps, Config), +    AppsDir = ?config(apps, Config),      Name = rebar_test_utils:create_random_name("app1_"),      Vsn = rebar_test_utils:create_random_vsn(), +    AppDir = filename:join([AppsDir, "apps", Name]),      rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),      RebarConfig = [ @@ -1460,12 +1461,12 @@ override_opts(Config) ->          ]}      ], -    rebar_test_utils:create_config(AppDir, RebarConfig), +    rebar_test_utils:create_config(AppsDir, RebarConfig),      rebar_test_utils:run_and_check(           Config, RebarConfig, ["compile"], {ok, [{app, Name}]}), -    Path = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]), +    Path = filename:join([AppsDir, "_build", "default", "lib", Name, "ebin"]),      code:add_patha(Path),      Mod = list_to_atom("not_a_real_src_" ++ Name), @@ -1502,7 +1503,7 @@ apply_overrides_exactly_once(Config) ->      rebar_test_utils:run_and_check(        Config, RebarConfig, ["ct", "--compile_only"], {ok, [{app, Name}, {dep, "some_dep"}], "test"}). -override_add_opts(Config) -> +override_only_deps(Config) ->      AppDir = ?config(apps, Config),      Name = rebar_test_utils:create_random_name("app1_"), @@ -1510,6 +1511,30 @@ override_add_opts(Config) ->      rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),      RebarConfig = [ +        {deps, []}, %% with deps enabled, this test fails +        {overrides, [ +            {add, [ +                {erl_opts, [{d, bad, a}, {d, bad, b}]} +            ]} +        ]} +    ], + +    rebar_test_utils:create_config(AppDir, RebarConfig), + +    rebar_test_utils:run_and_check( +         Config, RebarConfig, ["compile"], {ok, [{app, Name}]}), + +    ok. + +override_add_opts(Config) -> +    AppsDir = ?config(apps, Config), + +    Name = rebar_test_utils:create_random_name("app1_"), +    Vsn = rebar_test_utils:create_random_vsn(), +    AppDir = filename:join([AppsDir, "apps", Name]), +    rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), + +    RebarConfig = [          {erl_opts, [              warn_missing_spec          ]}, @@ -1520,12 +1545,12 @@ override_add_opts(Config) ->          ]}      ], -    rebar_test_utils:create_config(AppDir, RebarConfig), +    rebar_test_utils:create_config(AppsDir, RebarConfig),      rebar_test_utils:run_and_check(           Config, RebarConfig, ["compile"], {ok, [{app, Name}]}), -    Path = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]), +    Path = filename:join([AppsDir, "_build", "default", "lib", Name, "ebin"]),      code:add_patha(Path),      Mod = list_to_atom("not_a_real_src_" ++ Name), @@ -1534,10 +1559,11 @@ override_add_opts(Config) ->      true = lists:member(warn_missing_spec, proplists:get_value(options, Mod:module_info(compile), [])).  override_del_opts(Config) -> -    AppDir = ?config(apps, Config), +    AppsDir = ?config(apps, Config),      Name = rebar_test_utils:create_random_name("app1_"),      Vsn = rebar_test_utils:create_random_vsn(), +    AppDir = filename:join([AppsDir, "apps", Name]),      rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),      RebarConfig = [ @@ -1552,18 +1578,19 @@ override_del_opts(Config) ->          ]}      ], -    rebar_test_utils:create_config(AppDir, RebarConfig), +    rebar_test_utils:create_config(AppsDir, RebarConfig),      rebar_test_utils:run_and_check(           Config, RebarConfig, ["compile"], {ok, [{app, Name}]}), -    Path = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]), +    Path = filename:join([AppsDir, "_build", "default", "lib", Name, "ebin"]),      code:add_patha(Path),      Mod = list_to_atom("not_a_real_src_" ++ Name),      true = lists:member(compressed, proplists:get_value(options, Mod:module_info(compile), [])), -    false = lists:member(warn_missing_spec, proplists:get_value(options, Mod:module_info(compile), [])). +    false = lists:member(warn_missing_spec, proplists:get_value(options, Mod:module_info(compile), [])), +    ok.  profile_override_deps(Config) ->      Deps = rebar_test_utils:expand_deps(git, [{"some_dep", "0.0.1", [{"other_dep", "0.0.1", []}]}]), @@ -1665,10 +1692,11 @@ profile_override_del_deps(Config) ->      ).  profile_override_opts(Config) -> -    AppDir = ?config(apps, Config), +    AppsDir = ?config(apps, Config),      Name = rebar_test_utils:create_random_name("app1_"),      Vsn = rebar_test_utils:create_random_vsn(), +    AppDir = filename:join([AppsDir, "apps", Name]),      rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),      RebarConfig = [ @@ -1687,12 +1715,12 @@ profile_override_opts(Config) ->          ]}      ], -    rebar_test_utils:create_config(AppDir, RebarConfig), +    rebar_test_utils:create_config(AppsDir, RebarConfig),      rebar_test_utils:run_and_check(           Config, RebarConfig, ["as", "a", "compile"], {ok, [{app, Name}]}), -    Path = filename:join([AppDir, "_build", "a", "lib", Name, "ebin"]), +    Path = filename:join([AppsDir, "_build", "a", "lib", Name, "ebin"]),      code:add_patha(Path),      Mod = list_to_atom("not_a_real_src_" ++ Name), @@ -1701,10 +1729,11 @@ profile_override_opts(Config) ->      false = lists:member(warn_missing_spec, proplists:get_value(options, Mod:module_info(compile), [])).  profile_override_add_opts(Config) -> -    AppDir = ?config(apps, Config), +    AppsDir = ?config(apps, Config),      Name = rebar_test_utils:create_random_name("app1_"),      Vsn = rebar_test_utils:create_random_vsn(), +    AppDir = filename:join([AppsDir, "apps", Name]),      rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),      RebarConfig = [ @@ -1722,12 +1751,12 @@ profile_override_add_opts(Config) ->          ]}      ], -    rebar_test_utils:create_config(AppDir, RebarConfig), +    rebar_test_utils:create_config(AppsDir, RebarConfig),      rebar_test_utils:run_and_check(           Config, RebarConfig, ["as", "a", "compile"], {ok, [{app, Name}]}), -    Path = filename:join([AppDir, "_build", "a", "lib", Name, "ebin"]), +    Path = filename:join([AppsDir, "_build", "a", "lib", Name, "ebin"]),      code:add_patha(Path),      Mod = list_to_atom("not_a_real_src_" ++ Name), @@ -1736,10 +1765,11 @@ profile_override_add_opts(Config) ->      true = lists:member(warn_missing_spec, proplists:get_value(options, Mod:module_info(compile), [])).  profile_override_del_opts(Config) -> -    AppDir = ?config(apps, Config), +    AppsDir = ?config(apps, Config),      Name = rebar_test_utils:create_random_name("app1_"),      Vsn = rebar_test_utils:create_random_vsn(), +    AppDir = filename:join([AppsDir, "apps", Name]),      rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),      RebarConfig = [ @@ -1758,18 +1788,19 @@ profile_override_del_opts(Config) ->          ]}      ], -    rebar_test_utils:create_config(AppDir, RebarConfig), +    rebar_test_utils:create_config(AppsDir, RebarConfig),      rebar_test_utils:run_and_check(           Config, RebarConfig, ["as", "a", "compile"], {ok, [{app, Name}]}), -    Path = filename:join([AppDir, "_build", "a", "lib", Name, "ebin"]), +    Path = filename:join([AppsDir, "_build", "a", "lib", Name, "ebin"]),      code:add_patha(Path),      Mod = list_to_atom("not_a_real_src_" ++ Name),      true = lists:member(compressed, proplists:get_value(options, Mod:module_info(compile), [])), -    false = lists:member(warn_missing_spec, proplists:get_value(options, Mod:module_info(compile), [])). +    false = lists:member(warn_missing_spec, proplists:get_value(options, Mod:module_info(compile), [])), +    ok.  profile_deps(Config) ->      Deps = rebar_test_utils:expand_deps(git, [{"some_dep", "0.0.1", [{"other_dep", "0.0.1", []}]}]), | 
