Преглед на файлове

Parse transforms and behaviours are compiled first

The previous code in rebar that was trying to ensure that parse
transforms and behaviours were compiled first doesn't work with multiple
compiler workers because of the possiblity of one of the workers
compiling a file that needs a parse transform or a behaviour at the same
time another worker is compiling that same parse transform or behaviour.

The solution this patch implements is to append any parse transforms and
any behaviours (in that order) to erl_first_files to ensure that they
are compiled before any regular files. This patch won't break any
currently working uses of erl_first files because we only append to the
list, so anything in erl_first_files is still compiled before anything
else.
Andrew Thompson преди 14 години
родител
ревизия
1bf45036dc
променени са 1 файла, в които са добавени 18 реда и са изтрити 8 реда
  1. +18
    -8
      src/rebar_erlc_compiler.erl

+ 18
- 8
src/rebar_erlc_compiler.erl Целия файл

@ -110,17 +110,27 @@ doterl_compile(Config, OutDir, MoreSources) ->
RestErls = [Source || Source <- gather_src(SrcDirs, []) ++ MoreSources,
lists:member(Source, FirstErls) == false],
% Sort RestErls so that parse_transforms and behaviours are first
% Split RestErls so that parse_transforms and behaviours are instead added
% to erl_first_files, parse transforms first.
% This should probably be somewhat combined with inspect_epp
SortedRestErls = [K || {K, _V} <- lists:keysort(2,
[{F, compile_priority(F)} || F <- RestErls ])],
[ParseTransforms, Behaviours, OtherErls] = lists:foldl(fun(F, [A, B, C]) ->
case compile_priority(F) of
parse_transform ->
[[F | A], B, C];
behaviour ->
[A, [F | B], C];
_ ->
[A, B, [F | C]]
end
end, [[], [], []], RestErls),
NewFirstErls = FirstErls ++ ParseTransforms ++ Behaviours,
%% Make sure that ebin/ exists and is on the path
ok = filelib:ensure_dir(filename:join("ebin", "dummy.beam")),
CurrPath = code:get_path(),
code:add_path("ebin"),
rebar_base_compiler:run(Config, FirstErls, SortedRestErls,
rebar_base_compiler:run(Config, NewFirstErls, OtherErls,
fun(S, C) -> internal_erl_compile(S, C, OutDir,
ErlOpts)
end),
@ -297,11 +307,11 @@ compile_priority(File) ->
F2 = fun({tree,arity_qualifier,_,
{arity_qualifier,{tree,atom,_,behaviour_info},
{tree,integer,_,1}}}, _) ->
2;
behaviour;
({tree,arity_qualifier,_,
{arity_qualifier,{tree,atom,_,parse_transform},
{tree,integer,_,2}}}, _) ->
1;
parse_transform;
(_, Acc) ->
Acc
end,
@ -313,7 +323,7 @@ compile_priority(File) ->
Acc
end,
lists:foldl(F, 10, Trees)
lists:foldl(F, normal, Trees)
end.
%%

Зареждане…
Отказ
Запис