Skip to content

Commit

Permalink
Merge pull request #1938 from erlang/xrl-yrl-recompile
Browse files Browse the repository at this point in the history
check last modified time on erl files for xrl and yrl files before compiling
  • Loading branch information
ferd authored Nov 18, 2018
2 parents 62663bc + beb8878 commit 9c24f55
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 18 deletions.
14 changes: 12 additions & 2 deletions src/rebar_compiler.erl
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
-export([compile_all/2,
clean/2,

needs_compile/3,
ok_tuple/2,
error_tuple/4,
maybe_report/1,
Expand All @@ -18,7 +19,8 @@
include_dirs => [file:dirname()],
src_ext => extension(),
out_mappings => out_mappings()}.
-callback needed_files(digraph:graph(), [file:filename()], rebar_app_info:t()) -> [file:filename()].
-callback needed_files(digraph:graph(), [file:filename()], out_mappings(),
rebar_app_info:t()) -> [file:filename()].
-callback dependencies(file:filename(), file:dirname(), [file:dirname()]) -> [file:filename()].
-callback compile(file:filename(), out_mappings(), rebar_dict(), list()) ->
ok | {ok, [string()]} | {ok, [string()], [string()]}.
Expand Down Expand Up @@ -66,7 +68,8 @@ run(CompilerMod, AppInfo) ->
OutDir = rebar_app_info:out_dir(AppInfo),
AbsSrcDirs = [filename:join(BaseDir, SrcDir) || SrcDir <- SrcDirs],
G = init_dag(CompilerMod, AbsInclDirs, AbsSrcDirs, FoundFiles, OutDir, EbinDir),
{{FirstFiles, FirstFileOpts}, {RestFiles, Opts}} = CompilerMod:needed_files(G, FoundFiles, AppInfo),
{{FirstFiles, FirstFileOpts}, {RestFiles, Opts}} = CompilerMod:needed_files(G, FoundFiles,
Mappings, AppInfo),
true = digraph:delete(G),

compile_each(FirstFiles, FirstFileOpts, BaseOpts, Mappings, CompilerMod),
Expand Down Expand Up @@ -111,6 +114,13 @@ clean_(CompilerMod, AppInfo) ->
CompilerMod:clean(FoundFiles, AppInfo),
rebar_file_utils:rm_rf(dag_file(CompilerMod, EbinDir)).

-spec needs_compile(filename:all(), extension(), [{extension(), file:dirname()}]) -> boolean().
needs_compile(Source, OutExt, Mappings) ->
Ext = filename:extension(Source),
BaseName = filename:basename(Source, Ext),
{_, OutDir} = lists:keyfind(OutExt, 1, Mappings),
Target = filename:join(OutDir, BaseName++OutExt),
filelib:last_modified(Source) > filelib:last_modified(Target).

run_on_extra_src_dirs(CompilerMod, AppInfo, Fun) ->
ExtraDirs = rebar_dir:extra_src_dirs(rebar_app_info:opts(AppInfo), []),
Expand Down
4 changes: 2 additions & 2 deletions src/rebar_compiler_erl.erl
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
-behaviour(rebar_compiler).

-export([context/1,
needed_files/3,
needed_files/4,
dependencies/3,
compile/4,
clean/2]).
Expand Down Expand Up @@ -31,7 +31,7 @@ context(AppInfo) ->
out_mappings => Mappings}.


needed_files(Graph, FoundFiles, AppInfo) ->
needed_files(Graph, FoundFiles, _, AppInfo) ->
OutDir = rebar_app_info:out_dir(AppInfo),
Dir = rebar_app_info:dir(AppInfo),
EbinDir = rebar_app_info:ebin_dir(AppInfo),
Expand Down
4 changes: 2 additions & 2 deletions src/rebar_compiler_mib.erl
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
-behaviour(rebar_compiler).

-export([context/1,
needed_files/3,
needed_files/4,
dependencies/3,
compile/4,
clean/2]).
Expand All @@ -21,7 +21,7 @@ context(AppInfo) ->
src_ext => ".mib",
out_mappings => Mappings}.

needed_files(_, FoundFiles, AppInfo) ->
needed_files(_, FoundFiles, _, AppInfo) ->
FirstFiles = [],

