summaryrefslogtreecommitdiff
path: root/generate_deps
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@lshift.net>2010-01-29 15:04:07 +0000
committerMatthias Radestock <matthias@lshift.net>2010-01-29 15:04:07 +0000
commitc48aec6cfdcdbf0c61182d442ea6c064e75e81d7 (patch)
tree839f288735882bb7cd0c99359925bc80779f1af9 /generate_deps
parente90ccbba252da857b3d7da5dd932dc3e4a12d356 (diff)
downloadrabbitmq-server-c48aec6cfdcdbf0c61182d442ea6c064e75e81d7.tar.gz
automatic, and accurate, make dependencies
...taking into account includes and behaviours This code was originally committed as part of bug21673
Diffstat (limited to 'generate_deps')
-rw-r--r--generate_deps52
1 files changed, 52 insertions, 0 deletions
diff --git a/generate_deps b/generate_deps
new file mode 100644
index 00000000..916006d1
--- /dev/null
+++ b/generate_deps
@@ -0,0 +1,52 @@
+#!/usr/bin/env escript
+%% -*- erlang -*-
+-mode(compile).
+
+main([IncludeDir, ErlDir, EbinDir, TargetFile]) ->
+ ErlDirContents = filelib:wildcard("*.erl", ErlDir),
+ ErlFiles = [filename:join(ErlDir, FileName) || FileName <- ErlDirContents],
+ Modules = sets:from_list(
+ [list_to_atom(filename:basename(FileName, ".erl")) ||
+ FileName <- ErlDirContents]),
+ Headers = sets:from_list(
+ [filename:join(IncludeDir, FileName) ||
+ FileName <- filelib:wildcard("*.hrl", IncludeDir)]),
+ Deps = lists:foldl(
+ fun (Path, Deps1) ->
+ dict:store(Path, detect_deps(IncludeDir, EbinDir,
+ Modules, Headers, Path),
+ Deps1)
+ end, dict:new(), ErlFiles),
+ {ok, Hdl} = file:open(TargetFile, [write, delayed_write]),
+ dict:fold(
+ fun (_Path, [], ok) ->
+ ok;
+ (Path, Dep, ok) ->
+ Module = filename:basename(Path, ".erl"),
+ ok = file:write(Hdl, [EbinDir, "/", Module, ".beam:"]),
+ ok = sets:fold(fun (E, ok) -> file:write(Hdl, [" ", E]) end,
+ ok, Dep),
+ file:write(Hdl, [" ", ErlDir, "/", Module, ".erl\n"])
+ end, ok, Deps),
+ ok = file:write(Hdl, [TargetFile, ": ", escript:script_name(), "\n"]),
+ ok = file:sync(Hdl),
+ ok = file:close(Hdl).
+
+detect_deps(IncludeDir, EbinDir, Modules, Headers, Path) ->
+ {ok, Forms} = epp:parse_file(Path, [IncludeDir], [{use_specs, true}]),
+ lists:foldl(
+ fun ({attribute, _LineNumber, behaviour, Behaviour}, Deps) ->
+ case sets:is_element(Behaviour, Modules) of
+ true -> sets:add_element(
+ [EbinDir, "/", atom_to_list(Behaviour), ".beam"],
+ Deps);
+ false -> Deps
+ end;
+ ({attribute, _LineNumber, file, {FileName, _LineNumber1}}, Deps) ->
+ case sets:is_element(FileName, Headers) of
+ true -> sets:add_element(FileName, Deps);
+ false -> Deps
+ end;
+ (_Form, Deps) ->
+ Deps
+ end, sets:new(), Forms).