summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTristan Sloughter <tristan.sloughter@gmail.com>2015-03-05 13:40:47 -0600
committerTristan Sloughter <tristan.sloughter@gmail.com>2015-03-05 13:40:47 -0600
commit7e608a4c9ad50c54df69b859da9ba2e507f39cc4 (patch)
treedd35e4eed77379d444cf8478c05d03c272df9ede
parent3355e848b5b05b38120d5e6cbca7f415447aad5a (diff)
parentccfebdd1552128ef74841f12b3bf0ff3616ee40e (diff)
Merge pull request #222 from talentdeficit/no_superfluous_loads
switch from loading modules to read compile info to using `beam_lib`
-rw-r--r--src/rebar_erlc_compiler.erl29
-rw-r--r--src/rebar_otp_app.erl22
-rw-r--r--test/rebar_compile_SUITE.erl14
-rw-r--r--test/rebar_eunit_SUITE.erl6
4 files changed, 25 insertions, 46 deletions
diff --git a/src/rebar_erlc_compiler.erl b/src/rebar_erlc_compiler.erl
index c757511..a113fc4 100644
--- a/src/rebar_erlc_compiler.erl
+++ b/src/rebar_erlc_compiler.erl
@@ -256,24 +256,21 @@ needs_compile(Source, Target, Opts, Parents) ->
source_changed(TargetLastMod, I) -> TargetLastMod < filelib:last_modified(I).
-opts_changed(Opts, Target) ->
- Basename = filename:basename(Target, ".beam"),
- Dirname = filename:dirname(Target),
- ObjectFile = filename:join([Dirname, Basename]),
- _ = purge(list_to_atom(Basename)),
- case code:load_abs(ObjectFile) of
- {module, Mod} ->
- Compile = Mod:module_info(compile),
- lists:sort(Opts) =/= lists:sort(proplists:get_value(options,
- Compile));
- {error, nofile} -> false
+opts_changed(NewOpts, Target) ->
+ case compile_info(Target) of
+ {ok, Opts} -> lists:sort(Opts) =/= lists:sort(NewOpts);
+ _ -> true
end.
-purge(Mod) ->
- %% remove old code if necessary
- _ = code:purge(Mod),
- %% move current code to old
- _ = code:delete(Mod).
+compile_info(Target) ->
+ case beam_lib:chunks(Target, [compile_info]) of
+ {ok, {_mod, Chunks}} ->
+ CompileInfo = proplists:get_value(compile_info, Chunks, []),
+ {ok, proplists:get_value(options, CompileInfo, [])};
+ {error, beam_lib, Reason} ->
+ ?WARN("Couldn't read debug info from ~p for reason: ~p", [Target, Reason]),
+ {error, Reason}
+ end.
check_erlcinfo(_Config, #erlcinfo{vsn=?ERLCINFO_VSN}) ->
ok;
diff --git a/src/rebar_otp_app.erl b/src/rebar_otp_app.erl
index e850e58..2b5f682 100644
--- a/src/rebar_otp_app.erl
+++ b/src/rebar_otp_app.erl
@@ -166,23 +166,15 @@ ebin_modules(App, Dir) ->
[rebar_utils:beam_to_mod(N) || N <- Filtered].
beam_src(Beam) ->
- try
- Mod = list_to_atom(filename:basename(Beam, ".beam")),
- _ = purge(Mod),
- {module, Mod} = code:load_abs(filename:rootname(Beam, ".beam")),
- Compile = Mod:module_info(compile),
- proplists:get_value(source, Compile, [])
- catch
- error:undef -> [];
- error:nofile -> []
+ case beam_lib:chunks(Beam, [compile_info]) of
+ {ok, {_mod, Chunks}} ->
+ CompileInfo = proplists:get_value(compile_info, Chunks, []),
+ proplists:get_value(source, CompileInfo, []);
+ {error, beam_lib, Reason} ->
+ ?WARN("Couldn't read debug info from ~p for reason: ~p", [Beam, Reason]),
+ []
end.
-purge(Mod) ->
- %% remove old code if necessary
- _ = code:purge(Mod),
- %% move current code to old
- _ = code:delete(Mod).
-
ensure_registered(AppData) ->
case lists:keyfind(registered, 1, AppData) of
false ->
diff --git a/test/rebar_compile_SUITE.erl b/test/rebar_compile_SUITE.erl
index 368ba98..b42b6b7 100644
--- a/test/rebar_compile_SUITE.erl
+++ b/test/rebar_compile_SUITE.erl
@@ -11,8 +11,7 @@
build_checkout_deps/1,
recompile_when_opts_change/1,
dont_recompile_when_opts_dont_change/1,
- dont_recompile_yrl_or_xrl/1,
- purge_before_load/1]).
+ dont_recompile_yrl_or_xrl/1]).
-include_lib("common_test/include/ct.hrl").
-include_lib("eunit/include/eunit.hrl").
@@ -34,7 +33,7 @@ all() ->
[build_basic_app, build_release_apps,
build_checkout_apps, build_checkout_deps,
recompile_when_opts_change, dont_recompile_when_opts_dont_change,
- dont_recompile_yrl_or_xrl, purge_before_load].
+ dont_recompile_yrl_or_xrl].
build_basic_app(Config) ->
AppDir = ?config(apps, Config),
@@ -185,12 +184,3 @@ dont_recompile_yrl_or_xrl(Config) ->
?assert(ModTime == NewModTime).
-purge_before_load(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]),
-
- Tasks = ["do", "compile,compile,compile"],
- rebar_test_utils:run_and_check(Config, [], Tasks, {ok, [{app, Name}]}).
diff --git a/test/rebar_eunit_SUITE.erl b/test/rebar_eunit_SUITE.erl
index 190fbfa..d2d8608 100644
--- a/test/rebar_eunit_SUITE.erl
+++ b/test/rebar_eunit_SUITE.erl
@@ -21,7 +21,7 @@ end_per_suite(_Config) ->
ok.
init_per_testcase(_, Config) ->
- rebar_test_utils:init_rebar_state(Config).
+ rebar_test_utils:init_rebar_state(Config, "eunit_").
all() ->
[test_basic_app].
@@ -29,9 +29,9 @@ all() ->
test_basic_app(Config) ->
AppDir = ?config(apps, Config),
- Name = rebar_test_utils:create_random_name("eunit_"),
+ Name = rebar_test_utils:create_random_name("basic_"),
Vsn = rebar_test_utils:create_random_vsn(),
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
-
+
RebarConfig = [{erl_opts, [{d, some_define}]}],
rebar_test_utils:run_and_check(Config, RebarConfig, ["eunit"], {ok, [{app, Name}]}).