diff --git a/src/eMake.erl b/src/eMake.erl index 4948240..a6bea7f 100644 --- a/src/eMake.erl +++ b/src/eMake.erl @@ -67,14 +67,15 @@ do_make_files(Worker, Fs, Opts) -> %io:format("worker:~p~nfs:~p~nopts:~p~n", [Worker, Fs, Opts]), process(Fs, Worker, lists:member(noexec, Opts), load_opt(Opts)). - %%% 读取给定的 Emakefile 并返回一个元组列表: [{Mods,Opts}] %%% %%% Mods 是模块名称(字符串)的列表 %%% %%% Opts 是编译 Mods 时要使用的选项列表 readEMakefile(EMakefile, Opts) -> case file:consult(EMakefile) of {ok, EMake} -> - transform(EMake, Opts, [], []); + Ret = transform(EMake, Opts, []), + erase(), + Ret; {error, enoent} -> %% 没有EMakefile 仅仅编译当前没有了下的文件 如果想要编译所有子目录下的文件 使用 filelib:wildcard("./**/*.erl") Mods = [filename:rootname(F) || F <- filelib:wildcard("*.erl")], @@ -84,43 +85,49 @@ readEMakefile(EMakefile, Opts) -> error end. -transform([{Mod, ModOpts} | Emake], Opts, Files, Already) -> - case expand(Mod, Already) of +transform([], _Opts, Files) -> + lists:reverse(Files); +transform([{Mod, ModOpts} | EMake], Opts, Files) -> + case expand(Mod) of [] -> - transform(Emake, Opts, Files, Already); + transform(EMake, Opts, Files); Mods -> - transform(Emake, Opts, [{Mods, ModOpts ++ Opts} | Files], Mods ++ Already) + transform(EMake, Opts, [{Mods, ModOpts ++ Opts} | Files]) end; -transform([Mod | Emake], Opts, Files, Already) -> - case expand(Mod, Already) of +transform([Mod | EMake], Opts, Files) -> + case expand(Mod) of [] -> - transform(Emake, Opts, Files, Already); + transform(EMake, Opts, Files); Mods -> - transform(Emake, Opts, [{Mods, Opts} | Files], Mods ++ Already) - end; -transform([], _Opts, Files, _Already) -> - lists:reverse(Files). + transform(EMake, Opts, [{Mods, Opts} | Files]) + end. -expand(Mod, Already) when is_atom(Mod) -> - expand(atom_to_list(Mod), Already); -expand(Mods, Already) when is_list(Mods), not is_integer(hd(Mods)) -> - lists:concat([expand(Mod, Already) || Mod <- Mods]); -expand(Mod, Already) -> +expand(Mod) when is_atom(Mod) -> + expand(atom_to_list(Mod)); +expand(Mods) when is_list(Mods), not is_integer(hd(Mods)) -> + lists:append([expand(Mod) || Mod <- Mods]); +expand(Mod) -> case lists:member($*, Mod) of true -> Fun = fun(F, Acc) -> M = filename:rootname(F), - case lists:member(M, Already) of - true -> Acc; - false -> [M | Acc] + case get(M) of + undefined -> + put(M, 1), + [M | Acc]; + _ -> + Acc end end, lists:foldl(Fun, [], filelib:wildcard(Mod ++ ".erl")); - false -> + _ -> Mod2 = filename:rootname(Mod, ".erl"), - case lists:member(Mod2, Already) of - true -> []; - false -> [Mod2] + case get(Mod2) of + undefined -> + put(M, 1), + [Mod2]; + _ -> + [] end end.