diff options
Diffstat (limited to 'src/rebar_erlc_compiler.erl')
-rw-r--r-- | src/rebar_erlc_compiler.erl | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/src/rebar_erlc_compiler.erl b/src/rebar_erlc_compiler.erl new file mode 100644 index 0000000..1c157f6 --- /dev/null +++ b/src/rebar_erlc_compiler.erl @@ -0,0 +1,108 @@ +%% ------------------------------------------------------------------- +%% +%% 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_erlc_compiler). + +-export([compile/2, + clean/2]). + +-include("rebar.hrl"). + +%% =================================================================== +%% Public API +%% =================================================================== + +compile(Config, Dir) -> + 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) -> + %% TODO: This would be more portable if it used Erlang to traverse + %% the dir structure and delete each file; however it would also + %% much slower. + [] = os:cmd("rm -f ebin/*.beam 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 = rebar_config:get_list(Config, mibc_opts, []), + case snmpc:compile(Source, [{outdir, "priv/mibs"}, {i, ["priv/mibs"]}] ++ Opts) of + {ok, _} -> + ok; + {error, compilation_failed} -> + ?FAIL + end. |