5
main([IncludeDir, ErlDir, EbinDir, TargetFile]) ->
6
ErlDirContents = filelib:wildcard("*.erl", ErlDir),
7
ErlFiles = [filename:join(ErlDir, FileName) || FileName <- ErlDirContents],
5
%% We expect the list of Erlang source and header files to arrive on
6
%% stdin, with the entries colon-separated.
7
main([TargetFile, EbinDir]) ->
8
ErlsAndHrls = [ string:strip(S,left) ||
9
S <- string:tokens(io:get_line(""), ":\n")],
10
ErlFiles = [F || F <- ErlsAndHrls, lists:suffix(".erl", F)],
8
11
Modules = sets:from_list(
9
12
[list_to_atom(filename:basename(FileName, ".erl")) ||
10
FileName <- ErlDirContents]),
11
Headers = sets:from_list(
12
[filename:join(IncludeDir, FileName) ||
13
FileName <- filelib:wildcard("*.hrl", IncludeDir)]),
13
FileName <- ErlFiles]),
14
HrlFiles = [F || F <- ErlsAndHrls, lists:suffix(".hrl", F)],
15
IncludeDirs = lists:usort([filename:dirname(Path) || Path <- HrlFiles]),
16
Headers = sets:from_list(HrlFiles),
14
17
Deps = lists:foldl(
15
18
fun (Path, Deps1) ->
16
dict:store(Path, detect_deps(IncludeDir, EbinDir,
19
dict:store(Path, detect_deps(IncludeDirs, EbinDir,
17
20
Modules, Headers, Path),
19
22
end, dict:new(), ErlFiles),
33
36
ok = file:sync(Hdl),
34
37
ok = file:close(Hdl).
36
detect_deps(IncludeDir, EbinDir, Modules, Headers, Path) ->
37
{ok, Forms} = epp:parse_file(Path, [IncludeDir], [{use_specs, true}]),
39
detect_deps(IncludeDirs, EbinDir, Modules, Headers, Path) ->
40
{ok, Forms} = epp:parse_file(Path, IncludeDirs, [{use_specs, true}]),
39
42
fun ({attribute, _LineNumber, Attribute, Behaviour}, Deps)
40
43
when Attribute =:= behaviour orelse Attribute =:= behavior ->