diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/rlx_depsolver.erl | 4 | ||||
-rw-r--r-- | src/rlx_prv_assembler.erl | 126 |
2 files changed, 101 insertions, 29 deletions
diff --git a/src/rlx_depsolver.erl b/src/rlx_depsolver.erl index 20423d0..5d78174 100644 --- a/src/rlx_depsolver.erl +++ b/src/rlx_depsolver.erl @@ -112,7 +112,11 @@ %%============================================================================ %% type %%============================================================================ +-ifdef(namespaced_types). +-type dep_graph() :: gb_tree:tree(). +-else. -type dep_graph() :: gb_tree(). +-endif. -opaque t() :: {?MODULE, dep_graph()}. -type pkg() :: {pkg_name(), vsn()}. -type pkg_name() :: binary() | atom(). diff --git a/src/rlx_prv_assembler.erl b/src/rlx_prv_assembler.erl index 1a24ab6..d7bf3f1 100644 --- a/src/rlx_prv_assembler.erl +++ b/src/rlx_prv_assembler.erl @@ -296,9 +296,10 @@ write_bin_file(State, Release, OutputDir, RelDir) -> VsnRel = filename:join(BinDir, rlx_release:canonical_name(Release)), BareRel = filename:join(BinDir, RelName), ErlOpts = rlx_state:get(State, erl_opts, ""), + {OsFamily, _OsName} = os:type(), StartFile = case rlx_state:get(State, extended_start_script, false) of false -> - bin_file_contents(RelName, RelVsn, + bin_file_contents(OsFamily, RelName, RelVsn, rlx_release:erts(Release), ErlOpts); true -> @@ -321,7 +322,7 @@ write_bin_file(State, Release, OutputDir, RelDir) -> false -> ok end, - extended_bin_file_contents(RelName, RelVsn, rlx_release:erts(Release), ErlOpts) + extended_bin_file_contents(OsFamily, RelName, RelVsn, rlx_release:erts(Release), ErlOpts) end, %% We generate the start script by default, unless the user %% tells us not too @@ -329,15 +330,34 @@ write_bin_file(State, Release, OutputDir, RelDir) -> false -> ok; _ -> - ok = file:write_file(VsnRel, StartFile), - ok = file:change_mode(VsnRel, 8#777), - ok = file:write_file(BareRel, StartFile), - ok = file:change_mode(BareRel, 8#777) + VsnRelStartFile = case OsFamily of + unix -> VsnRel; + win32 -> string:concat(VsnRel, ".cmd") + end, + ok = file:write_file(VsnRelStartFile, StartFile), + ok = file:change_mode(VsnRelStartFile, 8#777), + BareRelStartFile = case OsFamily of + unix -> BareRel; + win32 -> string:concat(BareRel, ".cmd") + end, + ok = file:write_file(BareRelStartFile, StartFile), + ok = file:change_mode(BareRelStartFile, 8#777) end, + ReleasesDir = filename:join(OutputDir, "releases"), + generate_start_erl_data_file(Release, ReleasesDir), copy_or_generate_vmargs_file(State, Release, RelDir), copy_or_generate_sys_config_file(State, RelDir), include_erts(State, Release, OutputDir, RelDir). +%% @doc generate a start_erl.data file +-spec generate_start_erl_data_file(rlx_release:t(), file:name()) -> + ok | relx:error(). +generate_start_erl_data_file(Release, ReleasesDir) -> + ErtsVersion = rlx_release:erts(Release), + ReleaseVersion = rlx_release:vsn(Release), + Data = ErtsVersion ++ " " ++ ReleaseVersion, + ok = file:write_file(filename:join(ReleasesDir, "start_erl.data"), Data). + %% @doc copy vm.args or generate one to releases/VSN/vm.args -spec copy_or_generate_vmargs_file(rlx_state:t(), rlx_release:t(), file:name()) -> {ok, rlx_state:t()} | relx:error(). @@ -390,29 +410,61 @@ copy_or_symlink_config_file(State, ConfigPath, RelConfPath) -> -spec include_erts(rlx_state:t(), rlx_release:t(), file:name(), file:name()) -> {ok, rlx_state:t()} | relx:error(). include_erts(State, Release, OutputDir, RelDir) -> - case rlx_state:get(State, include_erts, true) of - true -> - Prefix = code:root_dir(), + Prefix = case rlx_state:get(State, include_erts, true) of + false -> + false; + true -> + code:root_dir(); + P -> + filename:absname(P) + end, + + case Prefix of + false -> + make_boot_script(State, Release, OutputDir, RelDir); + _ -> + ec_cmd_log:info(rlx_state:log(State), + "Including Erts from ~s~n", [Prefix]), ErtsVersion = rlx_release:erts(Release), ErtsDir = filename:join([Prefix, "erts-" ++ ErtsVersion]), LocalErts = filename:join([OutputDir, "erts-" ++ ErtsVersion]), + {OsFamily, _OsName} = os:type(), case filelib:is_dir(ErtsDir) of false -> ?RLX_ERROR({specified_erts_does_not_exist, ErtsVersion}); true -> ok = ec_file:mkdir_p(LocalErts), ok = ec_file:copy(ErtsDir, LocalErts, [recursive]), - Erl = filename:join([LocalErts, "bin", "erl"]), - ok = ec_file:remove(Erl), - ok = file:write_file(Erl, erl_script(ErtsVersion)), - ok = file:change_mode(Erl, 8#755), + case OsFamily of + unix -> + Erl = filename:join([LocalErts, "bin", "erl"]), + ok = ec_file:remove(Erl), + ok = file:write_file(Erl, erl_script(ErtsVersion)), + ok = file:change_mode(Erl, 8#755); + win32 -> + ErlIni = filename:join([LocalErts, "bin", "erl.ini"]), + ok = ec_file:remove(ErlIni), + ok = file:write_file(ErlIni, erl_ini(OutputDir, ErtsVersion)) + end, + case rlx_state:get(State, extended_start_script, false) of + true -> + ok = ec_file:copy(filename:join([Prefix, "bin", "start_clean.boot"]), + filename:join([OutputDir, "bin", "start_clean.boot"])), + NodeToolFile = nodetool_contents(), + InstallUpgradeFile = install_upgrade_escript_contents(), + NodeTool = filename:join([LocalErts, "bin", "nodetool"]), + InstallUpgrade = filename:join([LocalErts, "bin", "install_upgrade.escript"]), + ok = file:write_file(NodeTool, NodeToolFile), + ok = file:write_file(InstallUpgrade, InstallUpgradeFile), + ok = file:change_mode(NodeTool, 8#755), + ok = file:change_mode(InstallUpgrade, 8#755); + false -> + ok + end, make_boot_script(State, Release, OutputDir, RelDir) - end; - _ -> - make_boot_script(State, Release, OutputDir, RelDir) + end end. - -spec make_boot_script(rlx_state:t(), rlx_release:t(), file:name(), file:name()) -> {ok, rlx_state:t()} | relx:error(). make_boot_script(State, Release, OutputDir, RelDir) -> @@ -475,16 +527,19 @@ make_relup(State, Release) -> make_tar(State, Release, OutputDir) -> Name = atom_to_list(rlx_release:name(Release)), Vsn = rlx_release:vsn(Release), - Prefix = code:root_dir(), ErtsVersion = rlx_release:erts(Release), - ErtsDir = filename:join([Prefix]), Opts = [{path, [filename:join([OutputDir, "lib", "*", "ebin"])]}, {outdir, OutputDir} | case rlx_state:get(State, include_erts, true) of true -> + Prefix = code:root_dir(), + ErtsDir = filename:join([Prefix]), [{erts, ErtsDir}]; false -> - [] + []; + Prefix -> + ErtsDir = filename:join([Prefix]), + [{erts, ErtsDir}] end], case systools:make_tar(filename:join([OutputDir, "releases", Vsn, Name]), Opts) of @@ -519,10 +574,10 @@ update_tar(State, TempDir, OutputDir, Name, Vsn, ErtsVersion) -> filename:join([OutputDir, "releases", Vsn, "vm.args"])}, {"bin", filename:join([OutputDir, "bin"])} | case rlx_state:get(State, include_erts, true) of - true -> - [{"erts-"++ErtsVersion, filename:join(OutputDir, "erts-"++ErtsVersion)}]; false -> - [] + []; + _ -> + [{"erts-"++ErtsVersion, filename:join(OutputDir, "erts-"++ErtsVersion)}] end], [compressed]), ec_cmd_log:info(rlx_state:log(State), "tarball ~s successfully created!~n", [TarFile]), @@ -648,13 +703,26 @@ ensure_not_exist(RelConfPath) -> erl_script(ErtsVsn) -> render(erl_script_dtl, [{erts_vsn, ErtsVsn}]). -bin_file_contents(RelName, RelVsn, ErtsVsn, ErlOpts) -> - render(bin_dtl, [{rel_name, RelName}, {rel_vsn, RelVsn}, - {erts_vsn, ErtsVsn}, {erl_opts, ErlOpts}]). +bin_file_contents(OsFamily, RelName, RelVsn, ErtsVsn, ErlOpts) -> + Template = case OsFamily of + unix -> bin_dtl; + win32 -> bin_windows_dtl + end, + render(Template, [{rel_name, RelName}, {rel_vsn, RelVsn}, + {erts_vsn, ErtsVsn}, {erl_opts, ErlOpts}]). + +extended_bin_file_contents(OsFamily, RelName, RelVsn, ErtsVsn, ErlOpts) -> + Template = case OsFamily of + unix -> extended_bin_dtl; + win32 -> extended_bin_windows_dtl + end, + render(Template, [{rel_name, RelName}, {rel_vsn, RelVsn}, + {erts_vsn, ErtsVsn}, {erl_opts, ErlOpts}]). -extended_bin_file_contents(RelName, RelVsn, ErtsVsn, ErlOpts) -> - render(extended_bin_dtl, [{rel_name, RelName}, {rel_vsn, RelVsn}, - {erts_vsn, ErtsVsn}, {erl_opts, ErlOpts}]). +erl_ini(OutputDir, ErtsVsn) -> + ErtsDirName = string:concat("erts-", ErtsVsn), + BinDir = filename:join([OutputDir, ErtsDirName, bin]), + render(erl_ini_dtl, [{bin_dir, BinDir}, {output_dir, OutputDir}]). install_upgrade_escript_contents() -> render(install_upgrade_escript_dtl). |