diff --git a/src/eMake.erl b/src/eMake.erl index 43797de..23888a6 100644 --- a/src/eMake.erl +++ b/src/eMake.erl @@ -34,7 +34,10 @@ main(Args) -> end. eMakeFile() -> - filename:join(code:root_dir(), ".eMake.log"). + {ok, CurDir} = file:get_cwd(), + Md5 = erlang:md5(CurDir), + Hex = [(io_lib:format("~2.36.0B", [X])) || <> <= Md5], + filename:join(code:root_dir(), [".eMake/" | Hex]). readEMake() -> try {ok, [LastTime]} = file:consult(eMakeFile()), LastTime of @@ -45,7 +48,10 @@ readEMake() -> end. saveEMake(NowTime) -> - try file:write_file(eMakeFile(), <<(integer_to_binary(NowTime))/binary, ".">>) + try + FileName = eMakeFile(), + filelib:ensure_dir(FileName), + file:write_file(FileName, <<(integer_to_binary(NowTime))/binary, ".">>) catch _:_ -> ok end. @@ -57,15 +63,15 @@ all(WorkerCnt, EMakeFile, Opts) -> {ok, Files} -> forMake(Files, WorkerCnt, lists:member(noexec, MakeOpts), load_opt(MakeOpts), []), EndTime = erlang:system_time(second), - % LastTime = readEMake(), - % case LastTime /= 0 andalso StartTime < LastTime of - % true -> - % %% StartTime < LastTime 当前系统时间比历史编译时间小的时候 可能往回调过时间 所以要全编译 - % put(compile_all, 1); - % _ -> - % ignore - % end, - % saveEMake(EndTime), + LastTime = readEMake(), + case LastTime /= 0 andalso StartTime < LastTime of + true -> + %% StartTime < LastTime 当前系统时间比历史编译时间小的时候 可能往回调过时间 所以要全编译 + put(compile_all, 1); + _ -> + ignore + end, + saveEMake(EndTime), io:format("compile over all is ok use time:~ps", [EndTime - StartTime]); _Err -> _Err @@ -132,16 +138,29 @@ transform([{Mod, ModOpts} | EMake], Opts, Files) -> [] -> transform(EMake, Opts, Files); Mods -> - transform(EMake, Opts, [{Mods, Opts ++ ModOpts} | Files]) + NewOpts = Opts ++ ModOpts, + ensure_dir(NewOpts), + transform(EMake, Opts, [{Mods, NewOpts} | Files]) end; transform([Mod | EMake], Opts, Files) -> case expand(Mod) of [] -> transform(EMake, Opts, Files); Mods -> + ensure_dir(Opts), transform(EMake, Opts, [{Mods, Opts} | Files]) end. +ensure_dir(Opts) -> + case lists:keysearch(outdir, 1, Opts) of + {value, {outdir, OutDir}} -> + BeamDir = filename:join(OutDir, "tttt.beam"), + filelib:ensure_dir(BeamDir); + _ -> + ignore + end. + + expand(Mod) when is_atom(Mod) -> expand(atom_to_list(Mod)); expand(Mods) when is_list(Mods), not is_integer(hd(Mods)) ->