diff options
Diffstat (limited to 'src/rebar_erlc_compiler.erl')
-rw-r--r-- | src/rebar_erlc_compiler.erl | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/src/rebar_erlc_compiler.erl b/src/rebar_erlc_compiler.erl index 3480cf6..167f2bb 100644 --- a/src/rebar_erlc_compiler.erl +++ b/src/rebar_erlc_compiler.erl @@ -54,7 +54,6 @@ -define(DEFAULT_OUTDIR, "ebin"). -define(RE_PREFIX, "^[^._]"). - %% =================================================================== %% Public API %% =================================================================== @@ -201,7 +200,7 @@ compile_dirs(RebarOpts, BaseDir, SrcDirs, OutDir, Opts) -> ok = filelib:ensure_dir(filename:join(OutDir, "dummy.beam")), true = code:add_patha(filename:absname(OutDir)), - G = init_erlcinfo(proplists:get_all_values(i, ErlOpts), AllErlFiles, BaseDir, OutDir), + G = init_erlcinfo(include_abs_dirs(ErlOpts, BaseDir), AllErlFiles, BaseDir, OutDir), NeededErlFiles = needed_files(G, ErlOpts, BaseDir, OutDir, AllErlFiles), {ErlFirstFiles, ErlOptsFirst} = erl_first_files(RebarOpts, ErlOpts, BaseDir, NeededErlFiles), @@ -308,6 +307,7 @@ needed_files(G, ErlOpts, Dir, OutDir, SourceFiles) -> ,{i, Dir}] ++ ErlOpts, digraph:vertex(G, Source) > {Source, filelib:last_modified(Target)} orelse opts_changed(AllOpts, TargetBase) + orelse erl_compiler_opts_set() end, SourceFiles). maybe_rm_beam_and_edge(G, OutDir, Source) -> @@ -340,6 +340,12 @@ compile_info(Target) -> {error, Reason} end. +erl_compiler_opts_set() -> + case os:getenv("ERL_COMPILER_OPTIONS") of + false -> false; + _ -> true + end. + erlcinfo_file(Dir) -> filename:join(rebar_dir:local_cache_dir(Dir), ?ERLCINFO_FILE). @@ -381,7 +387,7 @@ maybe_rm_beams_and_edges(G, Dir, Files) -> source_and_include_dirs(InclDirs, Erls) -> SourceDirs = lists:map(fun filename:dirname/1, Erls), - lists:usort(["include" | InclDirs ++ SourceDirs]). + lists:usort(InclDirs ++ SourceDirs). update_erlcinfo(G, Dirs, Source) -> case digraph:vertex(G, Source) of @@ -497,10 +503,9 @@ expand_file_names(Files, Dirs) -> end end, Files). - -spec internal_erl_compile(rebar_dict(), file:filename(), file:filename(), file:filename(), list()) -> ok | {ok, any()} | {error, any(), any()}. -internal_erl_compile(_Opts, Dir, Module, OutDir, ErlOpts) -> +internal_erl_compile(Opts, Dir, Module, OutDir, ErlOpts) -> Target = target_base(OutDir, Module) ++ ".beam", ok = filelib:ensure_dir(Target), AllOpts = [{outdir, filename:dirname(Target)}] ++ ErlOpts ++ @@ -509,11 +514,21 @@ internal_erl_compile(_Opts, Dir, Module, OutDir, ErlOpts) -> {ok, _Mod} -> ok; {ok, _Mod, Ws} -> - rebar_base_compiler:ok_tuple(Module, Ws); + FormattedWs = format_error_sources(Ws, Opts), + rebar_base_compiler:ok_tuple(Module, FormattedWs); {error, Es, Ws} -> - rebar_base_compiler:error_tuple(Module, Es, Ws, AllOpts) + error_tuple(Module, Es, Ws, AllOpts, Opts) end. +error_tuple(Module, Es, Ws, AllOpts, Opts) -> + FormattedEs = format_error_sources(Es, Opts), + FormattedWs = format_error_sources(Ws, Opts), + rebar_base_compiler:error_tuple(Module, FormattedEs, FormattedWs, AllOpts). + +format_error_sources(Es, Opts) -> + [{rebar_base_compiler:format_error_source(Src, Opts), Desc} + || {Src, Desc} <- Es]. + target_base(OutDir, Source) -> filename:join(OutDir, filename:basename(Source, ".erl")). @@ -722,6 +737,10 @@ outdir(RebarOpts) -> ErlOpts = rebar_opts:erl_opts(RebarOpts), proplists:get_value(outdir, ErlOpts, ?DEFAULT_OUTDIR). +include_abs_dirs(ErlOpts, BaseDir) -> + InclDirs = ["include"|proplists:get_all_values(i, ErlOpts)], + lists:map(fun(Incl) -> filename:join([BaseDir, Incl]) end, InclDirs). + parse_opts(Opts) -> parse_opts(Opts, #compile_opts{}). parse_opts([], CompileOpts) -> CompileOpts; |