Browse Source

fresh new mad releases

Namdak Tonpa 9 years ago
parent
commit
de49b26150
8 changed files with 82 additions and 28 deletions
  1. 1 1
      include/mad.hrl
  2. BIN
      mad
  3. 3 0
      priv/systools/attach
  4. 10 0
      priv/systools/daemon
  5. 10 0
      priv/systools/start
  6. 1 1
      src/mad.erl
  7. 21 11
      src/mad_plan.erl
  8. 36 15
      src/mad_release.erl

+ 1 - 1
include/mad.hrl

@@ -1 +1 @@
--define(VERSION,"24debb").
+-define(VERSION,"e764be").

BIN
mad


+ 3 - 0
priv/systools/attach

@@ -0,0 +1,3 @@
+SCRIPT="$(dirname "$0")"
+ROOT="$(cd "$SCRIPT/.." && pwd)"
+"$ROOT/bin/to_erl" "$ROOT/log" "$ROOT/log"

+ 10 - 0
priv/systools/daemon

@@ -0,0 +1,10 @@
+SCRIPT="$(dirname "$0")"
+export EMU=beam
+export ROOT="$(cd "$SCRIPT/.." && pwd)"
+export ROOTDIR="$ROOT"
+export BINDIR="$ROOT/bin"
+export ERL_LIBS="$ROOT/lib"
+export LD_LIBRARY_PATH="$ROOT/lib:$LD_LIBRARY_PATH"
+VMARGS="$ROOT/etc/vm.args"
+CONFIG="$ROOT/etc/sys.config"
+"$ROOT/bin/run_erl" -daemon "$ROOT/log" "$ROOT/log" "exec $ROOT/bin/start"

+ 10 - 0
priv/systools/start

@@ -0,0 +1,10 @@
+SCRIPT="$(dirname "$0")"
+export EMU=beam
+export ROOT="$(cd "$SCRIPT/.." && pwd)"
+export ROOTDIR="$ROOT"
+export BINDIR="$ROOT/bin"
+export ERL_LIBS="$ROOT/lib"
+export LD_LIBRARY_PATH="$ROOT/lib:$LD_LIBRARY_PATH"
+VMARGS="$ROOT/etc/vm.args"
+CONFIG="$ROOT/etc/sys.config"
+"$BINDIR/erlexec" -boot "$ROOT/etc/{release}" -config "$CONFIG" -args_file "$VMARGS" ${1+"$@"}

+ 1 - 1
src/mad.erl

@@ -8,7 +8,7 @@ main([]) -> help();
 main(Params) ->
 
     {Other,FP} = mad_utils:fold_params(Params),
-    %mad:info("Params: ~p~n",[FP]),
+    mad:info("code:lib_dir/0: ~p~n",[code:lib_dir()]),
     case Other == [] of
          true -> skip;
          false -> mad:info("Unknown Command or Parameter ~p~n",[Other]), help() end,

+ 21 - 11
src/mad_plan.erl

@@ -5,33 +5,43 @@
 % dependency graph solver
 
 sort(Pairs) -> iterate(Pairs, [], lhs(Pairs) ++ rhs(Pairs)).
-lhs(L) -> [X || {X, _} <- L].
-rhs(L) -> [Y || {_, Y} <- L].
-rm_pairs(L1, L2) -> [All || All={X, _Y} <- L2, not lists:member(X, L1)].
+lhs(L) -> [X || {X, _, _} <- L].
+rhs(L) -> [Y || {_, Y, _} <- L].
+rm_pairs(L1, L2) -> [All || All={X, _Y, _} <- L2, not lists:member(X, L1)].
 subtract(L1, L2) -> [X || X <- L1, not lists:member(X, L2)].
 iterate([], L, All) -> {ok,rm_dups(L ++ subtract(All, L))};
 iterate(P, L, All) -> case subtract(lhs(P), rhs(P)) of [] -> P; Lhs -> iterate(rm_pairs(Lhs, P), L ++ Lhs, All) end.
 rm_dups([]) -> [];
 rm_dups([H|T]) -> case lists:member(H, T) of true -> rm_dups(T); false -> [H|rm_dups(T)] end.
 
-orderapps() ->
-    Pairs = lists:flatten([ case
+appdir(A) -> filename:join(lists:reverse(tl(tl(lists:reverse(filename:split(A)))))).
+
+triples() ->
+    lists:flatten([ case
        file:consult(F) of
          {ok,[{application,Name,Opt}]} ->
               Apps = proplists:get_value(applications,Opt,[]),
+              Vsn  = proplists:get_value(vsn,Opt,[]),
               [ case lists:member(A,mad_repl:system()) of
-                     false -> {A,Name};
-                     true -> [{A,Name}]++ system_deps(A) end || A <- Apps ];
+                     false -> {A,Name,{Vsn,appdir(filename:absname(F))}};
+                     true -> [{A,Name,{Vsn,appdir(filename:absname(F))}}]++ system_deps(A) end || A <- Apps ];
          {error,_} ->
             mad:info("AppName: ~p~n",[F]), skip
-    end || F <- mad_repl:wildcards(["{apps,deps}/*/ebin/*.app","ebin/*.app"]), not filelib:is_dir(F) ]),
-    case sort(lists:flatten(Pairs)) of
+    end || F <- mad_repl:wildcards(["{apps,deps}/*/ebin/*.app","ebin/*.app"]), not filelib:is_dir(F) ]).
+
+orderapps() ->
+    Apps = triples(),
+%    mad:info("Triples: ~p~n",[Apps]),
+    case sort(lists:flatten(Apps)) of
          {ok,Sorted} -> {ok,Sorted};
          Return -> {error,{cycling_apps,Return}} end.
 
 system_deps(A) ->