%% Remove first files from found files
Expand Down
8 changes: 5 additions & 3 deletions src/rebar_compiler_xrl.erl
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
-behaviour(rebar_compiler).

-export([context/1,
needed_files/3,
needed_files/4,
dependencies/3,
compile/4,
clean/2]).
Expand All @@ -16,11 +16,13 @@ context(AppInfo) ->
src_ext => ".xrl",
out_mappings => Mappings}.

needed_files(_, FoundFiles, AppInfo) ->
needed_files(_, FoundFiles, Mappings, AppInfo) ->
FirstFiles = [],

%% Remove first files from found files
RestFiles = [Source || Source <- FoundFiles, not lists:member(Source, FirstFiles)],
RestFiles = [Source || Source <- FoundFiles,
not lists:member(Source, FirstFiles),
rebar_compiler:needs_compile(Source, ".erl", Mappings)],

Opts = rebar_opts:get(rebar_app_info:opts(AppInfo), xrl_opts, []),

Expand Down
8 changes: 5 additions & 3 deletions src/rebar_compiler_yrl.erl
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
-behaviour(rebar_compiler).

-export([context/1,
needed_files/3,
needed_files/4,
dependencies/3,
compile/4,
clean/2]).
Expand All @@ -16,11 +16,13 @@ context(AppInfo) ->
src_ext => ".yrl",
out_mappings => Mappings}.

needed_files(_, FoundFiles, AppInfo) ->
needed_files(_, FoundFiles, Mappings, AppInfo) ->
FirstFiles = [],

%% Remove first files from found files
RestFiles = [Source || Source <- FoundFiles, not lists:member(Source, FirstFiles)],
RestFiles = [Source || Source <- FoundFiles,
not lists:member(Source, FirstFiles),
rebar_compiler:needs_compile(Source, ".erl", Mappings)],

Opts = rebar_opts:get(rebar_app_info:opts(AppInfo), yrl_opts, []),
{{FirstFiles, Opts}, {RestFiles, Opts}}.
Expand Down
25 changes: 19 additions & 6 deletions test/rebar_compile_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -845,20 +845,33 @@ dont_recompile_yrl_or_xrl(Config) ->
"F -> number : '$1'.\n"],
ok = ec_file:write(Yrl, YrlBody),

XrlBeam = filename:join([AppDir, "ebin", filename:basename(Xrl, ".xrl") ++ ".beam"]),
YrlBeam = filename:join([AppDir, "ebin", filename:basename(Yrl, ".yrl") ++ ".beam"]),
XrlErl = filename:join([AppDir, "src", filename:basename(Xrl, ".xrl") ++ ".erl"]),
YrlErl = filename:join([AppDir, "src", filename:basename(Yrl, ".yrl") ++ ".erl"]),

EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]),
XrlBeam = filename:join([EbinDir, filename:basename(Xrl, ".xrl") ++ ".beam"]),
YrlBeam = filename:join([EbinDir, filename:basename(Yrl, ".yrl") ++ ".beam"]),

rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),

XrlModTime = filelib:last_modified(XrlBeam),
YrlModTime = filelib:last_modified(YrlBeam),
XrlModTime = filelib:last_modified(XrlErl),
YrlModTime = filelib:last_modified(YrlErl),

XrlBeamModTime = filelib:last_modified(XrlBeam),
YrlBeamModTime = filelib:last_modified(YrlBeam),

timer:sleep(1000),

rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),

NewXrlModTime = filelib:last_modified(XrlBeam),
NewYrlModTime = filelib:last_modified(YrlBeam),
NewXrlModTime = filelib:last_modified(XrlErl),
NewYrlModTime = filelib:last_modified(YrlErl),

NewXrlBeamModTime = filelib:last_modified(XrlBeam),
NewYrlBeamModTime = filelib:last_modified(YrlBeam),

?assert(XrlBeamModTime == NewXrlBeamModTime),
?assert(YrlBeamModTime == NewYrlBeamModTime),

?assert(XrlModTime == NewXrlModTime),
?assert(YrlModTime == NewYrlModTime).
Expand Down

0 comments on commit 9c24f55

Please sign in to comment.