ninenines / erlang.mk

A build tool for Erlang that just works.
https://erlang.mk
ISC License
578 stars 241 forks source link

Build failure on OTP-27 #995

Closed essen closed 7 months ago

essen commented 7 months ago

Erlang.mk would fail with the following error:

Error! Failed to eval:  E = ets:new(makedep, [bag]),    G = digraph:new([acyclic]), ErlFiles = lists:usort(string:tokens("src/base32.erl", " ")),   DepsDir = "/home/runner/work/cowlib/cowlib/deps",   AppsDir = "/home/runner/work/cowlib/cowlib/apps",   DepsDirsSrc = " /home/runner/work/cowlib/cowlib/deps/base32/src /home/runner/work/cowlib/cowlib/deps/decimal/src /home/runner/work/cowlib/cowlib/deps/horse/src /home/runner/work/cowlib/cowlib/deps/jsx/src /home/runner/work/cowlib/cowlib/deps/proper/src",  DepsDirsInc = " /home/runner/work/cowlib/cowlib/deps/decimal/include /home/runner/work/cowlib/cowlib/deps/proper/include",  AppsDirsSrc = "",   AppsDirsInc = "",   DepsDirs = lists:usort(string:tokens(DepsDirsSrc++DepsDirsInc, " ")),   AppsDirs = lists:usort(string:tokens(AppsDirsSrc++AppsDirsInc, " ")),   Modules = [{list_to_atom(filename:basename(F, ".erl")), F} || F <- ErlFiles],   Add = fun (Mod, Dep) ->     case lists:keyfind(Dep, 1, Modules) of          false -> ok;            {_, DepFile} ->             {_, ModFile} = lists:keyfind(Mod, 1, Modules),              ets:insert(E, {ModFile, DepFile}),              digraph:add_vertex(G, Mod),             digraph:add_vertex(G, Dep),             digraph:add_edge(G, Mod, Dep)       end end,    AddHd = fun (F, Mod, DepFile) ->        case file:open(DepFile, [read]) of          {error, enoent} ->              ok;         {ok, Fd} ->             {_, ModFile} = lists:keyfind(Mod, 1, Modules),              case ets:match(E, {ModFile, DepFile}) of                    [] ->                       ets:insert(E, {ModFile, DepFile}),                      F(F, Fd, Mod,0);                    _ -> ok             end     end end,    SearchHrl = fun     F(_Hrl, []) -> {error,enoent};      F(Hrl, [Dir|Dirs]) ->           HrlF = filename:join([Dir,Hrl]),            case filelib:is_file(HrlF) of               true  ->                {ok, HrlF};             false -> F(Hrl,Dirs)            end end,    Attr = fun      (_F, Mod, behavior, Dep) ->         Add(Mod, Dep);      (_F, Mod, behaviour, Dep) ->            Add(Mod, Dep);      (_F, Mod, compile, {parse_transform, Dep}) ->           Add(Mod, Dep);      (_F, Mod, compile, Opts) when is_list(Opts) ->          case proplists:get_value(parse_transform, Opts) of              undefined -> ok;                Dep -> Add(Mod, Dep)            end;        (F, Mod, include, Hrl) ->           case SearchHrl(Hrl, ["src", "include",AppsDir,DepsDir]++AppsDirs++DepsDirs) of              {ok, FoundHrl} -> AddHd(F, Mod, FoundHrl);              {error, _} -> false         end;        (F, Mod, include_lib, Hrl) ->           case SearchHrl(Hrl, ["src", "include",AppsDir,DepsDir]++AppsDirs++DepsDirs) of              {ok, FoundHrl} -> AddHd(F, Mod, FoundHrl);              {error, _} -> false         end;        (F, Mod, import, {Imp, _}) ->           IsFile =                case lists:keyfind(Imp, 1, Modules) of                  false -> false;                 {_, FilePath} -> filelib:is_file(FilePath)              end,            case IsFile of              false -> ok;                true -> Add(Mod, Imp)           end;        (_, _, _, _) -> ok  end,    MakeDepend = fun        (F, Fd, Mod, StartLocation) ->          {ok, Filename} = file:pid2name(Fd),         case io:parse_erl_form(Fd, undefined, StartLocation) of             {ok, AbsData, EndLocation} ->                   case AbsData of                     {attribute, _, Key, Value} ->                           Attr(F, Mod, Key, Value),                           F(F, Fd, Mod, EndLocation);                     _ -> F(F, Fd, Mod, EndLocation)                 end;                {eof, _ } -> file:close(Fd);                {error, ErrorDescription } ->                   file:close(Fd);             {error, ErrorInfo, ErrorLocation} ->                    F(F, Fd, Mod, ErrorLocation)            end,            ok  end,    [begin      Mod = list_to_atom(filename:basename(F, ".erl")),       case file:open(F, [read]) of            {ok, Fd} -> MakeDepend(MakeDepend, Fd, Mod,0);          {error, enoent} -> ok       end end || F <- ErlFiles],  Depend = sofs:to_external(sofs:relation_to_family(sofs:relation(ets:tab2list(E)))), CompileFirst = [X || X <- lists:reverse(digraph_utils:topsort(G)), [] =/= digraph:in_neighbours(G, X)], TargetPath = fun(Target) ->     case lists:keyfind(Target, 1, Modules) of           false -> "";            {_, DepFile} ->             DirSubname = tl(string:tokens(filename:dirname(DepFile), "/")),             string:join(DirSubname ++ [atom_to_list(Target)], "/")      end end,    Output0 = [     "# Generated by Erlang.mk. Edit at your own risk!\n\n",     [[F, "::", [[" ", D] || D <- Deps], "; @touch $@\n"] || {F, Deps} <- Depend],       "\nCOMPILE_FIRST +=", [[" ", TargetPath(CF)] || CF <- CompileFirst], "\n"   ],  Output = case "é" of       [233] -> unicode:characters_to_binary(Output0);     _ -> Output0    end,    ok = file:write_file("base32.d", Output),   halt()

Runtime terminating during boot ({undef,[{file,pid2name,[<0.79.0>],[]},{erl_eval,do_apply,7,[{file,"erl_eval.erl"},{line,903}]},{erl_eval,expr,6,[{file,"erl_eval.erl"},{line,651}]},{erl_eval,exprs,6,[{file,"erl_eval.erl"},{line,277}]},{erl_eval,eval_lc1,7,[{file,"erl_eval.erl"},{line,932}]},{erl_eval,eval_generate,8,[{file,"erl_eval.erl"},{line,1006}]},{erl_eval,eval_lc,7,[{file,"erl_eval.erl"},{line,920}]},{erl_eval,exprs,6,[{file,"erl_eval.erl"},{line,277}]}]})

Crash dump is being written to: erl_crash.dump...done

The issue has already been resolved. Please update Erlang.mk using make erlang-mk.