diff options
| author | alisdair sullivan <alisdairsullivan@yahoo.ca> | 2016-09-20 02:27:41 -0700 | 
|---|---|---|
| committer | alisdair sullivan <alisdairsullivan@yahoo.ca> | 2016-09-20 02:27:41 -0700 | 
| commit | dad7900d31fc2744c9d6b877f1a859f1f940cc39 (patch) | |
| tree | 3b2845ecab4d07edce308f5835d026736b689e18 /src | |
| parent | fb363cd8de68e9113e407ac0be049cacdd9ddd07 (diff) | |
recompile all files when a parse transform given as an opt needs updating
there's no way to detect which files actually rely on a parse transform
passed to the compiler via the options (as opposed to `-compile(..)`
so if any parse transforms are in modules that need recompiling just
recompile the world
fixes #1328
Diffstat (limited to 'src')
| -rw-r--r-- | src/rebar_erlc_compiler.erl | 16 | 
1 files changed, 15 insertions, 1 deletions
| diff --git a/src/rebar_erlc_compiler.erl b/src/rebar_erlc_compiler.erl index 167f2bb..b148172 100644 --- a/src/rebar_erlc_compiler.erl +++ b/src/rebar_erlc_compiler.erl @@ -202,7 +202,13 @@ compile_dirs(RebarOpts, BaseDir, SrcDirs, OutDir, Opts) ->      G = init_erlcinfo(include_abs_dirs(ErlOpts, BaseDir), AllErlFiles, BaseDir, OutDir), -    NeededErlFiles = needed_files(G, ErlOpts, BaseDir, OutDir, AllErlFiles), +    {ParseTransforms, Rest} = split_source_files(AllErlFiles, ErlOpts), +    NeededErlFiles = case needed_files(G, ErlOpts, BaseDir, OutDir, ParseTransforms) of +        [] -> needed_files(G, ErlOpts, BaseDir, OutDir, Rest); +        %% at least one parse transform in the opts needs updating, so recompile all +        _  -> AllErlFiles +    end, +      {ErlFirstFiles, ErlOptsFirst} = erl_first_files(RebarOpts, ErlOpts, BaseDir, NeededErlFiles),      {DepErls, OtherErls} = lists:partition(                               fun(Source) -> digraph:in_degree(G, Source) > 0 end, @@ -296,6 +302,14 @@ erl_first_files(Opts, ErlOpts, Dir, NeededErlFiles) ->                                 end, ErlOpts),      {ErlFirstFiles ++ ParseTransformsErls, ErlOptsFirst}. +split_source_files(SourceFiles, ErlOpts) -> +    ParseTransforms = proplists:get_all_values(parse_transform, ErlOpts), +    lists:partition(fun(Source) -> +                            lists:member(filename_to_atom(Source), ParseTransforms) +                    end, SourceFiles). + +filename_to_atom(F) -> list_to_atom(filename:rootname(filename:basename(F))). +  %% Get subset of SourceFiles which need to be recompiled, respecting  %% dependencies induced by given graph G.  needed_files(G, ErlOpts, Dir, OutDir, SourceFiles) -> | 
