add handling for yecc's .yrl files to erlc compiler

This commit is contained in:
Bryan Fink 2010-03-31 11:35:06 -04:00
parent 3a1d2e433c
commit cf820007fc

View file

@ -40,6 +40,9 @@
-spec compile(Config::#config{}, AppFile::string()) -> 'ok'. -spec compile(Config::#config{}, AppFile::string()) -> 'ok'.
compile(Config, _AppFile) -> compile(Config, _AppFile) ->
rebar_base_compiler:run(Config, rebar_config:get_list(Config, yrl_first_files, []),
"src", ".yrl", "src", ".erl",
fun compile_yrl/3),
doterl_compile(Config, "ebin"), doterl_compile(Config, "ebin"),
rebar_base_compiler:run(Config, rebar_config:get_list(Config, mib_first_files, []), rebar_base_compiler:run(Config, rebar_config:get_list(Config, mib_first_files, []),
"mibs", ".mib", "priv/mibs", ".bin", "mibs", ".mib", "priv/mibs", ".bin",
@ -52,6 +55,11 @@ clean(_Config, _AppFile) ->
%% much slower. %% much slower.
ok = rebar_file_utils:rm_rf("ebin/*.beam priv/mibs/*.bin"), ok = rebar_file_utils:rm_rf("ebin/*.beam priv/mibs/*.bin"),
YrlFiles = rebar_utils:find_files("src", "^.*\\.yrl\$"),
rebar_file_utils:delete_each(
[ binary_to_list(iolist_to_binary(re:replace(F, "\\.yrl$", ".erl")))
|| F <- YrlFiles ]),
%% Erlang compilation is recursive, so it's possible that we have a nested %% Erlang compilation is recursive, so it's possible that we have a nested
%% directory structure in ebin with .beam files within. As such, we want %% directory structure in ebin with .beam files within. As such, we want
%% to scan whatever is left in the ebin/ directory for sub-dirs which %% to scan whatever is left in the ebin/ directory for sub-dirs which
@ -198,6 +206,33 @@ compile_mib(Source, Target, Config) ->
?FAIL ?FAIL
end. end.
-spec compile_yrl(Source::string(), Target::string(), Config::#config{}) -> 'ok'.
compile_yrl(Source, Target, Config) ->
case yrl_needs_compile(Source, Target) of
true ->
Opts = [{parserfile, Target}, {return, true}
|rebar_config:get(Config, yrl_opts, [])],
case yecc:file(Source, Opts) of
{ok, _, []} ->
ok;
{ok, _, _Warnings} ->
case lists:member(fail_on_warnings, Config) of
true ->
?FAIL;
false ->
ok
end;
_X ->
?FAIL
end;
false ->
skipped
end.
-spec yrl_needs_compile(Source::string(), Target::string()) -> boolean().
yrl_needs_compile(Source, Target) ->
filelib:last_modified(Target) < filelib:last_modified(Source).
gather_src([], Srcs) -> gather_src([], Srcs) ->
Srcs; Srcs;
gather_src([Dir|Rest], Srcs) -> gather_src([Dir|Rest], Srcs) ->