summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTristan Sloughter <t@crashfast.com>2015-04-19 09:57:55 -0500
committerTristan Sloughter <t@crashfast.com>2015-04-19 17:44:15 -0500
commit8ed91ab761e775cd18cf1b4925421784822215fa (patch)
tree4f818bc04f16bce1e7b772b688fbe66c9414a0ee
parent2667dbdd0b9da867da348fe0a6b22933daebad3c (diff)
improve erlydtl source and out dir discovery
-rw-r--r--src/rebar_base_compiler.erl2
-rw-r--r--src/rebar_prv_erlydtl_compiler.erl57
-rw-r--r--src/rebar_prv_escriptize.erl62
3 files changed, 71 insertions, 50 deletions
diff --git a/src/rebar_base_compiler.erl b/src/rebar_base_compiler.erl
index df950d7..0101218 100644
--- a/src/rebar_base_compiler.erl
+++ b/src/rebar_base_compiler.erl
@@ -114,7 +114,7 @@ compile_each([Source | Rest], Config, CompileFn) ->
skipped ->
?DEBUG("~sSkipped ~s", [rebar_utils:indent(1), filename:basename(Source)]);
Error ->
- ?INFO("Compiling ~s failed:",
+ ?ERROR("Compiling ~s failed",
[maybe_absname(Config, Source)]),
maybe_report(Error),
?DEBUG("Compilation failed: ~p", [Error]),
diff --git a/src/rebar_prv_erlydtl_compiler.erl b/src/rebar_prv_erlydtl_compiler.erl
index c5fb77a..a7442af 100644
--- a/src/rebar_prv_erlydtl_compiler.erl
+++ b/src/rebar_prv_erlydtl_compiler.erl
@@ -125,39 +125,48 @@ init(State) ->
do(State) ->
?INFO("Running erlydtl...", []),
- DtlOpts = proplists:unfold(rebar_state:get(State, erlydtl_opts, [])),
-
- %% We need a project app to store the results under in _build
- %% If there is more than 1 project app, check for an app config
- %% if that doesn't exist, error out.
- case rebar_state:project_apps(State) of
- [App] ->
- run_erlydtl(App, DtlOpts, State),
- {ok, State};
- Apps ->
- case option(app, DtlOpts) of
- undefined ->
- ?PRV_ERROR(no_main_app);
- Name ->
- run_erlydtl(rebar_app_utils:find(Name, Apps), DtlOpts, State),
- {ok, State}
- end
+ case rebar_state:get(State, escript_main_app, undefined) of
+ undefined ->
+ Dir = rebar_state:dir(State),
+ case rebar_app_discover:find_app(Dir, all) of
+ {true, AppInfo} ->
+ AllApps = rebar_state:project_apps(State) ++ rebar_state:all_deps(State),
+ case rebar_app_utils:find(rebar_app_info:name(AppInfo), AllApps) of
+ {ok, AppInfo1} ->
+ %% Use the existing app info instead of newly created one
+ run_erlydtl(AppInfo1, State);
+ _ ->
+ run_erlydtl(AppInfo, State)
+ end,
+ {ok, State};
+ _ ->
+ ?PRV_ERROR(no_main_app)
+ end;
+ Name ->
+ AllApps = rebar_state:project_apps(State) ++ rebar_state:all_deps(State),
+ {ok, App} = rebar_app_utils:find(Name, AllApps),
+ run_erlydtl(App, State),
+ {ok, State}
end.
-run_erlydtl(App, DtlOpts, State) ->
- Dir = rebar_app_info:dir(App),
+run_erlydtl(App, State) ->
+ Dir = rebar_state:dir(State),
+ DtlOpts = proplists:unfold(rebar_state:get(State, erlydtl_opts, [])),
+ TemplateDir = filename:join(Dir, option(doc_root, DtlOpts)),
+ DtlOpts2 = [{doc_root, TemplateDir} | proplists:delete(doc_root, DtlOpts)],
OutDir = rebar_app_info:ebin_dir(App),
+ filelib:ensure_dir(filename:join(OutDir, "dummy.beam")),
rebar_base_compiler:run(State,
[],
- filename:join(Dir, option(doc_root, DtlOpts)),
- option(source_ext, DtlOpts),
+ TemplateDir,
+ option(source_ext, DtlOpts2),
OutDir,
- option(module_ext, DtlOpts) ++ ".beam",
+ option(module_ext, DtlOpts2) ++ ".beam",
fun(S, T, C) ->
- compile_dtl(C, S, T, DtlOpts, Dir, OutDir)
+ compile_dtl(C, S, T, DtlOpts2, Dir, OutDir)
end,
[{check_last_mod, false},
- {recursive, option(recursive, DtlOpts)}]).
+ {recursive, option(recursive, DtlOpts2)}]).
-spec format_error(any()) -> iolist().
format_error(no_main_app) ->
diff --git a/src/rebar_prv_escriptize.erl b/src/rebar_prv_escriptize.erl
index 12ceaca..03332a0 100644
--- a/src/rebar_prv_escriptize.erl
+++ b/src/rebar_prv_escriptize.erl
@@ -62,17 +62,18 @@ desc() ->
do(State) ->
?INFO("Building escript...", []),
- case rebar_state:project_apps(State) of
- [App] ->
- escriptize(State, App);
- Apps ->
- case rebar_state:get(State, escript_main_app, undefined) of
- undefined ->
- ?PRV_ERROR(no_main_app);
- Name ->
- AppInfo = rebar_app_utils:find(Name, Apps),
- escriptize(State, AppInfo)
- end
+ case rebar_state:get(State, escript_main_app, undefined) of
+ undefined ->
+ case rebar_state:project_apps(State) of
+ [App] ->
+ escriptize(State, App);
+ _ ->
+ ?PRV_ERROR(no_main_app)
+ end;
+ Name ->
+ AllApps = rebar_state:all_deps(State)++rebar_state:project_apps(State),
+ AppInfo = rebar_app_utils:find(Name, AllApps),
+ escriptize(State, AppInfo)
end.
escriptize(State0, App) ->
@@ -89,8 +90,9 @@ escriptize(State0, App) ->
%% in the output file. We then use the .app files for each of these
%% to pull in all the .beam files.
InclApps = lists:usort(rebar_state:get(State, escript_incl_apps, [])
- ++ all_deps(State)),
- InclBeams = get_app_beams(InclApps),
+ ++ all_deps(State)),
+ AllApps = rebar_state:all_deps(State)++rebar_state:project_apps(State),
+ InclBeams = get_apps_beams(InclApps, AllApps),
%% Look for a list of extra files to include in the output file.
%% For internal rebar-private use only. Do not use outside rebar.
@@ -139,22 +141,32 @@ format_error(no_main_app) ->
%% Internal functions
%% ===================================================================
-get_app_beams(Apps) ->
- get_app_beams(Apps, []).
+get_apps_beams(Apps, AllApps) ->
+ get_apps_beams(Apps, AllApps, []).
-get_app_beams([], Acc) ->
+get_apps_beams([], _, Acc) ->
Acc;
-get_app_beams([App | Rest], Acc) ->
- case code:lib_dir(App, ebin) of
- {error, bad_name} ->
- throw(?PRV_ERROR({bad_name, App}));
- Path ->
- Prefix = filename:join(atom_to_list(App), "ebin"),
- Acc2 = load_files(Prefix, "*.beam", Path),
- Acc3 = load_files(Prefix, "*.app", Path),
- get_app_beams(Rest, Acc3 ++ Acc2 ++ Acc)
+get_apps_beams([App | Rest], AllApps, Acc) ->
+ case rebar_app_utils:find(ec_cnv:to_binary(App), AllApps) of
+ {ok, App1} ->
+ OutDir = filename:absname(rebar_app_info:ebin_dir(App1)),
+ Beams = get_app_beams(App, OutDir),
+ get_apps_beams(Rest, AllApps, Beams ++ Acc);
+ _->
+ case code:lib_dir(App, ebin) of
+ {error, bad_name} ->
+ throw(?PRV_ERROR({bad_name, App}));
+ Path ->
+ Beams = get_app_beams(App, Path),
+ get_apps_beams(Rest, AllApps, Beams ++ Acc)
+ end
end.
+get_app_beams(App, Path) ->
+ Prefix = filename:join(atom_to_list(App), "ebin"),
+ load_files(Prefix, "*.beam", Path) ++
+ load_files(Prefix, "*.app", Path).
+
get_extra(State) ->
Extra = rebar_state:get(State, escript_incl_extra, []),
lists:foldl(fun({Wildcard, Dir}, Files) ->