More work on getting compilation and clean working properly

This commit is contained in:
Dave Smith 2009-11-25 20:24:51 -07:00
parent e52bb6783c
commit 620867d5d5
3 changed files with 37 additions and 19 deletions

View file

@ -28,12 +28,9 @@
-include_lib("rebar/include/rebar.hrl").
main([CommandStr | _Args]) ->
main(Commands) ->
%% Pre-load the rebar app so that we get default configuration
application:load(rebar),
%% Convert the command into an atom for convenience
Command = list_to_atom(CommandStr),
%% From the current working directory, search recursively and find
%% all the application and release directories. We always terminate the
@ -46,18 +43,14 @@ main([CommandStr | _Args]) ->
Targets = [{Type, Cwd, Filename}]
end,
%% Filter out all the targets, based on the specified command.
FilteredTargets = [{Type, Dir, Filename} || {Type, Dir, Filename} <- Targets,
valid_command(Command, Type) == true],
%% Prefix all the app targets to the code path so that inter-app compilation
%% works properly
update_code_path(FilteredTargets),
update_code_path(Targets),
%% Finally, apply the specified command to each target
apply_command(FilteredTargets, Command);
apply_commands(Targets, Commands);
main(_) ->
io:format("usage: rebar <command>\n").
io:format("usage: rebar <command>...\n").
%%
@ -65,25 +58,27 @@ main(_) ->
%%
find_targets(Root) ->
{ok, Files} = file:list_dir(Root),
find_targets(Files, Root, []).
find_targets(Files, Root, [], 1).
find_targets([], _Root, Acc) ->
find_targets([], _Root, Acc, _Depth) ->
Acc;
find_targets([F | Rest], Root, Acc) ->
find_targets(_Files, _Root, Acc, 10) ->
Acc;
find_targets([F | Rest], Root, Acc, Depth) ->
AbsName = filename:join([Root, F]),
case target_type(AbsName) of
undefined ->
case filelib:is_dir(AbsName) of
true ->
{ok, SubFiles} = file:list_dir(AbsName),
Acc2 = find_targets(SubFiles, AbsName, Acc);
Acc2 = find_targets(SubFiles, AbsName, Acc, Depth+1);
false ->
Acc2 = Acc
end;
{Type, Filename} ->
Acc2 = [{Type, AbsName, Filename} | Acc]
end,
find_targets(Rest, Root, Acc2).
find_targets(Rest, Root, Acc2, Depth).
%%
%% Determine the target type of a given file: app, rel or undefined
@ -123,12 +118,31 @@ update_code_path([_ | Rest]) ->
update_code_path(Rest).
apply_commands(_Targets, []) ->
ok;
apply_commands(Targets, [CommandStr | Rest]) ->
%% Convert the command into an atom for convenience
Command = list_to_atom(CommandStr),
%% Filter out all the targets, based on the specified command.
FilteredTargets = [{Type, Dir, Filename} || {Type, Dir, Filename} <- Targets,
valid_command(Command, Type) == true],
case apply_command(FilteredTargets, Command) of
ok ->
apply_commands(Targets, Rest);
Other ->
Other
end.
apply_command([], _Command) ->
ok;
apply_command([{Type, Dir, File} | Rest], Command) ->
ok = file:set_cwd(Dir),
Config = rebar_config:new(Dir),
%% Provide some info on where we are
?CONSOLE("==> ~s (~s)\n", [filename:basename(Dir), Command]),
%% Pull the list of modules that are associated with Type operations. Each module
%% will be inspected for a function matching Command and if found, will execute that.
Modules = rebar_config:get_modules(Config, Type),

View file

@ -40,11 +40,14 @@ compile(Config, Dir) ->
fun compile_mib/2).
clean(Config, Dir) ->
% rebar_utils:delete_files("ebin/*.beam"),
% rebar_utils:delete_files("priv/mibs/*.bin").
%% TODO: This would be more portable if it used Erlang to traverse
%% the dir structure and delete each file; however it would also
%% much slower.
[] = os:cmd("rm -f ebin/*.beam priv/mibs/*.bin"),
ok.
%% ===================================================================
%% Internal functions
%% ===================================================================
@ -96,7 +99,7 @@ compile_erl(Source, Config) ->
end.
compile_mib(Source, Config) ->
Opts = meab_config:get_list(mibc_opts, []),
Opts = rebar_config:get_list(Config, mibc_opts, []),
case snmpc:compile(Source, [{outdir, "priv/mibs"}, {i, ["priv/mibs"]}] ++ Opts) of
{ok, _} ->
ok;

View file

@ -29,3 +29,4 @@
get_cwd() ->
{ok, Dir} = file:get_cwd(),
Dir.