From d2b62ea1f2b101b3ff2ec74c8328f2001e854b70 Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Sat, 30 May 2015 12:50:35 -0700 Subject: allow `src_dirs` and `extra_src_dirs` at the root of the rebar config --- src/rebar_dir.erl | 4 +- test/rebar_extra_src_dirs_SUITE.erl | 152 ----------------------- test/rebar_src_dirs_SUITE.erl | 239 ++++++++++++++++++++++++++++++++++++ 3 files changed, 241 insertions(+), 154 deletions(-) delete mode 100644 test/rebar_extra_src_dirs_SUITE.erl create mode 100644 test/rebar_src_dirs_SUITE.erl diff --git a/src/rebar_dir.erl b/src/rebar_dir.erl index e810912..cb643ab 100644 --- a/src/rebar_dir.erl +++ b/src/rebar_dir.erl @@ -132,7 +132,7 @@ src_dirs(State) -> src_dirs(State, []). src_dirs(State, Default) -> ErlOpts = rebar_utils:erl_opts(State), Vs = proplists:get_all_values(src_dirs, ErlOpts), - case lists:append(Vs) of + case lists:append([rebar_state:get(State, src_dirs, []) | Vs]) of [] -> Default; Dirs -> Dirs end. @@ -144,7 +144,7 @@ extra_src_dirs(State) -> extra_src_dirs(State, []). extra_src_dirs(State, Default) -> ErlOpts = rebar_utils:erl_opts(State), Vs = proplists:get_all_values(extra_src_dirs, ErlOpts), - case lists:append(Vs) of + case lists:append([rebar_state:get(State, extra_src_dirs, []) | Vs]) of [] -> Default; Dirs -> Dirs end. diff --git a/test/rebar_extra_src_dirs_SUITE.erl b/test/rebar_extra_src_dirs_SUITE.erl deleted file mode 100644 index a00bb2d..0000000 --- a/test/rebar_extra_src_dirs_SUITE.erl +++ /dev/null @@ -1,152 +0,0 @@ --module(rebar_extra_src_dirs_SUITE). - --export([suite/0, - init_per_suite/1, - end_per_suite/1, - init_per_testcase/2, - end_per_testcase/2, - all/0, - build_basic_app/1, - build_multi_apps/1, - src_dir_takes_precedence/1]). - --include_lib("common_test/include/ct.hrl"). - -suite() -> - []. - -init_per_suite(Config) -> - Config. - -end_per_suite(_Config) -> - ok. - -init_per_testcase(_, Config) -> - rebar_test_utils:init_rebar_state(Config). - -end_per_testcase(_, _Config) -> ok. - -all() -> - [build_basic_app, build_multi_apps, src_dir_takes_precedence]. - -build_basic_app(Config) -> - AppDir = ?config(apps, Config), - - Name = rebar_test_utils:create_random_name("app1_"), - Vsn = rebar_test_utils:create_random_vsn(), - rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), - - Extra = filename:join([AppDir, "extra", "extra.erl"]), - ok = filelib:ensure_dir(Extra), - Src = io_lib:format("-module(extra).~n-export([x/0]).~nx() -> ok.", []), - ok = ec_file:write(Extra, Src), - - RebarConfig = [{erl_opts, [{extra_src_dirs, ["extra"]}]}], - - rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], {ok, [{app, Name}]}), - - %% check that `extra.erl` was compiled to the `ebin` dir - Ebin = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]), - true = filelib:is_file(filename:join([Ebin, "extra.beam"])), - - %% check that `extra.erl` is not in the `modules` key of the app - {ok, App} = file:consult(filename:join([AppDir, - "_build", - "default", - "lib", - Name, - "ebin", - Name ++ ".app"])), - [{application, _, KVs}] = App, - Mods = proplists:get_value(modules, KVs), - false = lists:member(extra, Mods). - -build_multi_apps(Config) -> - AppDir = ?config(apps, Config), - - Name1 = rebar_test_utils:create_random_name("app1_"), - Vsn1 = rebar_test_utils:create_random_vsn(), - rebar_test_utils:create_app(filename:join([AppDir,Name1]), Name1, Vsn1, [kernel, stdlib]), - Name2 = rebar_test_utils:create_random_name("app2_"), - Vsn2 = rebar_test_utils:create_random_vsn(), - rebar_test_utils:create_app(filename:join([AppDir,Name2]), Name2, Vsn2, [kernel, stdlib]), - - Extra1 = filename:join([AppDir, Name1, "extra", "extra1.erl"]), - ok = filelib:ensure_dir(Extra1), - Src1 = io_lib:format("-module(extra1).~n-export([x/0]).~nx() -> ok.", []), - ok = ec_file:write(Extra1, Src1), - - Extra2 = filename:join([AppDir, Name2, "extra", "extra2.erl"]), - ok = filelib:ensure_dir(Extra2), - Src2 = io_lib:format("-module(extra2).~n-export([x/0]).~nx() -> ok.", []), - ok = ec_file:write(Extra2, Src2), - - RebarConfig = [{erl_opts, [{extra_src_dirs, ["extra"]}]}], - - rebar_test_utils:run_and_check( - Config, RebarConfig, ["compile"], - {ok, [{app, Name1}, {app, Name2}]} - ), - - %% check that `extraX.erl` was compiled to the `ebin` dir - Ebin1 = filename:join([AppDir, "_build", "default", "lib", Name1, "ebin"]), - true = filelib:is_file(filename:join([Ebin1, "extra1.beam"])), - - Ebin2 = filename:join([AppDir, "_build", "default", "lib", Name2, "ebin"]), - true = filelib:is_file(filename:join([Ebin2, "extra2.beam"])), - - %% check that `extraX.erl` is not in the `modules` key of the app - {ok, App1} = file:consult(filename:join([AppDir, - "_build", - "default", - "lib", - Name1, - "ebin", - Name1 ++ ".app"])), - [{application, _, KVs1}] = App1, - Mods1 = proplists:get_value(modules, KVs1), - false = lists:member(extra1, Mods1), - - {ok, App2} = file:consult(filename:join([AppDir, - "_build", - "default", - "lib", - Name2, - "ebin", - Name2 ++ ".app"])), - [{application, _, KVs2}] = App2, - Mods2 = proplists:get_value(modules, KVs2), - false = lists:member(extra2, Mods2). - -src_dir_takes_precedence(Config) -> - AppDir = ?config(apps, Config), - - Name = rebar_test_utils:create_random_name("app1_"), - Vsn = rebar_test_utils:create_random_vsn(), - rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), - - Extra = filename:join([AppDir, "extra", "extra.erl"]), - ok = filelib:ensure_dir(Extra), - Src = io_lib:format("-module(extra).~n-export([x/0]).~nx() -> ok.", []), - ok = ec_file:write(Extra, Src), - - RebarConfig = [{erl_opts, [{src_dirs, ["src", "extra"]}, {extra_src_dirs, ["extra"]}]}], - - rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], {ok, [{app, Name}]}), - - %% check that `extra.erl` was compiled to the `ebin` dir - %% check that `extraX.erl` was compiled to the `ebin` dir - Ebin = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]), - true = filelib:is_file(filename:join([Ebin, "extra.beam"])), - - %% check that `extra.erl` is in the `modules` key of the app - {ok, App} = file:consult(filename:join([AppDir, - "_build", - "default", - "lib", - Name, - "ebin", - Name ++ ".app"])), - [{application, _, KVs}] = App, - Mods = proplists:get_value(modules, KVs), - true = lists:member(extra, Mods). \ No newline at end of file diff --git a/test/rebar_src_dirs_SUITE.erl b/test/rebar_src_dirs_SUITE.erl new file mode 100644 index 0000000..1804fbf --- /dev/null +++ b/test/rebar_src_dirs_SUITE.erl @@ -0,0 +1,239 @@ +-module(rebar_src_dirs_SUITE). + +-export([suite/0, + init_per_suite/1, + end_per_suite/1, + init_per_testcase/2, + end_per_testcase/2, + all/0, + src_dirs_at_root/1, + extra_src_dirs_at_root/1, + src_dirs_in_erl_opts/1, + extra_src_dirs_in_erl_opts/1, + src_dirs_at_root_and_in_erl_opts/1, + extra_src_dirs_at_root_and_in_erl_opts/1, + build_basic_app/1, + build_multi_apps/1, + src_dir_takes_precedence_over_extra/1]). + +-include_lib("common_test/include/ct.hrl"). + +suite() -> + []. + +init_per_suite(Config) -> + Config. + +end_per_suite(_Config) -> + ok. + +init_per_testcase(_, Config) -> + rebar_test_utils:init_rebar_state(Config). + +end_per_testcase(_, _Config) -> ok. + +all() -> + [src_dirs_at_root, extra_src_dirs_at_root, + src_dirs_in_erl_opts, extra_src_dirs_in_erl_opts, + src_dirs_at_root_and_in_erl_opts, extra_src_dirs_at_root_and_in_erl_opts, + build_basic_app, build_multi_apps, src_dir_takes_precedence_over_extra]. + +src_dirs_at_root(Config) -> + AppDir = ?config(apps, Config), + + Name = rebar_test_utils:create_random_name("app1_"), + Vsn = rebar_test_utils:create_random_vsn(), + rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), + + RebarConfig = [{src_dirs, ["foo", "bar", "baz"]}], + + {ok, State} = rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], return), + + ["foo", "bar", "baz"] = rebar_dir:src_dirs(State, []). + +extra_src_dirs_at_root(Config) -> + AppDir = ?config(apps, Config), + + Name = rebar_test_utils:create_random_name("app1_"), + Vsn = rebar_test_utils:create_random_vsn(), + rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), + + RebarConfig = [{extra_src_dirs, ["foo", "bar", "baz"]}], + + {ok, State} = rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], return), + + ["foo", "bar", "baz"] = rebar_dir:extra_src_dirs(State, []). + +src_dirs_in_erl_opts(Config) -> + AppDir = ?config(apps, Config), + + Name = rebar_test_utils:create_random_name("app1_"), + Vsn = rebar_test_utils:create_random_vsn(), + rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), + + RebarConfig = [{erl_opts, [{src_dirs, ["foo", "bar", "baz"]}]}], + + {ok, State} = rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], return), + + ["foo", "bar", "baz"] = rebar_dir:src_dirs(State, []). + +extra_src_dirs_in_erl_opts(Config) -> + AppDir = ?config(apps, Config), + + Name = rebar_test_utils:create_random_name("app1_"), + Vsn = rebar_test_utils:create_random_vsn(), + rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), + + RebarConfig = [{erl_opts, [{extra_src_dirs, ["foo", "bar", "baz"]}]}], + + {ok, State} = rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], return), + + ["foo", "bar", "baz"] = rebar_dir:extra_src_dirs(State, []). + +src_dirs_at_root_and_in_erl_opts(Config) -> + AppDir = ?config(apps, Config), + + Name = rebar_test_utils:create_random_name("app1_"), + Vsn = rebar_test_utils:create_random_vsn(), + rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), + + RebarConfig = [{erl_opts, [{src_dirs, ["foo", "bar"]}]}, {src_dirs, ["baz", "qux"]}], + + {ok, State} = rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], return), + + ["baz", "qux", "foo", "bar"] = rebar_dir:src_dirs(State, []). + +extra_src_dirs_at_root_and_in_erl_opts(Config) -> + AppDir = ?config(apps, Config), + + Name = rebar_test_utils:create_random_name("app1_"), + Vsn = rebar_test_utils:create_random_vsn(), + rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), + + RebarConfig = [{erl_opts, [{extra_src_dirs, ["foo", "bar"]}]}, {extra_src_dirs, ["baz", "qux"]}], + + {ok, State} = rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], return), + + ["baz", "qux", "foo", "bar"] = rebar_dir:extra_src_dirs(State, []). + +build_basic_app(Config) -> + AppDir = ?config(apps, Config), + + Name = rebar_test_utils:create_random_name("app1_"), + Vsn = rebar_test_utils:create_random_vsn(), + rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), + + Extra = filename:join([AppDir, "extra", "extra.erl"]), + ok = filelib:ensure_dir(Extra), + Src = io_lib:format("-module(extra).~n-export([x/0]).~nx() -> ok.", []), + ok = ec_file:write(Extra, Src), + + RebarConfig = [{erl_opts, [{extra_src_dirs, ["extra"]}]}], + + rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], {ok, [{app, Name}]}), + + %% check that `extra.erl` was compiled to the `ebin` dir + Ebin = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]), + true = filelib:is_file(filename:join([Ebin, "extra.beam"])), + + %% check that `extra.erl` is not in the `modules` key of the app + {ok, App} = file:consult(filename:join([AppDir, + "_build", + "default", + "lib", + Name, + "ebin", + Name ++ ".app"])), + [{application, _, KVs}] = App, + Mods = proplists:get_value(modules, KVs), + false = lists:member(extra, Mods). + +build_multi_apps(Config) -> + AppDir = ?config(apps, Config), + + Name1 = rebar_test_utils:create_random_name("app1_"), + Vsn1 = rebar_test_utils:create_random_vsn(), + rebar_test_utils:create_app(filename:join([AppDir,Name1]), Name1, Vsn1, [kernel, stdlib]), + Name2 = rebar_test_utils:create_random_name("app2_"), + Vsn2 = rebar_test_utils:create_random_vsn(), + rebar_test_utils:create_app(filename:join([AppDir,Name2]), Name2, Vsn2, [kernel, stdlib]), + + Extra1 = filename:join([AppDir, Name1, "extra", "extra1.erl"]), + ok = filelib:ensure_dir(Extra1), + Src1 = io_lib:format("-module(extra1).~n-export([x/0]).~nx() -> ok.", []), + ok = ec_file:write(Extra1, Src1), + + Extra2 = filename:join([AppDir, Name2, "extra", "extra2.erl"]), + ok = filelib:ensure_dir(Extra2), + Src2 = io_lib:format("-module(extra2).~n-export([x/0]).~nx() -> ok.", []), + ok = ec_file:write(Extra2, Src2), + + RebarConfig = [{erl_opts, [{extra_src_dirs, ["extra"]}]}], + + rebar_test_utils:run_and_check( + Config, RebarConfig, ["compile"], + {ok, [{app, Name1}, {app, Name2}]} + ), + + %% check that `extraX.erl` was compiled to the `ebin` dir + Ebin1 = filename:join([AppDir, "_build", "default", "lib", Name1, "ebin"]), + true = filelib:is_file(filename:join([Ebin1, "extra1.beam"])), + + Ebin2 = filename:join([AppDir, "_build", "default", "lib", Name2, "ebin"]), + true = filelib:is_file(filename:join([Ebin2, "extra2.beam"])), + + %% check that `extraX.erl` is not in the `modules` key of the app + {ok, App1} = file:consult(filename:join([AppDir, + "_build", + "default", + "lib", + Name1, + "ebin", + Name1 ++ ".app"])), + [{application, _, KVs1}] = App1, + Mods1 = proplists:get_value(modules, KVs1), + false = lists:member(extra1, Mods1), + + {ok, App2} = file:consult(filename:join([AppDir, + "_build", + "default", + "lib", + Name2, + "ebin", + Name2 ++ ".app"])), + [{application, _, KVs2}] = App2, + Mods2 = proplists:get_value(modules, KVs2), + false = lists:member(extra2, Mods2). + +src_dir_takes_precedence_over_extra(Config) -> + AppDir = ?config(apps, Config), + + Name = rebar_test_utils:create_random_name("app1_"), + Vsn = rebar_test_utils:create_random_vsn(), + rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), + + Extra = filename:join([AppDir, "extra", "extra.erl"]), + ok = filelib:ensure_dir(Extra), + Src = io_lib:format("-module(extra).~n-export([x/0]).~nx() -> ok.", []), + ok = ec_file:write(Extra, Src), + + RebarConfig = [{erl_opts, [{src_dirs, ["src", "extra"]}, {extra_src_dirs, ["extra"]}]}], + + rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], {ok, [{app, Name}]}), + + %% check that `extra.erl` was compiled to the `ebin` dir + %% check that `extraX.erl` was compiled to the `ebin` dir + Ebin = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]), + true = filelib:is_file(filename:join([Ebin, "extra.beam"])), + + %% check that `extra.erl` is in the `modules` key of the app + {ok, App} = file:consult(filename:join([AppDir, + "_build", + "default", + "lib", + Name, + "ebin", + Name ++ ".app"])), + [{application, _, KVs}] = App, + Mods = proplists:get_value(modules, KVs), + true = lists:member(extra, Mods). \ No newline at end of file -- cgit v1.1