Adding support for embedding other apps via escript_incl_apps

--HG--
extra : rebase_source : 9eccc596d8fe55b2e0fe3ff2c9c0a9f9a8c92e11
This commit is contained in:
Dave Smith 2010-08-29 14:33:17 -06:00
parent b32eeeafb7
commit 9813126176

View file

@ -34,15 +34,20 @@
%% Public API %% Public API
%% =================================================================== %% ===================================================================
escriptize(_Config, AppFile) -> escriptize(Config, AppFile) ->
%% Extract the application name from the archive -- this will be be what %% Extract the application name from the archive -- this will be be what
%% we call the output script %% we call the output script
AppName = rebar_app_utils:app_name(AppFile), AppName = rebar_app_utils:app_name(AppFile),
%% Look for a list of other applications (dependencies) to include
%% in the output file. We then use the .app files for each of these
%% to pull in all the .beam files.
InclBeams = get_app_beams(rebar_config:get_local(Config, escript_incl_apps, []), []),
%% Construct the archive of everything in ebin/ dir -- put it on the %% Construct the archive of everything in ebin/ dir -- put it on the
%% top-level of the zip file so that code loading works properly. %% top-level of the zip file so that code loading works properly.
Files = filelib:wildcard("*", "ebin"), Files = load_files("*", "ebin") ++ InclBeams,
case zip:create("mem", Files, [{cwd, "ebin"}, memory]) of case zip:create("mem", Files, [memory]) of
{ok, {"mem", ZipBin}} -> {ok, {"mem", ZipBin}} ->
%% Archive was successfully created. Prefix that binary with our %% Archive was successfully created. Prefix that binary with our
%% header and write to our escript file %% header and write to our escript file
@ -63,3 +68,30 @@ escriptize(_Config, AppFile) ->
[] = os:cmd(?FMT("chmod u+x ~p", [AppName])), [] = os:cmd(?FMT("chmod u+x ~p", [AppName])),
ok. ok.
%% ===================================================================
%% Internal functions
%% ===================================================================
get_app_beams([], Acc) ->
Acc;
get_app_beams([App | Rest], Acc) ->
case code:lib_dir(App, ebin) of
{error, bad_name} ->
?ABORT("Failed to get ebin/ directory for ~p escript_incl_apps.", [App]);
Path ->
Acc2 = [{filename:join([App, ebin, F]), file_contents(filename:join(Path, F))} ||
F <- filelib:wildcard("*", Path)],
get_app_beams(Rest, Acc2 ++ Acc)
end.
load_files(Wildcard, Dir) ->
[read_file(Filename, Dir) || Filename <- filelib:wildcard(Wildcard, Dir)].
read_file(Filename, Dir) ->
{Filename, file_contents(filename:join(Dir, Filename))}.
file_contents(Filename) ->
{ok, Bin} = file:read_file(Filename),
Bin.