summaryrefslogtreecommitdiff
path: root/src/rebar_compiler_xrl.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/rebar_compiler_xrl.erl')
-rw-r--r--src/rebar_compiler_xrl.erl64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/rebar_compiler_xrl.erl b/src/rebar_compiler_xrl.erl
new file mode 100644
index 0000000..35447ed
--- /dev/null
+++ b/src/rebar_compiler_xrl.erl
@@ -0,0 +1,64 @@
+-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).