Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
dizzyd committed Nov 25, 2009
0 parents commit b7e2088
Show file tree
Hide file tree
Showing 10 changed files with 403 additions and 0 deletions.
2 changes: 2 additions & 0 deletions Emakefile
@@ -0,0 +1,2 @@

{'src/*', [{i, "include"}, {outdir, "ebin"}]}.
28 changes: 28 additions & 0 deletions NOTES.org
@@ -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 changes: 20 additions & 0 deletions ebin/rebar.app
@@ -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 changes: 4 additions & 0 deletions include/rebar.hrl
@@ -0,0 +1,4 @@

-record(global_state, { working_dir }).

-define(CONSOLE(Str, Args), io:format(Str, Args)).
151 changes: 151 additions & 0 deletions priv/rebar
@@ -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 changes: 39 additions & 0 deletions src/rebar_app_utils.erl
@@ -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 changes: 44 additions & 0 deletions src/rebar_config.erl
@@ -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.
46 changes: 46 additions & 0 deletions src/rebar_doterl_compiler.erl
@@ -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 changes: 38 additions & 0 deletions src/rebar_rel_utils.erl
@@ -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 comments on commit b7e2088

Please sign in to comment.