From e52bb6783c34e1bacd419d787ee8fbad0a394624 Mon Sep 17 00:00:00 2001 From: Dave Smith Date: Wed, 25 Nov 2009 16:03:14 -0700 Subject: [PATCH] Getting basic erlang compilation working --- include/rebar.hrl | 2 ++ priv/rebar | 2 +- src/rebar_config.erl | 12 ++++++- src/rebar_doterl_compiler.erl | 65 +++++++++++++++++++++++++++++++++-- 4 files changed, 76 insertions(+), 5 deletions(-) diff --git a/include/rebar.hrl b/include/rebar.hrl index 2584f9d..4b75577 100644 --- a/include/rebar.hrl +++ b/include/rebar.hrl @@ -2,3 +2,5 @@ -record(global_state, { working_dir }). -define(CONSOLE(Str, Args), io:format(Str, Args)). + +-define(FAIL, throw({error, failed})). diff --git a/priv/rebar b/priv/rebar index b30a722..f911966 100755 --- a/priv/rebar +++ b/priv/rebar @@ -136,7 +136,7 @@ apply_command([{Type, Dir, File} | Rest], Command) -> ok -> apply_command(Rest, Command); Other -> - ?CONSOLE("Execution of ~p failed while processing ~s: ~p", [Command, Dir, Other]) + ?CONSOLE("~p failed while processing ~s: ~p", [Command, Dir, Other]) end. diff --git a/src/rebar_config.erl b/src/rebar_config.erl index a6ad5b2..077de75 100644 --- a/src/rebar_config.erl +++ b/src/rebar_config.erl @@ -25,7 +25,8 @@ -module(rebar_config). -export([new/1, - get_modules/2]). + get_modules/2, + get_list/3]). -record(config, { dir, opts }). @@ -42,3 +43,12 @@ get_modules(Config, app) -> {ok, Modules} -> Modules end. + +get_list(Config, Key, Default) -> + case orddict:find(Key, Config#config.opts) of + error -> + Default; + {ok, List} -> + List + end. + diff --git a/src/rebar_doterl_compiler.erl b/src/rebar_doterl_compiler.erl index 91828cd..cf345cd 100644 --- a/src/rebar_doterl_compiler.erl +++ b/src/rebar_doterl_compiler.erl @@ -34,13 +34,72 @@ %% =================================================================== compile(Config, Dir) -> - io:format(".erl compiling: ~s\n", [Dir]), - ok. + do_compile(Config, "src/*.erl", "ebin", ".erl", ".beam", + fun compile_erl/2), + do_compile(Config, "mibs/*.mib", "priv/mibs", ".mib", ".bin", + fun compile_mib/2). 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 %% =================================================================== + +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.