-    case file:consult(code:where_is_file(lists:concat([A,".app"]))) of
-         {ok,[{application,Name,Opt}]} -> [ {_A,Name} || _A <- proplists:get_value(applications,Opt,[]) ];
+    F = code:where_is_file(lists:concat([A,".app"])),
+    case file:consult(F) of
+         {ok,[{application,Name,Opt}]} ->
+              Vsn = proplists:get_value(vsn,Opt,[]),
+              [ {_A,Name,{Vsn,appdir(F)}} || _A <- proplists:get_value(applications,Opt,[]) ];
          {error,_} -> [] end.
 
 main(_) ->

+ 36 - 15
src/mad_release.erl

@@ -1,22 +1,43 @@
 -module(mad_release).
 -compile(export_all).
 
-release(Name,Apps) ->
-    file:write_file("relx.config",list_to_binary(io_lib:format(
-      "{release,{~s,\"1.0.0\"},~p}.\n"
-      "{include_erts,true}.\n"
-      "{extended_start_script,true}.\n"
-      "{generate_start_script,true}.\n"
-      "{vm_args,\"vm.args\"}.\n"
-      "{sys_config,\"sys.config\"}.\n"
-      "{overlay,[{mkdir,\"log/sasl\"}]}.\n",[Name,Apps]))).
+release(Name) ->
+    Triples = mad_plan:triples(),
+    Apps = lists:usort(fun({Name,_},{Name2,_})-> Name =< Name2 end, [{A,{B,F}}||{_,A,{B,F}}<-Triples]) ++
+           [{kernel,{proplists:get_value(vsn,element(2,application:get_all_key(kernel)),[]),
+                     filename:absname(code:lib_dir(kernel))}}],
+    Sorted = [ lists:keyfind(A,1,Apps) || A <- element(2,mad_plan:orderapps())],
+    {L,R}     = lists:unzip(Sorted),
+    {Ver,Dir} = lists:unzip(R),
+    NameVer   = lists:zip(L,Ver),
+    {{release, {Name, "1"}, {erts, erlang:system_info(version)},NameVer},Sorted}.
+
+scripts(N) ->
+    mad_repl:load(),
+    {ok,Bin} = mad_repl:load_file("priv/systools/start"),
+    [{"/bin/start",list_to_binary(re:replace(binary_to_list(Bin),"{release}",N,[global,{return,list}]))},
+     {"/bin/attach",element(2,mad_repl:load_file("priv/systools/attach"))},
+     {"/bin/daemon",element(2,mad_repl:load_file("priv/systools/daemon"))},
+     {"/etc/"++N++".boot",N++".boot"},
+     {"/etc/vm.args","vm.args"},
+     {"/etc/sys.config","sys.config"}].
+
+apps(List) -> lists:flatten([[[ {filename:join([lib,lists:concat([App,"-",Version]),Class,filename:basename(F)]),F}
+    || F <- mad_repl:wildcards([filename:join([Dir,Class,"*"])]) ] || {App,{Version,Dir}} <- List ] || Class <- [ebin,priv] ]).
 
 main([]) -> main(["sample"]);
 main(Params) ->
     [N|_] = Params,
-    {ok,Apps} = mad_plan:orderapps(), %[ filename:basename(F) || F <- filelib:wildcard("{apps,deps}/*"),  filelib:is_dir(F)],
-    release(N,Apps),
-    {_,Status,X} = sh:run("relx",[],binary,".",[]),
-    case Status == 0 of
-         true -> false;
-         false -> mad:info("Shell Error: ~s~n",[binary_to_list(X)]), true end.
+    {Release,Apps} = release(N),
+    Directories = mad_repl:wildcards(["{deps,apps}/*/ebin","ebin"]),
+    code:add_paths(Directories),
+    file:write_file(N++".rel",io_lib:format("~p.",[Release])),
+    Res = systools:make_script(N),
+    Files = [ {"/bin/"++filename:basename(F),F} || F <-
+      mad_repl:wildcards([code:root_dir()++"/erts-"++erlang:system_info(version)++
+        "/bin/{epmd,erlexec,run_erl,to_erl,escript,beam.smp}"]) ] ++ apps(Apps) ++ scripts(N),
+    mad:info("Apps: ~p~n",[apps(Apps)]),
+    erl_tar:create(N++".tgz",Files,[compressed]),
+    mad:info("Files: ~p~n",[Files]),
+    mad:info("~s.boot: ~p~n",[N,Res]),
+    false.