rebar3/src/rebar_compiler_xrl.erl

65 lines
1.9 KiB
Erlang

-module(rebar_compiler_xrl).
-behaviour(rebar_compiler).
-export([context/1,
needed_files/4,
dependencies/3,
compile/4,
clean/2]).
-export([update_opts/2]).
context(AppInfo) ->
Dir = rebar_app_info:dir(AppInfo),
Mappings = [{".erl", filename:join([Dir, "src"])}],
#{src_dirs => ["src"],
include_dirs => [],
src_ext => ".xrl",
out_mappings => Mappings}.
needed_files(_, FoundFiles, Mappings, AppInfo) ->
FirstFiles = [],
%% Remove first files from found files
RestFiles = [Source || Source <- FoundFiles,
not lists:member(Source, FirstFiles),
rebar_compiler:needs_compile(Source, ".erl", Mappings)],
Opts = rebar_opts:get(rebar_app_info:opts(AppInfo), xrl_opts, []),
Opts1 = update_opts(Opts, AppInfo),
{{FirstFiles, Opts1}, {RestFiles, Opts1}}.
dependencies(_, _, _) ->
[].
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, 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).