diff options
-rw-r--r-- | src/rebar_erlc_compiler.erl | 6 | ||||
-rw-r--r-- | src/rebar_otp_app.erl | 12 | ||||
-rw-r--r-- | test/rebar_compile_SUITE.erl | 15 |
3 files changed, 23 insertions, 10 deletions
diff --git a/src/rebar_erlc_compiler.erl b/src/rebar_erlc_compiler.erl index 9157e2a..c757511 100644 --- a/src/rebar_erlc_compiler.erl +++ b/src/rebar_erlc_compiler.erl @@ -260,10 +260,10 @@ 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), - _ = purge(Mod), lists:sort(Opts) =/= lists:sort(proplists:get_value(options, Compile)); {error, nofile} -> false @@ -273,9 +273,7 @@ purge(Mod) -> %% remove old code if necessary _ = code:purge(Mod), %% move current code to old - true = code:delete(Mod), - %% remove new old code - _ = code:purge(Mod). + _ = code:delete(Mod). check_erlcinfo(_Config, #erlcinfo{vsn=?ERLCINFO_VSN}) -> ok; diff --git a/src/rebar_otp_app.erl b/src/rebar_otp_app.erl index 36af4cd..e850e58 100644 --- a/src/rebar_otp_app.erl +++ b/src/rebar_otp_app.erl @@ -167,18 +167,22 @@ ebin_modules(App, Dir) -> 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), - %% completely purge module so any other attempts to load it succeed - _ = code:purge(Mod), - _ = code:delete(Mod), - _ = code:purge(Mod), proplists:get_value(source, Compile, []) catch error:undef -> []; error:nofile -> [] 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 924ce5c..368ba98 100644 --- a/test/rebar_compile_SUITE.erl +++ b/test/rebar_compile_SUITE.erl @@ -11,7 +11,8 @@ build_checkout_deps/1, recompile_when_opts_change/1, dont_recompile_when_opts_dont_change/1, - dont_recompile_yrl_or_xrl/1]). + dont_recompile_yrl_or_xrl/1, + purge_before_load/1]). -include_lib("common_test/include/ct.hrl"). -include_lib("eunit/include/eunit.hrl"). @@ -33,7 +34,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]. + dont_recompile_yrl_or_xrl, purge_before_load]. build_basic_app(Config) -> AppDir = ?config(apps, Config), @@ -183,3 +184,13 @@ dont_recompile_yrl_or_xrl(Config) -> NewModTime = filelib:last_modified(XrlBeam), ?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}]}). |