summaryrefslogtreecommitdiff
path: root/src/rebar_otp_app.erl
diff options
context:
space:
mode:
authorsimonxu72 <simon.xu72@gmail.com>2018-10-16 18:37:28 +0800
committersimonxu72 <simon.xu72@gmail.com>2018-10-16 18:37:28 +0800
commit41d133856bf199034b0eeb0903bedc2071fba7e1 (patch)
tree15135eaf1501e016ec1b91b275356a0cfd92d867 /src/rebar_otp_app.erl
parentb81871c61809a9e5c09f54d6c8298908d18a760c (diff)
parent7bfc8110d1736d2cbf61e19d2fc16dc8e854b460 (diff)
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src/rebar_otp_app.erl')
-rw-r--r--src/rebar_otp_app.erl52
1 files changed, 18 insertions, 34 deletions
diff --git a/src/rebar_otp_app.erl b/src/rebar_otp_app.erl
index f5bb9cf..e14975f 100644
--- a/src/rebar_otp_app.erl
+++ b/src/rebar_otp_app.erl
@@ -59,8 +59,9 @@ compile(State, App) ->
format_error({missing_app_file, Filename}) ->
io_lib:format("App file is missing: ~ts", [Filename]);
-format_error({file_read, File, Reason}) ->
- io_lib:format("Failed to read required file ~ts for processing: ~ts", [File, file:format_error(Reason)]);
+format_error({file_read, AppName, File, Reason}) ->
+ io_lib:format("Failed to read required ~ts file for processing the application '~ts': ~ts",
+ [File, AppName, file:format_error(Reason)]);
format_error({invalid_name, File, AppName}) ->
io_lib:format("Invalid ~ts: name of application (~p) must match filename.", [File, AppName]).
@@ -79,7 +80,7 @@ validate_app(State, App) ->
Error
end;
{error, Reason} ->
- ?PRV_ERROR({file_read, AppFile, Reason})
+ ?PRV_ERROR({file_read, rebar_app_info:name(App), ".app", Reason})
end.
validate_app_modules(State, App, AppData) ->
@@ -110,7 +111,7 @@ preprocess(State, AppInfo, AppSrcFile) ->
A1 = apply_app_vars(AppVars, AppData),
%% AppSrcFile may contain instructions for generating a vsn number
- Vsn = app_vsn(AppData, AppSrcFile, State),
+ Vsn = app_vsn(AppInfo, AppData, AppSrcFile, State),
A2 = lists:keystore(vsn, 1, A1, {vsn, Vsn}),
%% systools:make_relup/4 fails with {missing_param, registered}
@@ -125,13 +126,13 @@ preprocess(State, AppInfo, AppSrcFile) ->
%% Setup file .app filename and write new contents
EbinDir = rebar_app_info:ebin_dir(AppInfo),
- filelib:ensure_dir(filename:join(EbinDir, "dummy.beam")),
+ rebar_file_utils:ensure_dir(EbinDir),
AppFile = rebar_app_utils:app_src_to_app(OutDir, AppSrcFile),
ok = rebar_file_utils:write_file_if_contents_differ(AppFile, Spec, utf8),
AppFile;
{error, Reason} ->
- throw(?PRV_ERROR({file_read, AppSrcFile, Reason}))
+ throw(?PRV_ERROR({file_read, rebar_app_info:name(AppInfo), ".app.src", Reason}))
end.
load_app_vars(State) ->
@@ -163,32 +164,17 @@ validate_name(AppName, File) ->
ebin_modules(AppInfo, Dir) ->
Beams = lists:sort(rebar_utils:beams(filename:join(Dir, "ebin"))),
- ExtraDirs = extra_dirs(AppInfo),
- F = fun(Beam) -> not in_extra_dir(AppInfo, Beam, ExtraDirs) end,
- Filtered = lists:filter(F, Beams),
+ 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),
[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 ->
@@ -226,10 +212,8 @@ consult_app_file(Filename) ->
end
end.
-app_vsn(AppData, AppFile, State) ->
- AppDir = filename:dirname(filename:dirname(AppFile)),
- Resources = rebar_state:resources(State),
- rebar_utils:vcs_vsn(get_value(vsn, AppData, AppFile), AppDir, Resources).
+app_vsn(AppInfo, AppData, AppFile, State) ->
+ rebar_utils:vcs_vsn(AppInfo, get_value(vsn, AppData, AppFile), State).
get_value(Key, AppInfo, AppFile) ->
case proplists:get_value(Key, AppInfo) of