Skip to content

Commit

Permalink
Getting basic erlang compilation working
Browse files Browse the repository at this point in the history
  • Loading branch information
dizzyd committed Nov 25, 2009
1 parent b7e2088 commit e52bb67
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 5 deletions.
2 changes: 2 additions & 0 deletions include/rebar.hrl
Expand Up @@ -2,3 +2,5 @@
-record(global_state, { working_dir }). -record(global_state, { working_dir }).


-define(CONSOLE(Str, Args), io:format(Str, Args)). -define(CONSOLE(Str, Args), io:format(Str, Args)).

-define(FAIL, throw({error, failed})).
2 changes: 1 addition & 1 deletion priv/rebar
Expand Up @@ -136,7 +136,7 @@ apply_command([{Type, Dir, File} | Rest], Command) ->
ok -> ok ->
apply_command(Rest, Command); apply_command(Rest, Command);
Other -> Other ->
?CONSOLE("Execution of ~p failed while processing ~s: ~p", [Command, Dir, Other]) ?CONSOLE("~p failed while processing ~s: ~p", [Command, Dir, Other])
end. end.




Expand Down
12 changes: 11 additions & 1 deletion src/rebar_config.erl
Expand Up @@ -25,7 +25,8 @@
-module(rebar_config). -module(rebar_config).


-export([new/1, -export([new/1,
get_modules/2]). get_modules/2,
get_list/3]).


-record(config, { dir, -record(config, { dir,
opts }). opts }).
Expand All @@ -42,3 +43,12 @@ get_modules(Config, app) ->
{ok, Modules} -> {ok, Modules} ->
Modules Modules
end. end.

get_list(Config, Key, Default) ->
case orddict:find(Key, Config#config.opts) of
error ->
Default;
{ok, List} ->
List
end.

65 changes: 62 additions & 3 deletions src/rebar_doterl_compiler.erl
Expand Up @@ -34,13 +34,72 @@
%% =================================================================== %% ===================================================================


compile(Config, Dir) -> compile(Config, Dir) ->
io:format(".erl compiling: ~s\n", [Dir]), do_compile(Config, "src/*.erl", "ebin", ".erl", ".beam",
ok. fun compile_erl/2),
do_compile(Config, "mibs/*.mib", "priv/mibs", ".mib", ".bin",
fun compile_mib/2).


clean(Config, Dir) -> clean(Config, Dir) ->
rebar_utils:delete_files("ebin/*.beam"). % rebar_utils:delete_files("ebin/*.beam"),
% rebar_utils:delete_files("priv/mibs/*.bin").
ok.




%% =================================================================== %% ===================================================================
%% Internal functions %% Internal functions
%% =================================================================== %% ===================================================================

do_compile(Config, SrcWildcard, OutDir, InExt, OutExt, CompileFn) ->
case filelib:wildcard(SrcWildcard) of
[] ->
ok;
Srcs when is_list(Srcs) ->
%% Build list of output files
Targets = [target_file(S, OutDir, InExt, OutExt) || S <- Srcs],
Files = lists:zip(Targets, Srcs),

%% Make sure target directory exists
ok = filelib:ensure_dir(hd(Targets)),

%% Start compiling
compile_each(Files, Config, CompileFn)
end.


compile_each([], _Config, _CompileFn) ->
ok;
compile_each([{Target, Src} | Rest], Config, CompileFn) ->
case needs_compile(Target, Src) of
true ->
?CONSOLE("Compiling ~s\n", [Src]),
CompileFn(Src, Config);
false ->
ok
end,
compile_each(Rest, Config, CompileFn).

needs_compile(Target, Src) ->
filelib:last_modified(Target) < filelib:last_modified(Src).


target_file(F, TargetDir, InExt, OutExt) ->
filename:join([TargetDir, filename:basename(F, InExt) ++ OutExt]).


compile_erl(Source, Config) ->
Opts = rebar_config:get_list(Config, erlc_opts, []),
case compile:file(Source, [{i, "include"}, {outdir, "ebin"}, report] ++ Opts) of
{ok, _} ->
ok;
error ->
?FAIL
end.

compile_mib(Source, Config) ->
Opts = meab_config:get_list(mibc_opts, []),
case snmpc:compile(Source, [{outdir, "priv/mibs"}, {i, ["priv/mibs"]}] ++ Opts) of
{ok, _} ->
ok;
{error, compilation_failed} ->
?FAIL
end.

0 comments on commit e52bb67

Please sign in to comment.