📄 systools_make.erl
字号:
create_mandatory_path(Appls, PathFlag, Variables) -> Dirs = [kernel, stdlib], make_set(map(fun({{Name,Vsn}, A}) -> case lists:member(Name, Dirs) of true -> cr_path(Name, Vsn, A, PathFlag, Variables); _ -> "" end end, Appls)).%%______________________________________________________________________%% Load all modules, except those in Mandatory_modules.load_appl_mods([{{Name,Vsn},A}|Appls], Mand, PathFlag, Variables) -> Mods = map(fun({Mod,_}) -> Mod; (Mod) -> Mod end, A#application.modules), load_commands(filter(fun(Mod) -> not member(Mod, Mand) end, Mods), cr_path(Name, Vsn, A, PathFlag, Variables)) ++ load_appl_mods(Appls, Mand, PathFlag, Variables);% [{path, [cr_path(Name, Vsn, A, PathFlag, Variables)]},% {primLoad, filter(fun(Mod) -> not member(Mod, Mand) end, Mods)} |% load_appl_mods(Appls, Mand, PathFlag, Variables)];load_appl_mods([], _, _, _) -> [{progress, modules_loaded}].load_commands(Mods, Path) -> SplitMods = lists:foldl( fun({Parts,M}, [{Last, Acc}|Rest]) -> [_|Tail] = lists:reverse(Parts), case lists:reverse(Tail) of Subs when Subs == Last -> [{Last,[M|Acc]}|Rest]; Subs -> [{Subs, [M]}|[{Last,Acc}|Rest]] end end, [{[],[]}], lists:sort([{packages:split(M),M} || M <- Mods])), lists:foldl( fun({Subs,Ms}, Cmds) -> [{path, [filename:join([Path | Subs])]}, {primLoad, Ms} | Cmds] end, [], SplitMods).%%______________________________________________________________________%% Pack an application to an application term.pack_app(#application{name=Name,vsn=V,id=Id,description=D,modules=M, uses=App,includes=Incs,regs=Regs,mod=Mod,start_phases=SF, env=Env,maxT=MaxT,maxP=MaxP}) -> {application, Name, [{description,D}, {vsn,V}, {id,Id}, {modules, M}, {registered, Regs}, {applications, App}, {included_applications, Incs}, {env, Env}, {start_phases, SF}, {maxT, MaxT}, {maxP, MaxP} | behave(Mod)]}.behave([]) -> [];behave(Mod) -> [{mod, Mod}].%%______________________________________________________________________%% mandatory modules; this modules must be loaded before processes%% can be started. These are a collection of modules from the kernel%% and stdlib applications.%% Nowadays, error_handler dynamically loads almost every module.%% The error_handler self must still be there though.mandatory_modules() -> [error_handler].%%______________________________________________________________________%% This is the modules that are preloaded into the Erlang system.preloaded() -> [erlang,erl_prim_loader,prim_file,prim_inet,init,otp_ring0].%%______________________________________________________________________%% Kernel processes; processes that are specially treated by the init%% process. If a kernel process terminates the whole system terminates.%% kernel_processes() -> [{Name, Mod, Func, Args}]%% where Args is a term or a fun taking the list of applications as arg.kernel_processes() -> [{heart, heart, start, []}, {error_logger, error_logger, start_link, []}, {application_controller, application_controller, start, fun(Appls) -> [{_,App}] = filter(fun({{kernel,_},_App}) -> true; (_) -> false end, Appls), [pack_app(App)] end} ].%%______________________________________________________________________%% Create the kernel processes.create_kernel_procs(Appls) -> map(fun({Name,Mod,Func,Args}) when is_function(Args) -> {kernelProcess, Name, {Mod, Func, Args(Appls)}}; ({Name,Mod,Func,Args}) -> {kernelProcess, Name, {Mod, Func, Args}} end, kernel_processes()) ++ [{progress, init_kernel_started}].%%______________________________________________________________________%% Make a tar file of the release.%% The tar file contains:%% lib/App-Vsn/ebin%% /priv%% [/src]%% [/include]%% [/doc]%% [/examples]%% [/...]%% Variable1.tar.gz%% ...%% VariableN.tar.gz%% releases/RelName.rel%% RelVsn/start.boot%% relup%% sys.config%% erts-EVsn[/bin]%%%% The VariableN.tar.gz files can also be stored as own files not%% included in the main tar file or they can be omitted using%% the var_tar option.mk_tar(RelName, Release, Appls, Flags, Path1) -> TarName = case get_outdir(Flags) of "" -> RelName ++ ".tar.gz"; OutDir -> filename:join(OutDir, filename:basename(RelName)) ++ ".tar.gz" end, Tar = open_main_tar(TarName), case catch mk_tar(Tar, RelName, Release, Appls, Flags, Path1) of {error,Error} -> del_tar(Tar, TarName), {error,?MODULE,Error}; {'EXIT',Reason} -> del_tar(Tar, TarName), {error,?MODULE,Reason}; _ -> close_tar(Tar), ok end.open_main_tar(TarName) -> case catch open_tar(TarName) of {error, Error} -> throw({error,?MODULE,Error}); Tar -> Tar end.mk_tar(Tar, RelName, Release, Appls, Flags, Path1) -> Variables = get_variables(Flags), add_applications(Appls, Tar, Variables, Flags, false), add_variable_tars(Variables, Appls, Tar, Flags), add_system_files(Tar, RelName, Release, Path1), add_erts_bin(Tar, Release, Flags). add_applications(Appls, Tar, Variables, Flags, Var) -> Res = foldl(fun({{Name,Vsn},App}, Errs) -> case catch add_appl(to_list(Name), Vsn, App, Tar, Variables, Flags, Var) of ok -> Errs; {error, What} -> [{error_add_appl, {Name,What}}|Errs] end end, [], Appls), case Res of [] -> ok; Errors -> throw({error, Errors}) end.%%______________________________________________________________________%% Create a tar file for each Variable directory.%% Deletes the temporary tar file.add_variable_tars([Variable|Variables], Appls, Tar, Flags) -> add_variable_tar(Variable, Appls, Tar, Flags), add_variable_tars(Variables, Appls, Tar, Flags);add_variable_tars([], _, _, _) -> ok.add_variable_tar({Variable,P}, Appls, Tar, Flags) -> case var_tar_flag(Flags) of omit -> ok; Flag -> TarName = Variable ++ ".tar.gz", VarTar = open_tar(TarName), case catch add_applications(Appls, VarTar, [{Variable,P}], Flags, Variable) of ok when Flag == include -> close_tar(VarTar), add_to_tar(Tar, TarName, TarName), del_file(TarName); ok when Flag == ownfile -> close_tar(VarTar), ok; Error -> del_tar(VarTar, TarName), throw(Error) end end.var_tar_flag(Flags) -> case get_flag(var_tar, Flags) of {var_tar, Flag} -> case member(Flag, [include, ownfile, omit]) of true -> Flag; _ -> include end; _ -> include end.%%______________________________________________________________________%% Add all "other" files to Dir/releases/Svsn%% add_system_files(Tar,Name,release#,Flags) ->%% ok | throw({error,Error})add_system_files(Tar, RelName, Release, Path1) -> SVsn = Release#release.vsn, RelName0 = filename:basename(RelName), add_to_tar(Tar, RelName ++ ".rel", filename:join("releases", RelName0 ++ ".rel")), %% OTP-6226 Look for the system files not only in cwd %% -- %% (well, actually the boot file was looked for in the same %% directory as RelName, which is not necessarily the same as cwd) %% -- %% but also in the path specfied as an option to systools:make_tar %% (but make sure to search the RelName directory and cwd first) Path = case filename:dirname(RelName) of "." -> ["."|Path1]; RelDir -> [RelDir, "."|Path1] end, ToDir = filename:join(releases, SVsn), case lookup_file(RelName0 ++ ".boot", Path) of false -> throw({error, {tar_error,{add, RelName0++".boot",enoent}}}); Boot -> add_to_tar(Tar, Boot, filename:join(ToDir, "start.boot")) end, case lookup_file("relup", Path) of false -> ignore; Relup -> add_to_tar(Tar, Relup, filename:join(ToDir, "relup")) end, case lookup_file("sys.config", Path) of false -> ignore; Sys -> add_to_tar(Tar, Sys, filename:join(ToDir, "sys.config")) end, ok.lookup_file(Name, [Dir|Path]) -> File = filename:join(Dir, Name), case filelib:is_file(File) of true -> File; false -> lookup_file(Name, Path) end;lookup_file(_Name, []) -> false.%%______________________________________________________________________%% Add either a application located under a variable dir or all other%% applications to a tar file.%% add_appl(Name,Vsn,application#,Tar,Variables,Flags,Var) ->%% ok | {error,Error}add_appl(Name, Vsn, App, Tar, Variables, Flags, Var) -> AppDir = App#application.dir, case add_to(AppDir,Name,Vsn,Variables,Var) of false -> ok; {ok, ToDir} -> ADir = appDir(AppDir), add_priv(ADir, ToDir, Tar), case get_flag(dirs,Flags) of {dirs,Dirs} -> add_dirs(ADir, Dirs, ToDir, Tar); _ -> ok end, BinDir = filename:join(ToDir, "ebin"), add_to_tar(Tar, filename:join(AppDir, Name ++ ".app"), filename:join(BinDir, Name ++ ".app")), add_modules(map(fun({Mod,_}) -> to_list(Mod); (Mod) -> to_list(Mod) end, App#application.modules), Tar, AppDir, BinDir, objfile_extension(machine(Flags))) end.%%______________________________________________________________________%% If an application directory contains a Variable (in AppDir) the%% application will be placed in the tar file (if it is this Variable%% we corrently is actually storing).add_to(AppDir,Name,Vsn,Variables,Variable) -> case var_dir(AppDir,Name,Vsn,Variables) of {ok, Variable, RestPath} -> {ok, filename:join(RestPath ++ [Name ++ "-" ++ Vsn])}; {ok, _, _} -> false; _ when Variable == false -> {ok, filename:join("lib", Name ++ "-" ++ Vsn)}; _ -> false end.var_dir(Dir, Name, Vsn, [{Var,Path}|Variables]) -> case lists:prefix(Path,Dir) of true -> D0 = strip_prefix(Path, Dir), case strip_name_ebin(D0, Name, Vsn) of {ok, D} -> {ok, Var, D}; _ -> false end; _ -> var_dir(Dir, Name, Vsn, Variables) end;var_dir(_Dir, _, _, []) -> false.appDir(AppDir) -> case reverse(filename:split(AppDir)) of ["ebin"|Dir] -> filename:join(reverse(Dir)); _ -> AppDir end.add_modules(Modules, Tar, AppDir, ToDir, Ext) -> foreach(fun(Mod) -> add_to_tar(Tar, filename:join(AppDir, Mod ++ Ext), filename:join(ToDir, Mod ++ Ext)) end, Modules). %%%% Add own specified directories to include in the release.%% If not found, skip it.%%add_dirs(AppDir, Dirs, ToDir, Tar) -> foreach(fun(Dir) -> catch add_dir(AppDir, to_list(Dir), ToDir, Tar) end, Dirs).add_dir(TopDir, Dir, ToDir, Tar) -> FromD = filename:join(TopDir, Dir), case dirp(FromD) of true -> add_to_tar(Tar, FromD, filename:join(ToDir, Dir)); _ -> ok end.%%%% Add the priv dir if it exists.add_priv(ADir, ToDir, Tar) -> Priv = filename:join(ADir, "priv"), case dirp(Priv) of true -> add_to_tar(Tar, Priv, filename:join(ToDir, "priv")); _ -> ok end.add_erts_bin(Tar, Release, Flags) -> case get_flag(erts,Flags) of {erts,ErtsDir} -> EVsn = Release#release.erts_vsn, FromDir = filename:join([to_list(ErtsDir),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -