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