diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/rebar_base_compiler.erl | 4 | ||||
-rw-r--r-- | src/rebar_compiler.erl | 4 | ||||
-rw-r--r-- | src/rebar_compiler_xrl.erl | 30 | ||||
-rw-r--r-- | src/rebar_compiler_yrl.erl | 14 | ||||
-rw-r--r-- | src/rebar_otp_app.erl | 33 |
5 files changed, 57 insertions, 28 deletions
diff --git a/src/rebar_base_compiler.erl b/src/rebar_base_compiler.erl index 2fb3a12..ad81c86 100644 --- a/src/rebar_base_compiler.erl +++ b/src/rebar_base_compiler.erl @@ -96,14 +96,14 @@ run(Config, FirstFiles, SourceDir, SourceExt, TargetDir, TargetExt, TargetDir :: file:filename(), SourceExt :: string(), TargetExt :: string(). -run(Config, FirstFiles, SourceDirs, SourceExt, TargetDir, TargetExt, +run(Config, FirstFiles, SourceDir, SourceExt, TargetDir, TargetExt, Compile3Fn, Opts) -> %% Convert simple extension to proper regex SourceExtRe = "^(?!\\._).*\\" ++ SourceExt ++ [$$], Recursive = proplists:get_value(recursive, Opts, true), %% Find all possible source files - FoundFiles = rebar_utils:find_files_in_dirs(SourceDirs, SourceExtRe, Recursive), + FoundFiles = rebar_utils:find_files(SourceDir, SourceExtRe, Recursive), %% Remove first files from found files RestFiles = [Source || Source <- FoundFiles, not lists:member(Source, FirstFiles)], diff --git a/src/rebar_compiler.erl b/src/rebar_compiler.erl index 092f898..7da265c 100644 --- a/src/rebar_compiler.erl +++ b/src/rebar_compiler.erl @@ -20,10 +20,12 @@ src_ext => extension(), out_mappings => out_mappings()}. -callback needed_files(digraph:graph(), [file:filename()], out_mappings(), - rebar_app_info:t()) -> [file:filename()]. + rebar_app_info:t()) -> + {{[file:filename()], term()}, {[file:filename()], term()}}. -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()]}. +-callback clean([file:filename()], rebar_app_info:t()) -> _. -define(DAG_VSN, 2). -define(DAG_FILE, "source.dag"). diff --git a/src/rebar_compiler_xrl.erl b/src/rebar_compiler_xrl.erl index 23ed1eb..35447ed 100644 --- a/src/rebar_compiler_xrl.erl +++ b/src/rebar_compiler_xrl.erl @@ -8,6 +8,8 @@ compile/4, clean/2]). +-export([update_opts/2]). + context(AppInfo) -> Dir = rebar_app_info:dir(AppInfo), Mappings = [{".erl", filename:join([Dir, "src"])}], @@ -25,28 +27,38 @@ needed_files(_, FoundFiles, Mappings, AppInfo) -> rebar_compiler:needs_compile(Source, ".erl", Mappings)], Opts = rebar_opts:get(rebar_app_info:opts(AppInfo), xrl_opts, []), + Opts1 = update_opts(Opts, AppInfo), - {{FirstFiles, Opts}, {RestFiles, Opts}}. + {{FirstFiles, Opts1}, {RestFiles, Opts1}}. dependencies(_, _, _) -> []. -compile(Source, [{_, OutDir}], _, Opts) -> - BaseName = filename:basename(Source), - Target = filename:join([OutDir, BaseName]), - AllOpts = [{parserfile, Target} | Opts], - AllOpts1 = [{includefile, filename:join(OutDir, I)} || {includefile, I} <- AllOpts, - filename:pathtype(I) =:= relative], - case leex:file(Source, AllOpts1 ++ [{return, true}]) of +compile(Source, [{_, _}], _, Opts) -> + case leex:file(Source, [{return, true} | Opts]) of {ok, _} -> ok; {ok, _Mod, Ws} -> rebar_compiler:ok_tuple(Source, Ws); {error, Es, Ws} -> - rebar_compiler:error_tuple(Source, Es, Ws, AllOpts1) + rebar_compiler:error_tuple(Source, Es, Ws, Opts) end. clean(XrlFiles, _AppInfo) -> rebar_file_utils:delete_each( [rebar_utils:to_list(re:replace(F, "\\.xrl$", ".erl", [unicode])) || F <- XrlFiles]). + +%% make includefile options absolute paths +update_opts(Opts, AppInfo) -> + OutDir = rebar_app_info:out_dir(AppInfo), + lists:map(fun({includefile, I}) -> + case filename:pathtype(I) =:= relative of + true -> + {includefile, filename:join(OutDir, I)}; + false -> + {includefile, I} + end; + (O) -> + O + end, Opts). diff --git a/src/rebar_compiler_yrl.erl b/src/rebar_compiler_yrl.erl index 9c1767e..8e52d0e 100644 --- a/src/rebar_compiler_yrl.erl +++ b/src/rebar_compiler_yrl.erl @@ -25,24 +25,24 @@ needed_files(_, FoundFiles, Mappings, AppInfo) -> rebar_compiler:needs_compile(Source, ".erl", Mappings)], Opts = rebar_opts:get(rebar_app_info:opts(AppInfo), yrl_opts, []), - {{FirstFiles, Opts}, {RestFiles, Opts}}. + Opts1 = rebar_compiler_xrl:update_opts(Opts, AppInfo), + + {{FirstFiles, Opts1}, {RestFiles, Opts1}}. dependencies(_, _, _) -> []. compile(Source, [{_, OutDir}], _, Opts) -> - BaseName = filename:basename(Source), + BaseName = filename:basename(Source, ".yrl"), Target = filename:join([OutDir, BaseName]), - AllOpts = [{parserfile, Target} | Opts], - AllOpts1 = [{includefile, filename:join(OutDir, I)} || {includefile, I} <- AllOpts, - filename:pathtype(I) =:= relative], - case yecc:file(Source, AllOpts1 ++ [{return, true}]) of + AllOpts = [{parserfile, Target}, {return, true} | Opts], + case yecc:file(Source, AllOpts) of {ok, _} -> ok; {ok, _Mod, Ws} -> rebar_compiler:ok_tuple(Source, Ws); {error, Es, Ws} -> - rebar_compiler:error_tuple(Source, Es, Ws, AllOpts1) + rebar_compiler:error_tuple(Source, Es, Ws, AllOpts) end. clean(YrlFiles, _AppInfo) -> diff --git a/src/rebar_otp_app.erl b/src/rebar_otp_app.erl index e14975f..952271b 100644 --- a/src/rebar_otp_app.erl +++ b/src/rebar_otp_app.erl @@ -164,17 +164,32 @@ validate_name(AppName, File) -> ebin_modules(AppInfo, Dir) -> Beams = lists:sort(rebar_utils:beams(filename:join(Dir, "ebin"))), - SrcDirs = rebar_dir:src_dirs(rebar_app_info:opts(AppInfo), ["src"]), - FindSourceRules = [{".beam", ".erl", - [{"ebin", SrcDir} || SrcDir <- SrcDirs]}], - Filtered = lists:filter(fun(Beam) -> - rebar_utils:find_source(filename:basename(Beam), - filename:dirname(Beam), - FindSourceRules) - =/= {error, not_found} - end, Beams), + ExtraDirs = extra_dirs(AppInfo), + F = fun(Beam) -> not in_extra_dir(AppInfo, Beam, ExtraDirs) end, + Filtered = lists:filter(F, Beams), [rebar_utils:beam_to_mod(N) || N <- Filtered]. +extra_dirs(State) -> + Extras = rebar_dir:extra_src_dirs(rebar_app_info:opts(State)), + SrcDirs = rebar_dir:src_dirs(rebar_app_info:opts(State), ["src"]), + %% remove any dirs that are defined in `src_dirs` from `extra_src_dirs` + Extras -- SrcDirs. + +in_extra_dir(AppInfo, Beam, Dirs) -> + lists:any(fun(Dir) -> lists:prefix(filename:join([rebar_app_info:out_dir(AppInfo), Dir]), + beam_src(Beam)) end, + Dirs). + +beam_src(Beam) -> + case beam_lib:chunks(Beam, [compile_info]) of + {ok, {_mod, Chunks}} -> + CompileInfo = proplists:get_value(compile_info, Chunks, []), + proplists:get_value(source, CompileInfo, []); + {error, beam_lib, Reason} -> + ?WARN("Couldn't read debug info from ~p for reason: ~p", [Beam, Reason]), + [] + end. + ensure_registered(AppData) -> case lists:keyfind(registered, 1, AppData) of false -> |