-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).