Selaa lähdekoodia

Merge pull request #176 from talentdeficit/no_unescessary_yrl_xrl_recompile

don't unescessarily recompile yrl/xrl files
pull/177/head
Tristan Sloughter 10 vuotta sitten
vanhempi
commit
4153b3c7e5
2 muutettua tiedostoa jossa 53 lisäystä ja 6 poistoa
  1. +10
    -4
      src/rebar_erlc_compiler.erl
  2. +43
    -2
      test/rebar_compile_SUITE.erl

+ 10
- 4
src/rebar_erlc_compiler.erl Näytä tiedosto

@ -265,14 +265,20 @@ opts_changed(Opts, Target) ->
case code:load_abs(ObjectFile) of
{module, Mod} ->
Compile = Mod:module_info(compile),
%% dialyzer and eunit have trouble without the next two lines
code:delete(Mod),
code:purge(Mod),
_ = purge(Mod),
lists:sort(Opts) =/= lists:sort(proplists:get_value(options,
Compile));
{error, _} -> true
{error, nofile} -> false
end.
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).
check_erlcinfo(_Config, #erlcinfo{vsn=?ERLCINFO_VSN}) ->
ok;
check_erlcinfo(Config, #erlcinfo{vsn=Vsn}) ->

+ 43
- 2
test/rebar_compile_SUITE.erl Näytä tiedosto

@ -10,7 +10,8 @@
build_checkout_apps/1,
build_checkout_deps/1,
recompile_when_opts_change/1,
dont_recompile_when_opts_dont_change/1]).
dont_recompile_when_opts_dont_change/1,
dont_recompile_yrl_or_xrl/1]).
-include_lib("common_test/include/ct.hrl").
-include_lib("eunit/include/eunit.hrl").
@ -31,7 +32,8 @@ init_per_testcase(_, Config) ->
all() ->
[build_basic_app, build_release_apps,
build_checkout_apps, build_checkout_deps,
recompile_when_opts_change, dont_recompile_when_opts_dont_change].
recompile_when_opts_change, dont_recompile_when_opts_dont_change,
dont_recompile_yrl_or_xrl].
build_basic_app(Config) ->
AppDir = ?config(apps, Config),
@ -141,4 +143,43 @@ dont_recompile_when_opts_dont_change(Config) ->
NewModTime = [filelib:last_modified(filename:join([EbinDir, F]))
|| F <- NewFiles, filename:extension(F) == ".beam"],
?assert(ModTime == NewModTime).
dont_recompile_yrl_or_xrl(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]),
Xrl = filename:join([AppDir, "src", "not_a_real_xrl_" ++ Name ++ ".xrl"]),
ok = filelib:ensure_dir(Xrl),
XrlBody =
"Definitions."
"\n\n"
"D = [0-9]"
"\n\n"
"Rules."
"\n\n"
"{D}+ :"
" {token,{integer,TokenLine,list_to_integer(TokenChars)}}."
"\n\n"
"{D}+\\.{D}+((E|e)(\\+|\\-)?{D}+)? :"
" {token,{float,TokenLine,list_to_float(TokenChars)}}."
"\n\n"
"Erlang code.",
ok = ec_file:write(Xrl, XrlBody),
XrlBeam = filename:join([AppDir, "ebin", filename:basename(Xrl, ".xrl") ++ ".beam"]),
rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
ModTime = filelib:last_modified(XrlBeam),
timer:sleep(1000),
rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
NewModTime = filelib:last_modified(XrlBeam),
?assert(ModTime == NewModTime).

Ladataan…
Peruuta
Tallenna