summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Smith <dizzyd@dizzyd.com>2009-11-25 16:03:14 -0700
committerDave Smith <dizzyd@dizzyd.com>2009-11-25 16:03:14 -0700
commite52bb6783c34e1bacd419d787ee8fbad0a394624 (patch)
treebdc0a2025deb4ed514dc4e35985fc730b6f6c4c9
parentb7e2088c273708bd5ce46b3c135c20f2229c7ccf (diff)
Getting basic erlang compilation working
-rw-r--r--include/rebar.hrl2
-rwxr-xr-xpriv/rebar2
-rw-r--r--src/rebar_config.erl12
-rw-r--r--src/rebar_doterl_compiler.erl65
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.