mad_escript.erl 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. -module(mad_escript).
  2. -description("ESCRIPT bundles").
  3. -compile([export_all, nowarn_export_all]).
  4. main(N) ->
  5. App = filename:basename(case N of [] -> mad_utils:cwd(); E -> E end),
  6. mad_resolve:main([]),
  7. EmuArgs = "+pc unicode",
  8. Files = static() ++ beams(fun filename:basename/1, fun read_file/1) ++ overlay(),
  9. %[ io:format("Escript: ~ts~n", [File]) || { File, _ } <- Files ],
  10. escript:create(App,[shebang,{comment,""},{emu_args,EmuArgs},{archive,Files,[memory]}]),
  11. file:change_mode(App, 8#764),
  12. {ok,App}.
  13. id(X) -> X.
  14. read_file(File) -> {ok, Bin} = file:read_file(filename:absname(File)), Bin.
  15. static() ->
  16. Name = "static.gz",
  17. {ok,{_,Bin}} = zip:create(Name,
  18. [ F || F <- mad_repl:wildcards(["{apps,deps}/*/priv/**","priv/**"]), not filelib:is_dir(F) ],
  19. [{compress,all},memory]),
  20. [ { Name, Bin } ].
  21. beams() -> beams(fun id/1, fun read_file/1).
  22. beams(Fun,Read) ->
  23. [ { Fun(F), Read(F) } ||
  24. F <- mad_repl:wildcards(["ebin/*","{apps,deps}/*/ebin/*","sys.config",".applist"]) ].
  25. privs() -> privs(fun id/1, fun read_file/1).
  26. privs(Fun,Read) ->
  27. [ { Fun(F), Read(F) } ||
  28. F <- mad_repl:wildcards(["{apps,deps}/*/priv/**","priv/**"]), not filelib:is_dir(F) ].
  29. system_files() -> lists:flatten([system_files(A) || A<- mad_repl:applist(), lists:member(A,mad_repl:system()) ]).
  30. system_files(App) ->
  31. [ { F, mad_bundle:read_file(F) } ||
  32. F <- mad_repl:wildcards([lists:concat([code:lib_dir(App),"/ebin/*.{app,beam}"])]) ].
  33. overlay() -> overlay(fun id/1, fun read_file/1).
  34. overlay(Fun,Read) ->
  35. [ { Fun(F), Read(F) } ||
  36. F <- mad_repl:wildcards(["deps/ling/apps/*/ebin/*.beam"]) ].