diff options
| -rw-r--r-- | src/rebar_erlc_compiler.erl | 29 | ||||
| -rw-r--r-- | src/rebar_otp_app.erl | 22 | ||||
| -rw-r--r-- | test/rebar_compile_SUITE.erl | 14 | ||||
| -rw-r--r-- | test/rebar_eunit_SUITE.erl | 6 | 
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}]}). | 
