From 620867d5d511e1c6e962f54e7f53a3b2ae2a052e Mon Sep 17 00:00:00 2001 From: Dave Smith Date: Wed, 25 Nov 2009 20:24:51 -0700 Subject: More work on getting compilation and clean working properly --- priv/rebar | 46 ++++++++++++++++++++++++++++--------------- src/rebar_doterl_compiler.erl | 9 ++++++--- src/rebar_utils.erl | 1 + 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/priv/rebar b/priv/rebar index f911966..a9e229f 100755 --- a/priv/rebar +++ b/priv/rebar @@ -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 \n"). + io:format("usage: rebar ...\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(_Files, _Root, Acc, 10) -> Acc; -find_targets([F | Rest], Root, 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), diff --git a/src/rebar_doterl_compiler.erl b/src/rebar_doterl_compiler.erl index cf345cd..60baa59 100644 --- a/src/rebar_doterl_compiler.erl +++ b/src/rebar_doterl_compiler.erl @@ -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; diff --git a/src/rebar_utils.erl b/src/rebar_utils.erl index 0ad6edc..92f40ec 100644 --- a/src/rebar_utils.erl +++ b/src/rebar_utils.erl @@ -29,3 +29,4 @@ get_cwd() -> {ok, Dir} = file:get_cwd(), Dir. + -- cgit v1.1