summaryrefslogtreecommitdiff
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
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
-rw-r--r--Makefile3
-rw-r--r--generate_deps70
2 files changed, 29 insertions, 44 deletions
diff --git a/Makefile b/Makefile
index 2c376069c0..866db51c5f 100644
--- a/Makefile
+++ b/Makefile
@@ -70,9 +70,6 @@ $(EBIN_DIR)/%.beam: $(SOURCE_DIR)/%.erl
erlc $(ERLC_OPTS) -pa $(EBIN_DIR) $<
# ERLC_EMULATOR="erl -smp" erlc $(ERLC_OPTS) -pa $(EBIN_DIR) $<
-$(INCLUDE_DIR)/%.hrl:
- @touch $@
-
$(INCLUDE_DIR)/rabbit_framing.hrl: codegen.py $(AMQP_CODEGEN_DIR)/amqp_codegen.py $(AMQP_SPEC_JSON_PATH)
$(PYTHON) codegen.py header $(AMQP_SPEC_JSON_PATH) $@
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).