⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 systools_make.erl

📁 OTP是开放电信平台的简称
💻 ERL
📖 第 1 页 / 共 5 页
字号:
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 + -