diff options
| -rw-r--r-- | src/rebar_erlc_compiler.erl | 10 | ||||
| -rw-r--r-- | src/rebar_prv_common_test.erl | 3 | ||||
| -rw-r--r-- | src/rebar_prv_compile.erl | 12 | ||||
| -rw-r--r-- | src/rebar_prv_eunit.erl | 3 | ||||
| -rw-r--r-- | test/rebar_compile_SUITE.erl | 27 | 
5 files changed, 43 insertions, 12 deletions
| diff --git a/src/rebar_erlc_compiler.erl b/src/rebar_erlc_compiler.erl index a113fc4..0ea09dc 100644 --- a/src/rebar_erlc_compiler.erl +++ b/src/rebar_erlc_compiler.erl @@ -26,7 +26,8 @@  %% -------------------------------------------------------------------  -module(rebar_erlc_compiler). --export([compile/3, +-export([compile/2, +         compile/3,           clean/2]).  -include("rebar.hrl"). @@ -79,6 +80,10 @@  %%                           'old_inets'}]}.  %% +-spec compile(rebar_state:t(), file:name()) -> 'ok'. +compile(Config, Dir) -> +    compile(Config, Dir, filename:join([Dir, "ebin"])). +  -spec compile(rebar_state:t(), file:name(), file:name()) -> 'ok'.  compile(Config, Dir, OutDir) ->      rebar_base_compiler:run(Config, @@ -133,8 +138,7 @@ doterl_compile(State, Dir, ODir) ->      ErlOpts = rebar_utils:erl_opts(State),      doterl_compile(State, Dir, ODir, [], ErlOpts). -doterl_compile(Config, Dir, ODir, MoreSources, ErlOpts) -> -    OutDir = filename:join(ODir, "ebin"), +doterl_compile(Config, Dir, OutDir, MoreSources, ErlOpts) ->      ErlFirstFilesConf = rebar_state:get(Config, erl_first_files, []),      ?DEBUG("erl_opts ~p", [ErlOpts]),      %% Support the src_dirs option allowing multiple directories to diff --git a/src/rebar_prv_common_test.erl b/src/rebar_prv_common_test.erl index bd799fa..2fa2e28 100644 --- a/src/rebar_prv_common_test.erl +++ b/src/rebar_prv_common_test.erl @@ -370,7 +370,6 @@ compile_tests(State, TestApps, InDirs) ->                  AppState          end,          ok = rebar_erlc_compiler:compile(replace_src_dirs(S, InDirs), -                                         ec_cnv:to_list(rebar_app_info:dir(AppInfo)),                                           ec_cnv:to_list(rebar_app_info:out_dir(AppInfo)))      end,      lists:foreach(F, TestApps), @@ -382,7 +381,7 @@ compile_bare_tests(State, TestApps, InDirs) ->          %% compile just the `test` directory of the base dir          [] -> rebar_erlc_compiler:compile(replace_src_dirs(State, InDirs),                                            rebar_dir:get_cwd(), -                                          rebar_dir:base_dir(State)); +                                          filename:join([rebar_dir:base_dir(State), "ebin"]));          %% already compiled `./test` so do nothing          _  -> ok      end. diff --git a/src/rebar_prv_compile.erl b/src/rebar_prv_compile.erl index 7c6802d..937b9bf 100644 --- a/src/rebar_prv_compile.erl +++ b/src/rebar_prv_compile.erl @@ -71,7 +71,7 @@ build_app(State, AppInfo) ->      AppDir = rebar_app_info:dir(AppInfo),      OutDir = rebar_app_info:out_dir(AppInfo), -    copy_app_dirs(AppDir, OutDir), +    copy_app_dirs(State, AppDir, OutDir),      S = case rebar_app_info:state(AppInfo) of              undefined -> @@ -91,7 +91,7 @@ build_app(State, AppInfo) ->  compile(State, AppInfo) ->      ?INFO("Compiling ~s", [rebar_app_info:name(AppInfo)]), -    rebar_erlc_compiler:compile(State, ec_cnv:to_list(rebar_app_info:dir(AppInfo)), ec_cnv:to_list(rebar_app_info:out_dir(AppInfo))), +    rebar_erlc_compiler:compile(State, ec_cnv:to_list(rebar_app_info:out_dir(AppInfo))),      case rebar_otp_app:compile(State, AppInfo) of          {ok, AppInfo1} ->              AppInfo1; @@ -108,7 +108,7 @@ handle_args(State) ->      Jobs = proplists:get_value(jobs, Args, ?DEFAULT_JOBS),      {ok, rebar_state:set(State, jobs, Jobs)}. -copy_app_dirs(OldAppDir, AppDir) -> +copy_app_dirs(State, OldAppDir, AppDir) ->      case ec_cnv:to_binary(filename:absname(OldAppDir)) =/=          ec_cnv:to_binary(filename:absname(AppDir)) of          true -> @@ -123,8 +123,10 @@ copy_app_dirs(OldAppDir, AppDir) ->                      ok              end,              filelib:ensure_dir(filename:join(AppDir, "dummy")), -            %% link to src to be adjacent to ebin is needed for R15 use of cover/xref -            [symlink_or_copy(OldAppDir, AppDir, Dir) || Dir <- ["priv", "include", "src", "test"]]; +            %% link to src_dirs to be adjacent to ebin is needed for R15 use of cover/xref +            ErlOpts = rebar_utils:erl_opts(State), +            SrcDirs = proplists:get_value(src_dirs, ErlOpts, ["src"]), +            [symlink_or_copy(OldAppDir, AppDir, Dir) || Dir <- ["priv", "include", "test"] ++ SrcDirs];          false ->              ok      end. diff --git a/src/rebar_prv_eunit.erl b/src/rebar_prv_eunit.erl index 7ea5ced..1540471 100644 --- a/src/rebar_prv_eunit.erl +++ b/src/rebar_prv_eunit.erl @@ -137,7 +137,6 @@ compile_tests(State, TestApps) ->                  AppState          end,          ok = rebar_erlc_compiler:compile(replace_src_dirs(S), -                                         ec_cnv:to_list(rebar_app_info:dir(AppInfo)),                                           ec_cnv:to_list(rebar_app_info:out_dir(AppInfo)))      end,      lists:foreach(F, TestApps), @@ -149,7 +148,7 @@ compile_bare_tests(State, TestApps) ->          %% compile just the `test` directory of the base dir          [] -> rebar_erlc_compiler:compile(replace_src_dirs(State),                                            rebar_dir:get_cwd(), -                                          rebar_dir:base_dir(State)); +                                          filename:join([rebar_dir:base_dir(State), "ebin"]));          %% already compiled `./test` so do nothing          _  -> ok      end. diff --git a/test/rebar_compile_SUITE.erl b/test/rebar_compile_SUITE.erl index b42b6b7..2c5a11f 100644 --- a/test/rebar_compile_SUITE.erl +++ b/test/rebar_compile_SUITE.erl @@ -9,6 +9,7 @@           build_release_apps/1,           build_checkout_apps/1,           build_checkout_deps/1, +         build_all_srcdirs/1,           recompile_when_opts_change/1,           dont_recompile_when_opts_dont_change/1,           dont_recompile_yrl_or_xrl/1]). @@ -32,6 +33,7 @@ init_per_testcase(_, Config) ->  all() ->      [build_basic_app, build_release_apps,       build_checkout_apps, build_checkout_deps, +     build_all_srcdirs,       recompile_when_opts_change, dont_recompile_when_opts_dont_change,       dont_recompile_yrl_or_xrl]. @@ -94,6 +96,31 @@ build_checkout_deps(Config) ->      Loaded = application:loaded_applications(),      {_, _, Vsn2} = lists:keyfind(list_to_atom(Name2), 1, Loaded). +build_all_srcdirs(Config) -> +    AppDir = ?config(apps, Config), + +    RebarConfig = [{erl_opts, [{src_dirs, ["src", "extra"]}]}], + +    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]), + +    ExtraSrc = <<"-module(extra_src).\n" +        "-export([ok/0]).\n" +        "ok() -> ok.\n">>, + +    ok = filelib:ensure_dir(filename:join([AppDir, "extra", "dummy"])), +    ok = file:write_file(filename:join([AppDir, "extra", "extra_src.erl"]), ExtraSrc), + +    rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], {ok, [{app, Name}]}), + +    %% check a beam corresponding to the src in the extra src_dir exists in ebin +    EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]), +    true = filelib:is_file(filename:join([EbinDir, "extra_src.beam"])), + +    %% check the extra src_dir was linked into the _build dir +    true = filelib:is_dir(filename:join([AppDir, "_build", "default", "lib", Name, "extra"])). +  recompile_when_opts_change(Config) ->      AppDir = ?config(apps, Config), | 
