Initial commit

This commit is contained in:
Dave Smith 2009-11-25 15:23:42 -07:00
commit b7e2088c27
10 changed files with 403 additions and 0 deletions

2
Emakefile Normal file
View file

@ -0,0 +1,2 @@
{'src/*', [{i, "include"}, {outdir, "ebin"}]}.

28
NOTES.org Normal file
View file

@ -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 ?!

20
ebin/rebar.app Normal file
View file

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

4
include/rebar.hrl Normal file
View file

@ -0,0 +1,4 @@
-record(global_state, { working_dir }).
-define(CONSOLE(Str, Args), io:format(Str, Args)).

151
priv/rebar Executable file
View file

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

39
src/rebar_app_utils.erl Normal file
View file

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

44
src/rebar_config.erl Normal file
View file

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

View file

@ -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
%% ===================================================================

38
src/rebar_rel_utils.erl Normal file
View file

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

31
src/rebar_utils.erl Normal file
View file

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