summaryrefslogtreecommitdiff
path: root/generate_deps
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@lshift.net>2010-01-26 12:27:32 +0000
committerMatthew Sackman <matthew@lshift.net>2010-01-26 12:27:32 +0000
commitee7fbe8e162494c532fb72585b9edbf60ae65ac3 (patch)
tree58013747fa684aaeaae3ce7923983e3866875732 /generate_deps
parent9087606d4bba1b6b44c0b9232373084d9bc7ea27 (diff)
downloadrabbitmq-server-git-ee7fbe8e162494c532fb72585b9edbf60ae65ac3.tar.gz
Converted to get epp to do the transitive closure by giving it the include path. This all seems to work, but it does make deps generation nearly twice as slow
Diffstat (limited to 'generate_deps')
-rw-r--r--generate_deps70
1 files changed, 29 insertions, 41 deletions
diff --git a/generate_deps b/generate_deps
index 545f7affcc..98f07d4080 100644
--- a/generate_deps
+++ b/generate_deps
@@ -8,57 +8,45 @@ main([IncludeDir, ErlDir, TargetFile]) ->
Modules = sets:from_list(
[list_to_atom(filename:basename(FileName, ".erl")) ||
FileName <- ErlDirContents]),
- IncludeDirContents = filelib:wildcard("*.hrl", IncludeDir),
- HrlFiles = [filename:join(IncludeDir, FileName) ||
- FileName <- IncludeDirContents],
- Headers = sets:from_list(IncludeDirContents),
- Deps = lists:foldl(fun (Path, Deps1) ->
- dict:store(Path, detect_deps(Path), Deps1)
- end, dict:new(), ErlFiles ++ HrlFiles),
- Deps1 = dict:map(
- fun (_Path, Dep) ->
- lists:filter(
- fun ({module, Behaviour}) ->
- sets:is_element(Behaviour, Modules);
- ({include, Include}) ->
- sets:is_element(Include, Headers)
- end, Dep)
- end, Deps),
+ 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, 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) ->
- case lists:suffix(".hrl", Path) of
- false ->
- Module = filename:basename(Path, ".erl"),
- ok = file:write(Hdl, ["$(EBIN_DIR)/", Module, ".beam:"]),
- [write_deps(Hdl, IncludeDir, E) || E <- Dep],
- file:write(Hdl, [" ", ErlDir, "/", Module, ".erl\n"]);
- true ->
- ok = file:write(Hdl, [Path, ":"]),
- [write_deps(Hdl, IncludeDir, E) || E <- Dep],
- file:write(Hdl, "\n")
- end
- end, ok, Deps1),
+ Module = filename:basename(Path, ".erl"),
+ ok = file:write(Hdl, ["$(EBIN_DIR)/", 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).
-write_deps(Hdl, _IncludeDir, {module, Behaviour}) ->
- ok = file:write(Hdl, [" $(EBIN_DIR)/", atom_to_list(Behaviour), ".beam"]);
-write_deps(Hdl, IncludeDir, {include, Include}) ->
- ok = file:write(Hdl, [" ", IncludeDir, "/", Include]).
-
-detect_deps(Path) ->
- %% The easiest way to detect includes is to make them fail, so we
- %% deliberately do not set the include path here.
- {ok, Forms} = epp:parse_file(Path, [], [{use_specs, true}]),
+detect_deps(IncludeDir, Modules, Headers, Path) ->
+ {ok, Forms} = epp:parse_file(Path, [IncludeDir], [{use_specs, true}]),
lists:foldl(
fun ({attribute, _LineNumber, behaviour, Behaviour}, Deps) ->
- [{module, Behaviour} | Deps];
- ({error, {_LineNumber, epp, {include, file, Include}}}, Deps) ->
- [{include, Include} | Deps];
+ case sets:is_element(Behaviour, Modules) of
+ true -> sets:add_element(["$(EBIN_DIR)/",
+ atom_to_list(Behaviour),
+ ".beam"], Deps);
+ false -> Deps
+ end;
+ ({attribute, _LineNumber, file, {FileName, _LineNumber}}, Deps) ->
+ case sets:is_element(FileName, Headers) of
+ true -> sets:add_element(FileName, Deps);
+ false -> Deps
+ end;
(_Form, Deps) ->
Deps
- end, [], Forms).
+ end, sets:new(), Forms).