Skip to content

Instantly share code, notes, and snippets.

@dysinger
Created December 18, 2009 16:00
Show Gist options
  • Select an option

  • Save dysinger/259583 to your computer and use it in GitHub Desktop.

Select an option

Save dysinger/259583 to your computer and use it in GitHub Desktop.
#!/usr/bin/env escript
%% -*- erlang -*-
%% TODO make it so tasks only happen once
%% TODO discover 'app' files & figure out the dep order
paths() ->
{ok,Cwd} = file:get_cwd(),
filelib:wildcard(filename:join([Cwd,"lib","*"])).
projects() ->
[filename:basename(filename:dirname(X)) || X <- paths()].
%% Main Build Script
main([]) -> do(compile);
main(Tasks) -> [do(list_to_atom(Task)) || Task <- Tasks].
do(clean) ->
[[file:delete(F) ||
F <- filelib:wildcard(filename:join([P,"*","*.{beam}"]))] ||
P <- paths()];
do(setup) ->
lists:foreach(fun(P) ->
E=filename:join(P,"ebin"),
file:make_dir(E),
code:add_patha(E)
end,
paths());
do(compile) ->
do(setup),
lists:foreach(fun(P) ->
S=filename:join(P,"src"),
E=filename:join(P,"ebin"),
make:files(filelib:wildcard(filename:join(S,"*.erl")),
[{outdir,E}]),
%% Begin: Compile LFE code
[case eval("lfe_comp:file(X,[report,{outdir,E}]).",
[{'X',X},{'E',E}]) of
error -> halt(1);
{ok,_} -> ok
end ||
X <- filelib:wildcard(filename:join(S,"*.lfe"))],
%% End: Compile LFE code
[{ok,_}=file:copy(filename:join(S,X),
filename:join(E,X)) ||
X <- filelib:wildcard("*.app",S)]
end,
paths());
do(doc) ->
do(compile),
[edoc:application(list_to_atom(P)) || P <- projects()];
do(test) ->
do(compile),
[eunit:test({application,list_to_atom(P)}) || P <- projects()];
do(_) -> io:format("Read the script!~n").
%% Utils
eval(Code,Args) ->
{ok,Scanned,_}=erl_scan:string(Code),
{ok,Parsed}=erl_parse:parse_exprs(Scanned),
Bindings=lists:foldl(fun({Key,Val},Acc) ->
erl_eval:add_binding(Key,Val,Acc)
end,erl_eval:new_bindings(),Args),
{value,Result,_}=erl_eval:exprs(Parsed,Bindings),
Result.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment