diff options
| author | Matthew Sackman <matthew@lshift.net> | 2010-01-26 12:27:32 +0000 |
|---|---|---|
| committer | Matthew Sackman <matthew@lshift.net> | 2010-01-26 12:27:32 +0000 |
| commit | ee7fbe8e162494c532fb72585b9edbf60ae65ac3 (patch) | |
| tree | 58013747fa684aaeaae3ce7923983e3866875732 | |
| parent | 9087606d4bba1b6b44c0b9232373084d9bc7ea27 (diff) | |
| download | rabbitmq-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-- | Makefile | 3 | ||||
| -rw-r--r-- | generate_deps | 70 |
2 files changed, 29 insertions, 44 deletions
@@ -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). |
