summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/rebar_erlc_compiler.erl10
-rw-r--r--src/rebar_prv_common_test.erl3
-rw-r--r--src/rebar_prv_compile.erl12
-rw-r--r--src/rebar_prv_eunit.erl3
-rw-r--r--test/rebar_compile_SUITE.erl27
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),