summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/rebar_base_compiler.erl4
-rw-r--r--src/rebar_compiler.erl4
-rw-r--r--src/rebar_compiler_xrl.erl30
-rw-r--r--src/rebar_compiler_yrl.erl14
-rw-r--r--src/rebar_otp_app.erl33
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 ->