mad_systools.erl 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. -module(mad_systools).
  2. -description("ERTS releases with systools").
  3. -compile(export_all).
  4. % beam releases
  5. scripts(N) ->
  6. mad_repl:load(),
  7. {ok,Bin} = mad_repl:load_file("priv/systools/start"),
  8. [{"bin/start",list_to_binary(re:replace(binary_to_list(Bin),"{release}",N,[global,{return,list}]))},
  9. {"bin/attach",element(2,mad_repl:load_file("priv/systools/attach"))},
  10. {"bin/daemon",element(2,mad_repl:load_file("priv/systools/daemon"))},
  11. {"etc/"++N++".boot",N++".boot"},
  12. {"etc/vm.args","vm.args"},
  13. {"etc/sys.config","sys.config"}].
  14. apps(List) ->
  15. lists:flatten([[[ {filename:join([lib,
  16. lists:concat([App,"-",Version]),Class,filename:basename(F)]),F}
  17. || F <- mad_repl:wildcards([filename:join([Dir,Class,"*"])]) ]
  18. || {App,{Version,Dir}} <- List ] || Class <- [ebin,priv] ]).
  19. release(Name) ->
  20. Triples = mad_resolve:triples(),
  21. Apps = lists:usort(fun({Name1,_},{Name2,_})-> Name1 =< Name2 end,
  22. [{A,{B,F}}||{_,A,{B,F}}<-Triples]) ++
  23. [{kernel,{proplists:get_value(vsn,element(2,
  24. application:get_all_key(kernel)),[]),
  25. filename:absname(code:lib_dir(kernel))}}],
  26. Sorted = [ lists:keyfind(A,1,Apps) || A <- element(2,mad_resolve:orderapps())],
  27. {L,R} = lists:unzip(Sorted),
  28. {Ver,_Dir} = lists:unzip(R),
  29. NameVer = [ X || X <- lists:zip(L,Ver), element(1,X) /= active,
  30. element(1,X) /= fs ],
  31. Version = case lists:keyfind(list_to_atom(Name),2,Triples) of
  32. {_,_,{Vsn,_}} -> Vsn;
  33. _ -> "1" end,
  34. {{release,{Name,Version},{erts,erlang:system_info(version)},NameVer},Sorted}.
  35. beam_release(N) ->
  36. mad_resolve:main([]),
  37. Directories = mad_repl:wildcards(["{deps,apps}/*/ebin","ebin"]),
  38. code:add_paths(Directories),
  39. {Release,Apps} = release(N),
  40. file:write_file(N ++ ".rel",io_lib:format("~p.",[Release])),
  41. Res = systools:make_script(N),
  42. % systools:make_tar(N),
  43. Files = [ {"/bin/" ++ filename:basename(F), F}
  44. || F <- mad_repl:wildcards([code:root_dir() ++
  45. "/erts-" ++ erlang:system_info(version) ++
  46. "/bin/{epmd,erlexec,run_erl,to_erl,escript,beam.smp,erl_child_setup,inet_gethost}"]) ] ++
  47. apps(Apps) ++ scripts(N),
  48. erl_tar:create(N ++ ".tgz",Files,[compressed]),
  49. mad:info("~s.boot: ~p~n",[N,Res]),
  50. {ok,N}.