@ -0,0 +1,2 @@ | |||
{'src/*', [{i, "include"}, {outdir, "ebin"}]}. |
@ -0,0 +1,28 @@ | |||
* Major operations | |||
** Compile | |||
*** Code generation | |||
*** Compilation/linking | |||
*** App validation | |||
** Clean | |||
** ct testing | |||
** eunit testing | |||
** Installation | |||
** Doc generation | |||
* Modes/File types | |||
** Erlang | |||
** Port driver | |||
** NIF driver | |||
** SNMP MIBs | |||
** ASN.1 files | |||
* Misc. Notes | |||
** Port/NIF driver compilation needs pre/post hook | |||
** Need to support code generation for things like protobuf | |||
** Need to support compilation flags | |||
* Contexts | |||
** Application | |||
** General | |||
** Release ?! |
@ -0,0 +1,20 @@ | |||
{application, rebar, | |||
[{description, "Rebar: Erlang Build Tool"}, | |||
{vsn, "1"}, | |||
{modules, [ rebar_config, | |||
rebar_utils, | |||
rebar_app_utils, | |||
rebar_rel_utils, | |||
rebar_doterl_compiler]}, | |||
{registered, []}, | |||
{applications, [kernel, | |||
stdlib, | |||
sasl]}, | |||
{env, [ | |||
%% Key/value list of base/default configuration used by | |||
%% rebar_config during initialization | |||
{default_config, [ | |||
{app_modules, [ rebar_doterl_compiler ]} | |||
]} | |||
]} | |||
]}. |
@ -0,0 +1,4 @@ | |||
-record(global_state, { working_dir }). | |||
-define(CONSOLE(Str, Args), io:format(Str, Args)). |
@ -0,0 +1,151 @@ | |||
#!/usr/bin/env escript | |||
%% -*- erlang -*- | |||
%% ------------------------------------------------------------------- | |||
%% | |||
%% rebar: Erlang Build Tools | |||
%% | |||
%% Copyright (c) 2009 Dave Smith (dizzyd@dizzyd.com) | |||
%% | |||
%% Permission is hereby granted, free of charge, to any person obtaining a copy | |||
%% of this software and associated documentation files (the "Software"), to deal | |||
%% in the Software without restriction, including without limitation the rights | |||
%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
%% copies of the Software, and to permit persons to whom the Software is | |||
%% furnished to do so, subject to the following conditions: | |||
%% | |||
%% The above copyright notice and this permission notice shall be included in | |||
%% all copies or substantial portions of the Software. | |||
%% | |||
%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
%% THE SOFTWARE. | |||
%% ------------------------------------------------------------------- | |||
-include_lib("rebar/include/rebar.hrl"). | |||
main([CommandStr | _Args]) -> | |||
%% 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 | |||
%% recursion at an application or release directory. | |||
Cwd = rebar_utils:get_cwd(), | |||
case target_type(Cwd) of | |||
undefined -> | |||
Targets = find_targets(Cwd); | |||
{Type, Filename} -> | |||
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), | |||
%% Finally, apply the specified command to each target | |||
apply_command(FilteredTargets, Command); | |||
main(_) -> | |||
io:format("usage: rebar <command>\n"). | |||
%% | |||
%% Recursively find all the targets starting at a root directory | |||
%% | |||
find_targets(Root) -> | |||
{ok, Files} = file:list_dir(Root), | |||
find_targets(Files, Root, []). | |||
find_targets([], _Root, Acc) -> | |||
Acc; | |||
find_targets([F | Rest], Root, Acc) -> | |||
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); | |||
false -> | |||
Acc2 = Acc | |||
end; | |||
{Type, Filename} -> | |||
Acc2 = [{Type, AbsName, Filename} | Acc] | |||
end, | |||
find_targets(Rest, Root, Acc2). | |||
%% | |||
%% Determine the target type of a given file: app, rel or undefined | |||
%% | |||
target_type(AbsName) -> | |||
case rebar_app_utils:is_app_dir(AbsName) of | |||
{true, AppFile} -> | |||
{app, AppFile}; | |||
false -> | |||
case rebar_rel_utils:is_rel_dir(AbsName) of | |||
true -> | |||
{rel, ""}; | |||
false -> | |||
undefined | |||
end | |||
end. | |||
%% | |||
%% Given a command and target type, determine if the command is applicable | |||
%% | |||
valid_command(compile, app) -> true; | |||
valid_command(clean, _Any) -> true; | |||
valid_command(_, _) -> false. | |||
%% | |||
%% Add all application targets to the front of the code path | |||
%% | |||
update_code_path([]) -> | |||
ok; | |||
update_code_path([{app, Dir, _} | Rest]) -> | |||
EbinDir = filename:join([Dir, "ebin"]), | |||
true = code:add_patha(EbinDir), | |||
update_code_path(Rest); | |||
update_code_path([_ | Rest]) -> | |||
update_code_path(Rest). | |||
apply_command([], _Command) -> | |||
ok; | |||
apply_command([{Type, Dir, File} | Rest], Command) -> | |||
ok = file:set_cwd(Dir), | |||
Config = rebar_config:new(Dir), | |||
%% 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), | |||
case catch(run_modules(Modules, Command, Config, File)) of | |||
ok -> | |||
apply_command(Rest, Command); | |||
Other -> | |||
?CONSOLE("Execution of ~p failed while processing ~s: ~p", [Command, Dir, Other]) | |||
end. | |||
run_modules([], _Command, _Config, _File) -> | |||
ok; | |||
run_modules([Module | Rest], Command, Config, File) -> | |||
case Module:Command(Config, File) of | |||
ok -> | |||
run_modules(Rest, Command, Config, File); | |||
{error, Reason} -> | |||
{error, Reason} | |||
end. |
@ -0,0 +1,39 @@ | |||
%% ------------------------------------------------------------------- | |||
%% | |||
%% rebar: Erlang Build Tools | |||
%% | |||
%% Copyright (c) 2009 Dave Smith (dizzyd@dizzyd.com) | |||
%% | |||
%% Permission is hereby granted, free of charge, to any person obtaining a copy | |||
%% of this software and associated documentation files (the "Software"), to deal | |||
%% in the Software without restriction, including without limitation the rights | |||
%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
%% copies of the Software, and to permit persons to whom the Software is | |||
%% furnished to do so, subject to the following conditions: | |||
%% | |||
%% The above copyright notice and this permission notice shall be included in | |||
%% all copies or substantial portions of the Software. | |||
%% | |||
%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
%% THE SOFTWARE. | |||
%% ------------------------------------------------------------------- | |||
-module(rebar_app_utils). | |||
-export([is_app_dir/0, is_app_dir/1]). | |||
is_app_dir() -> | |||
is_app_dir(rebar_util:get_cwd()). | |||
is_app_dir(Dir) -> | |||
Fname = filename:join([Dir, "ebin/*.app"]), | |||
case filelib:wildcard(Fname) of | |||
[AppFile] -> | |||
{true, AppFile}; | |||
_ -> | |||
false | |||
end. |
@ -0,0 +1,44 @@ | |||
%% ------------------------------------------------------------------- | |||
%% | |||
%% rebar: Erlang Build Tools | |||
%% | |||
%% Copyright (c) 2009 Dave Smith (dizzyd@dizzyd.com) | |||
%% | |||
%% Permission is hereby granted, free of charge, to any person obtaining a copy | |||
%% of this software and associated documentation files (the "Software"), to deal | |||
%% in the Software without restriction, including without limitation the rights | |||
%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
%% copies of the Software, and to permit persons to whom the Software is | |||
%% furnished to do so, subject to the following conditions: | |||
%% | |||
%% The above copyright notice and this permission notice shall be included in | |||
%% all copies or substantial portions of the Software. | |||
%% | |||
%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
%% THE SOFTWARE. | |||
%% ------------------------------------------------------------------- | |||
-module(rebar_config). | |||
-export([new/1, | |||
get_modules/2]). | |||
-record(config, { dir, | |||
opts }). | |||
new(Dir) -> | |||
{ok, DefaultConfig} = application:get_env(rebar, default_config), | |||
#config { dir = Dir, | |||
opts = orddict:from_list(DefaultConfig)}. | |||
get_modules(Config, app) -> | |||
case orddict:find(app_modules, Config#config.opts) of | |||
error -> | |||
[]; | |||
{ok, Modules} -> | |||
Modules | |||
end. |
@ -0,0 +1,46 @@ | |||
%% ------------------------------------------------------------------- | |||
%% | |||
%% rebar: Erlang Build Tools | |||
%% | |||
%% Copyright (c) 2009 Dave Smith (dizzyd@dizzyd.com) | |||
%% | |||
%% Permission is hereby granted, free of charge, to any person obtaining a copy | |||
%% of this software and associated documentation files (the "Software"), to deal | |||
%% in the Software without restriction, including without limitation the rights | |||
%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
%% copies of the Software, and to permit persons to whom the Software is | |||
%% furnished to do so, subject to the following conditions: | |||
%% | |||
%% The above copyright notice and this permission notice shall be included in | |||
%% all copies or substantial portions of the Software. | |||
%% | |||
%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
%% THE SOFTWARE. | |||
%% ------------------------------------------------------------------- | |||
-module(rebar_doterl_compiler). | |||
-export([compile/2, | |||
clean/2]). | |||
-include("rebar.hrl"). | |||
%% =================================================================== | |||
%% Public API | |||
%% =================================================================== | |||
compile(Config, Dir) -> | |||
io:format(".erl compiling: ~s\n", [Dir]), | |||
ok. | |||
clean(Config, Dir) -> | |||
rebar_utils:delete_files("ebin/*.beam"). | |||
%% =================================================================== | |||
%% Internal functions | |||
%% =================================================================== |
@ -0,0 +1,38 @@ | |||
%% ------------------------------------------------------------------- | |||
%% | |||
%% rebar: Erlang Build Tools | |||
%% | |||
%% Copyright (c) 2009 Dave Smith (dizzyd@dizzyd.com) | |||
%% | |||
%% Permission is hereby granted, free of charge, to any person obtaining a copy | |||
%% of this software and associated documentation files (the "Software"), to deal | |||
%% in the Software without restriction, including without limitation the rights | |||
%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
%% copies of the Software, and to permit persons to whom the Software is | |||
%% furnished to do so, subject to the following conditions: | |||
%% | |||
%% The above copyright notice and this permission notice shall be included in | |||
%% all copies or substantial portions of the Software. | |||
%% | |||
%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
%% THE SOFTWARE. | |||
%% ------------------------------------------------------------------- | |||
-module(rebar_rel_utils). | |||
-export([is_rel_dir/0, is_rel_dir/1]). | |||
is_rel_dir() -> | |||
is_rel_dir(rebar_util:get_cwd()). | |||
is_rel_dir(Dir) -> | |||
case filelib:wildcard("*.rel") of | |||
[_File] -> | |||
true; | |||
_ -> | |||
false | |||
end. |
@ -0,0 +1,31 @@ | |||
%% ------------------------------------------------------------------- | |||
%% | |||
%% rebar: Erlang Build Tools | |||
%% | |||
%% Copyright (c) 2009 Dave Smith (dizzyd@dizzyd.com) | |||
%% | |||
%% Permission is hereby granted, free of charge, to any person obtaining a copy | |||
%% of this software and associated documentation files (the "Software"), to deal | |||
%% in the Software without restriction, including without limitation the rights | |||
%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
%% copies of the Software, and to permit persons to whom the Software is | |||
%% furnished to do so, subject to the following conditions: | |||
%% | |||
%% The above copyright notice and this permission notice shall be included in | |||
%% all copies or substantial portions of the Software. | |||
%% | |||
%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
%% THE SOFTWARE. | |||
%% ------------------------------------------------------------------- | |||
-module(rebar_utils). | |||
-export([get_cwd/0]). | |||
get_cwd() -> | |||
{ok, Dir} = file:get_cwd(), | |||
Dir. |