@@@ more wip
[runlisp] / runlisp.1.in
similarity index 65%
rename from runlisp.1
rename to runlisp.1.in
index 51d470a..00b06fb 100644 (file)
--- a/runlisp.1
@@ -49,15 +49,14 @@ runlisp \- run Common Lisp programs as scripts
 .SH SYNOPSIS
 .
 .B runlisp
-.RB [ \-CDEnqv ]
-.RB [ \-I
-.IR imagedir ]
-.RB [ \-L
-.IB sys , sys , \fR...]
-.RB [ \-P
-.IB sys , sys , \fR...]
+.RI [ options ]
+.RB [ \-\- ]
+.I script
+.RI [ arguments
+\&...]
 .br
-\h'8n'
+.B runlisp
+.RI [ options ]
 .RB [ \-e
 .IR form  ]
 .RB [ \-l
@@ -65,9 +64,25 @@ runlisp \- run Common Lisp programs as scripts
 .RB [ \-p
 .IR form  ]
 .RB [ \-\- ]
-.RI [ script ]
 .RI [ arguments
 \&...]
+.PP
+where
+.I options
+is
+.br
+       \&
+.RB [ \-CDEnqv ]
+.RB [ +DEn ]
+.RB [ \-L
+.IB sys , sys , \fR...]
+.RB [ \-c
+.IR conf ]
+.RB [ \-o
+.RI [ sect \c
+.BR : ] \c
+.IB var = \c
+.IR value ]
 .
 .\"--------------------------------------------------------------------------
 .SH DESCRIPTION
@@ -84,114 +99,37 @@ It can be used in build scripts
 to invoke a Common Lisp system,
 e.g., to build a standalone program.
 .
-.SS "Supported Common Lisp implementations"
-The following Lisp implementations are currently supported.
-.TP
-.B "abcl"
-Armed Bear Common Lisp.
-.TP
-.B "ccl"
-Clozure Common Lisp.
-.TP
-.B "clisp"
-GNU CLisp.
-.TP
-.B "cmucl"
-Carnegie\(enMellon University Common Lisp.
-.TP
-.B "ecl"
-Embeddable Common Lisp.
-.TP
-.B "sbcl"
-Steel Bank Common Lisp.
-.PP
-The
-.B runlisp
-program expects, by default,
-to be able to run a Lisp system
-as a program with the same name,
-found by searching as directed by the
-.B PATH
-environment variable.
-This can be overridden by setting an environment variable,
-with the same name but in
-.IR "upper case" ,
-to the actual name \(en
-either a bare filename to be searched for on the
-.BR PATH ,
-or a pathname containing a
-.RB ` / ',
-relative to the working directory or absolute,
-to the program.
-Note that the entire variable value is used as the program name:
-it's not possible to provide custom arguments to a Lisp system
-using this mechanism.
-If you want to do that,
-you must write a shell script to do the necessary work,
-and point the environment variable
-(or the
-.BR PATH )
-at your script.
-.
 .SS "Options"
 Options are read from the command line, as usual,
-but also from a number of other sources;
-these are, in order:
-.hP \*o
-If a
-.I script
-is named,
-and the script's second line contains a
+but also (by default) from the script's second line,
+following a
 .RB ` @RUNLISP: '
-marker,
-then text following the marker is parsed as options.
-.hP \*o
-If files named
-.B ~/.runlisprc
-and/or
-.B ~/.config/runlisprc
-exist,
-then their contents are parsed as options.
-.hP \*o
-If an environment variable
-.B RUNLISP_OPTIONS
-is defined,
-then its contents is parsed as options.
-.PP
-A simple quoting and escaping system is implemented
-to allow spaces and other special characters
-to be included in argument words
-in the script, configuration files, and environment variable.
-The details of all of this are given in the section
+marker: see
 .B Operation
-below.
+below for the details.
 .
 .PP
 The options accepted are as follows.
 .
 .TP
-.B "\-\-help"
+.BR "\-h" ", " "\-\-help"
 Write a synopsis of
-.BR runlisp 's
+.BR query-runlisp-config 's
 command-line syntax
 and a description of the command-line options
 to standard output
 and immediately exit with status 0.
 .
 .TP
-.B "\-\-version"
+.BR "\-V" ", " "\-\-version"
 Write
-.BR runlisp 's
+.BR query-runlisp-config 's
 version number
 to standard output
 and immediately exit with status 0.
 .
 .TP
-.B "\-C"
-Clear the list of preferred Lisp implementations.
-.
-.TP
-.B "\-D"
+.BR "\-D" ", " "\-\-vanilla-image"
 Don't check for a custom Lisp image.
 Usually,
 .B runlisp
@@ -205,29 +143,33 @@ There's not usually any good reason to prefer the vanilla image,
 except for performance comparisons, or debugging
 .B runlisp
 itself.
+Negate with
+.B +D
+or
+.BR \-\-no-vanilla-image .
 .
 .TP
-.B "\-E"
+.BR "\-E" ", " "\-\-command-line-only"
 Don't read embedded options from the
 second line of the
 .I script
 file.
+Negate with
+.B +E
+or
+.BR \-\-no-command-line-only .
 This has no effect in eval mode.
-.
-.TP
-.BI "\-I " imagedir
-Look in
-.I imagedir
-for custom Lisp images.
-This option overrides the default image directory,
 which is set at compile time.
 .
 .TP
-.BI "\-L " sys , sys ,\fR...
+.BI "\-L" "\fR, " "\-\-accept-lisp=" sys , sys ,\fR...
 Use one of the named Lisp systems.
 Each
 .I sys
-must name a supported Lisp system.
+must name a supported Lisp system;
+the names are separated by a comma
+.RB ` , '
+and/or one or more whitespace characters.
 This option may be given more than once:
 the effect is the same as a single option
 listing all of the systems named, in the same order.
@@ -236,31 +178,23 @@ a warning is issued (at verbosity level 1 or higher),
 and all but the first occurrence is ignored.
 .
 .TP
-.BI "\-P " sys , sys ,\fR...
-Set the relative preference order of Lisp systems:
-systems listed earlier are more preferred.
-Each
-.I sys
-must name a supported Lisp system.
-This option may be given more than once:
-the effect is the same as a single option
-listing all of the systems named, in the same order.
-If a system is named more than once,
-a warning is issued (at verbosity level 1 or higher),
-and all but the first occurrence is ignored.
-Unmentioned systems are assigned lowest preference:
-if a
-.RB ` \-L '
-option is given,
-then this provides a default preference ordering;
-otherwise, an ordering hardcoded into the program is used.
-The first acceptable Lisp system,
-according to the preference order just described,
-which actually exists,
-is the one selected.
+.BI "\-c" "\fR, " "\-\-config-file=" conf
+Read configuration from
+.IR conf .
+If
+.I conf
+is a directory, then all of the files within
+whose names end with
+.RB ` .conf ',
+are loaded, in ascending lexicographical order;
+otherwise,
+.I conf
+is opened as a file.
+All of the files are expected to as described in
+.BR runlisp.conf (5).
 .
 .TP
-.BI "\-e " expr
+.BI "\-e" "\fR, " "\-\-evaluate-expression=" expr
 Evaluate the expression(s)
 .I expr
 and discard the resulting values.
@@ -271,7 +205,7 @@ to execute in
 mode.
 .
 .TP
-.BI "\-l " file
+.BI "\-l" "\fR, " "\-\-load-file=" file
 Read and evaluate forms from the
 .IR file .
 This option causes
@@ -281,15 +215,19 @@ to execute in
 mode.
 .
 .TP
-.B "\-n"
+.BR "\-n" ", " "-\-dry-run"
 Don't actually start the Lisp environment.
 This may be helpful for the curious,
 in conjunction with
 .RB ` \-v '
 to increase the verbosity.
+Negate with
+.B +n
+or
+.BR "\-\-no-dry-run" .
 .
 .TP
-.BI "\-p " expr
+.BI "\-p" "\fR, " "\-\-print-expressin=" expr
 Evaluate the expression(s)
 .I expr
 and print the resulting value(s)
@@ -308,7 +246,7 @@ to execute in
 mode.
 .
 .TP
-.B "\-q"
+.BR "\-q" ", " "\-\-quiet"
 Don't print warning messages.
 This option may be repeated:
 each use reduces verbosity by one step,
@@ -319,7 +257,7 @@ The default verbosity level is 1,
 which prints only warning measages.
 .
 .TP
-.B "\-v"
+.BR "\-v" ", " "\-\-verbose"
 Print informational or debugging messages.
 This option may be repeated:
 each use increases verbosity by one step,
@@ -339,11 +277,7 @@ and
 options may only be given on the command-line itself,
 not following a
 .RB `@ RUNLISP: '
-marker in a script,
-in a configuration file,
-or in the
-.B RUNLISP_OPTIONS
-environment variable.
+marker in a script.
 These options may be given multiple times:
 they will be processed in the order given.
 If any of these options is given, then no
@@ -354,14 +288,15 @@ instead, use
 to load code from files.
 The
 .IR arguments ,
-if any,
+ppif any,
 are still made available to the evaluated forms and loaded files.
 .
 .SS "Operation"
 The
 .B runlisp
 program behaves as follows.
-.PP
+.
+.hP 1.
 The first thing it does is parse its command line.
 Options must precede positional arguments,
 though the boundary may be marked explicitly using
@@ -389,7 +324,7 @@ and
 runs in
 .I script
 mode.
-.PP
+.hP 2.
 In
 .I script
 mode,
@@ -401,6 +336,8 @@ If so, then the following text is parsed
 for
 .IR "embedded options" ,
 as follows.
+.RS
+.PP
 The text is split into words
 separated by sequences of whitespace characters.
 Whitespace,
@@ -436,18 +373,41 @@ before processing quoting and escaping,
 then everything up to and including the next occurrence of
 .RB ` \-*\- '
 is ignored.
+.PP
 The resulting list of words
 is processed as if it held further command-line options.
-However,
+Currently, only
+.RB ` \-D '
+and
+.RB ` \-L '
+options are permitted in embedded option lists:
+.RB ` \-h '
+and
+.RB ` \-v '
+are clearly only useful in interactive use;
+setting
+.RB ` \-q '
+or
+.RB ` \-v '
+would just be annoying;
+setting
+.RB ` \-c '
+or
+.RB ` \-o '
+would override the user's command-line settings;
+it's clearly too late to set
+.RB ` \-E ';
+and
 .B runlisp
 is now committed to
 .I script
-mode, so
+mode, so it's too late for
 .RB ` \-e ',
 .RB ` \-l ',
 and
 .RB ` \-p '
-options may not appear in a script file's embedded options list.
+too.
+.PP
 (This feature allows scripts to provide options even if they use
 .BR env (1)
 to find
@@ -459,78 +419,32 @@ since many operating systems pass the text following
 the interpreter name on a
 .RB ` #! '
 line as a single argument, without further splitting it at spaces.)
-.PP
-If a file named
-.B .runlisprc
-exists in the user's home directory,
-then this file is read to discover more options.
-(If the variable
-.B HOME
-is set in the environment,
-then its value is assumed to name the user's home directory;
-otherwise, the home directory is determined by looking up
-the process's real uid in the password database.)
-Lines consisting entirely of whitespace,
-and lines whose first whitespace character is either
-.RB ` # '
-or
-.RB ` ; '
-are ignored in this file.
-Other lines are split into words,
-and processed as additional command-line options,
-as described for embedded options above,
-except that:
-a
-.RB ` \-\- '
-marker does not terminate word splitting; and
-Emacs-style
-.RB ` \-*\- ... \-*\- '
-local variable lists are not ignored.
-Each line is processed separately,
-so an option and its argument must be written on the same line.
-By this point
-.B runlisp
-will have committed to
-.I script
-or
-.I eval
-mode,
-so
-.RB ` \-e ',
-.RB ` \-l ',
+.RE
+.
+.hP 3.
+If no
+.RB ` \-c '
+options were given,
+then the default configuration files are read:
+the system configuration from
+.B @etcdir@/runlisp.conf
 and
-.RB ` \-p '
-options may not appear in a configuration file.
-.PP
-If a file
-.B runlisprc
-exists in the user's
-.I "configuration home"
-directory,
-then it is processed as for
-.B .runlisprc
-above.
-If a variable
-.B XDG_CONFIG_HOME
-is set in the environment,
-then its value is assumed to name the configuration home;
-otherwise, the configuration home is the directory
-.B .config
-in the user's home directory, as determined above.
-.PP
-If the variable
-.B RUNLISP_OPTIONS
-is set in the environment,
-then its value is split into words
-and processed as additional command-line options,
-as for a line of a configuration file as described above.
-.PP
+.BR @etcdir@/runlisp.d/*.conf ,
+and the user configuration from
+.B ~/.runlisp.conf
+and/or
+.BR ~/.config/runlisp.conf :
+see
+.RB runlisp.conf (5)
+for the details.
+.
+.hP 4.
 The list of
 .I "acceptable Lisp implementations"
 is determined.
 If any
 .RB ` \-L '
-options have been issued,
+options have been found,
 then the list of acceptable implementations
 consists of all of the implementations mentioned in
 .RB ` -L '
@@ -549,40 +463,39 @@ If no
 option is given, then
 .B runlisp
 uses a default list,
-which consists of all of the supported Lisp implementations
-in an hardcoded order which reflects
-the author's arbitrary preferences.
-.PP
+which consists of all of the Lisp implementations
+defined in its configuration,
+in the order in which they were defined.
+.
+.hP 5.
 The list of
 .I "preferred Lisp implementations"
 is determined.
-If any
-.RB ` \-P '
-options have been issued
-.I "since the last"
-.IB ` \-C '
-.IR "option" ,
-then the list of preferred implementations
-consists of all of the implementations mentioned in
-.RB ` \-P '
-options after the last occurrence of
-.RB ` \-C ',
-in the order of their first occurrences.
-(If an implementation is named more than once,
-then
+If the environment variable
+.B RUNLISP_PREFER
+is set,
+then its value should be a list of names of Lisp implementations
+separated by a comma and/or one or more whitespace characters.
+Otherwise, if there is a setting for the variable
+.B prefer
+in the
+.B @CONFIG
+configuration section,
+then its (expanded) value should be a list of Lisp implementations,
+in the same way.
+Otherwise, the list of preferred implementations is empty.
+.
+.hP 6.
+If
 .B runlisp
-prints a warning to stderr
-and ignores all but the first occurrence.)
-If no
-.RB ` \-P '
-option is given,
-or a
-.RB ` \-C '
-option appears after all of the
-.RB ` \-P '
-options,
-then the list of preferred implementations is empty.
-.PP
+is running in
+.I eval
+mode, then a new command line is built,
+which invokes an internal script,
+instructing it to evaluate and print the requested expressions,
+and load the requested files.
+.
+.hP 7.
 Acceptable Lisp implementations are tried in turn.
 First, the preferred implementations
 which are also listed as acceptable implementations
@@ -591,11 +504,41 @@ in the preferred implementations list;
 then, the remaining acceptable implementations are tried
 in the order in which they appear
 in the acceptable implementations list.
-To
-.I try
-a Lisp implementation means to construct a command line
-(whose effect will be described below)
-and pass it to the
+.RS
+.PP
+A Lisp implementation is defined by a configuration section
+which defines a variable
+.BR run-script .
+The name of the configuration section
+is the name of the Lisp implementation,
+as used in the acceptable and preferred lists described above.
+.hP (a)
+The variable
+.B image-file
+is looked up in the configuration section.
+If a value is found, then
+.B runlisp
+looks up and expands
+.BR image-path ,
+and checks to see if a file exists with the resulting name.
+If so, it sets the variable
+.B @image
+to
+.B t
+in the configuration section.
+.hP (b)
+The variable
+.B run-script
+is expanded and word-split.
+The
+.I script
+(an internal script, in
+.I eval
+mode)
+and
+.IR argument s
+are appended, and
+the entire list is passed to the
 .BR execvp (3)
 function.
 If that succeeds, the Lisp implementation runs;
@@ -616,29 +559,15 @@ just simulates the behaviour of
 printing messages to stderr
 if the verbosity level is sufficiently high,
 and exits.
-.PP
-In
-.I script
-mode,
-the script is invoked.
-In
-.I eval
-mode,
-the instructions given in
-.RB ` \-e ',
-.RB ` \-l ',
-and
-.RB ` \-p '
-options are carried out,
-in the order in which the appeared in the command line.
-The details of the environment
-in which Lisp code is executed
-are described next.
 .
 .SS "Script environment"
-Code in scripts and forms invoked by
+Many Lisp implementations don't provide a satisfactory environment
+for scripts to run in.
+The actual task of invoking a Lisp implementation
+is left to configuration,
+but the basic configuration supplied with
 .B runlisp
-may assume the following facts about their environment.
+ensures the following facts about their environment.
 .hP \*o
 The keyword
 .B :runlisp-script