edoc_run.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 224 行

ERL
224
字号
%% =====================================================================%% This library is free software; you can redistribute it and/or modify%% it under the terms of the GNU Lesser General Public License as%% published by the Free Software Foundation; either version 2 of the%% License, or (at your option) any later version.%%%% This library is distributed in the hope that it will be useful, but%% WITHOUT ANY WARRANTY; without even the implied warranty of%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU%% Lesser General Public License for more details.%%%% You should have received a copy of the GNU Lesser General Public%% License along with this library; if not, write to the Free Software%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307%% USA%%%% $Id$%%%% @copyright 2003 Richard Carlsson%% @author Richard Carlsson <richardc@csd.uu.se>%% @see edoc%% @end %% =====================================================================%% @doc Interface for calling EDoc from Erlang startup options.%%%% The following is an example of typical usage in a Makefile:%% ```docs:%%            erl -noshell -run edoc_run application "'$(APP_NAME)'" \%%              '"."' '[{def,{vsn,"$(VSN)"}}]'%% '''%% (note the single-quotes to avoid shell expansion, and the%% double-quotes enclosing the strings).%%%% <strong>New feature in version 0.6.9</strong>: It is no longer%% necessary to write `-s init stop' last on the command line in order%% to make the execution terminate. The termination (signalling success%% or failure to the operating system) is now built into these%% functions.-module(edoc_run).-export([file/1, application/1, packages/1, files/1, toc/1]).-import(edoc_report, [report/2, error/1]).%% @spec application([string()]) -> none()%%%% @doc Calls {@link edoc:application/3} with the corresponding%% arguments. The strings in the list are parsed as Erlang constant%% terms. The list can be either `[App]', `[App, Options]' or `[App,%% Dir, Options]'. In the first case {@link edoc:application/1} is%% called instead; in the second case, {@link edoc:application/2} is%% called.%%%% The function call never returns; instead, the emulator is%% automatically terminated when the call has completed, signalling%% success or failure to the operating system.application(Args) ->    F = fun () ->		case parse_args(Args) of		    [App] -> edoc:application(App);		    [App, Opts] -> edoc:application(App, Opts);		    [App, Dir, Opts] -> edoc:application(App, Dir, Opts);		    _ ->			invalid_args("edoc_run:application/1", Args)		end	end,    run(F).%% @spec files([string()]) -> none()%%%% @doc Calls {@link edoc:files/2} with the corresponding arguments. The%% strings in the list are parsed as Erlang constant terms. The list can%% be either `[Files]' or `[Files, Options]'. In the first case, {@link%% edoc:files/1} is called instead.%%%% The function call never returns; instead, the emulator is%% automatically terminated when the call has completed, signalling%% success or failure to the operating system.files(Args) ->    F = fun () ->		case parse_args(Args) of		    [Files] -> edoc:files(Files);		    [Files, Opts] -> edoc:files(Files, Opts);		    _ ->			invalid_args("edoc_run:files/1", Args)		end	end,    run(F).%% @spec packages([string()]) -> none()%%%% @doc Calls {@link edoc:application/2} with the corresponding%% arguments. The strings in the list are parsed as Erlang constant%% terms. The list can be either `[Packages]' or `[Packages, Options]'.%% In the first case {@link edoc:application/1} is called instead.%%%% The function call never returns; instead, the emulator is%% automatically terminated when the call has completed, signalling%% success or failure to the operating system.packages(Args) ->    F = fun () ->		case parse_args(Args) of		    [Packages] -> edoc:packages(Packages);		    [Packages, Opts] -> edoc:packages(Packages, Opts);		    _ ->			invalid_args("edoc_run:packages/1", Args)		end	end,    run(F).%% @hidden   Not official yettoc(Args) ->    F = fun () -> 		case parse_args(Args) of 		    [Dir, Paths] -> edoc:toc(Dir,Paths); 		    [Dir, Paths, Opts] -> edoc:toc(Dir,Paths,Opts); 		    _ -> 			invalid_args("edoc_run:toc/1", Args) 		end 	end,    run(F).%% @spec file([string()]) -> none()%%%% @deprecated This is part of the old interface to EDoc and is mainly%% kept for backwards compatibility. The preferred way of generating%% documentation is through one of the functions {@link application/1},%% {@link packages/1} and {@link files/1}.%%%% @doc Calls {@link edoc:file/2} with the corresponding arguments. The%% strings in the list are parsed as Erlang constant terms. The list can%% be either `[File]' or `[File, Options]'. In the first case, an empty%% list of options is passed to {@link edoc:file/2}.%%%% The following is an example of typical usage in a Makefile:%% ```$(DOCDIR)/%.html:%.erl%%            erl -noshell -run edoc_run file '"$<"' '[{dir,"$(DOCDIR)"}]' \%%              -s init stop'''%%%% The function call never returns; instead, the emulator is%% automatically terminated when the call has completed, signalling%% success or failure to the operating system.file(Args) ->    F = fun () ->		case parse_args(Args) of		    [File] -> edoc:file(File, []);		    [File, Opts] -> edoc:file(File, Opts);		    _ ->			invalid_args("edoc_run:file/1", Args)		end	end,    run(F).invalid_args(Where, Args) ->    report("invalid arguments to ~s: ~w.", [Where, Args]),    shutdown_error().run(F) ->    wait_init(),    case catch {ok, F()} of	{ok, _} ->	    shutdown_ok();	{'EXIT', E} ->	    report("edoc terminated abnormally: ~P.", [E, 10]),	    shutdown_error();	Thrown ->	    report("internal error: throw without catch in edoc: ~P.",		   [Thrown, 15]),	    shutdown_error()    end.wait_init() ->    case erlang:whereis(code_server) of	undefined ->	    erlang:yield(),	    wait_init();	_ ->	    ok    end.%% When and if a function init:stop/1 becomes generally available, we%% can use that instead of delay-and-pray when there is an error.shutdown_ok() ->    %% shut down emulator nicely, signalling "normal termination"    init:stop().shutdown_error() ->    %% delay 1 second to allow I/O to finish    receive after 1000 -> ok end,    %% stop emulator the hard way with a nonzero exit value    halt(1).parse_args([A | As]) when is_atom(A) ->    [parse_arg(atom_to_list(A)) | parse_args(As)];parse_args([A | As]) ->    [parse_arg(A) | parse_args(As)];parse_args([]) ->    [].parse_arg(A) ->    case catch {ok, edoc_lib:parse_expr(A, 1)} of	{ok, Expr} ->	    case catch erl_parse:normalise(Expr) of		{'EXIT', _} ->		    report("bad argument: '~s':", [A]),		    exit(error);		Term ->		    Term	    end;	{error, _, D} ->	    report("error parsing argument '~s'", [A]),	    error(D),	    exit(error)    end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?