runlisp.1.in: Fix a small formatting blunder.
[runlisp] / runlisp.1.in
CommitLineData
e29834b8
MW
1.\" -*-nroff-*-
2.\"
3.\" Manual for `runlisp'
4.\"
5.\" (c) 2020 Mark Wooding
6.\"
7.
8.\"----- Licensing notice ---------------------------------------------------
9.\"
10.\" This file is part of Runlisp, a tool for invoking Common Lisp scripts.
11.\"
12.\" Runlisp is free software: you can redistribute it and/or modify it
13.\" under the terms of the GNU General Public License as published by the
14.\" Free Software Foundation; either version 3 of the License, or (at your
15.\" option) any later version.
16.\"
17.\" Runlisp is distributed in the hope that it will be useful, but WITHOUT
18.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
19.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
20.\" for more details.
21.\"
22.\" You should have received a copy of the GNU General Public License
23.\" along with Runlisp. If not, see <https://www.gnu.org/licenses/>.
24.
25.ie t \{\
26. ds o \(bu
27. if \n(.g \{\
28. fam P
29. ev an-1
30. fam P
31. ev
32. \}
33.\}
34.el \{\
35. ds o o
36.\}
37.
38.de hP
39.IP
40\h'-\w'\fB\\$1\ \fP'u'\fB\\$1\ \fP\c
41..
eea3b0c7 42.ds .. \&.\|.\|.
e29834b8
MW
43.
44.\"--------------------------------------------------------------------------
45.TH runlisp 1 "2 August 2020" "Mark Wooding"
46.SH NAME
47runlisp \- run Common Lisp programs as scripts
48.
49.\"--------------------------------------------------------------------------
50.SH SYNOPSIS
51.
52.B runlisp
10427eb2
MW
53.RI [ options ]
54.RB [ \-\- ]
55.I script
56.RI [ arguments
eea3b0c7 57\*(..]
e29834b8 58.br
10427eb2
MW
59.B runlisp
60.RI [ options ]
05a9f820
MW
61.RB [ \-d
62.IR form ]
e29834b8 63.RB [ \-e
ee78edd0 64.IR form ]
e29834b8
MW
65.RB [ \-l
66.IR file ]
d2dbcc6f
MW
67.RB [ \-p
68.IR form ]
69.if !t \{\
70.br
71 \c
72.\}
e29834b8 73.RB [ \-\- ]
e29834b8 74.RI [ arguments
eea3b0c7 75\*(..]
10427eb2
MW
76.PP
77where
78.I options
79is
80.br
8ed4c352 81 \c
10427eb2
MW
82.RB [ \-CDEnqv ]
83.RB [ +DEn ]
84.RB [ \-L
eea3b0c7 85.IB sys , sys , \fR\*(..]
8ed4c352
MW
86.if !t \{\
87.br
88 \c
89.\}
10427eb2
MW
90.RB [ \-c
91.IR conf ]
92.RB [ \-o
93.RI [ sect \c
94.BR : ] \c
95.IB var = \c
96.IR value ]
e29834b8
MW
97.
98.\"--------------------------------------------------------------------------
99.SH DESCRIPTION
100.
101The
102.B runlisp
103program has two main functions.
104.hP 1.
105It can be used in a script's
106.RB ` #! '
107line to run a Common Lisp script.
108.hP 2.
109It can be used in build scripts
110to invoke a Common Lisp system,
111e.g., to build a standalone program.
112.
e29834b8
MW
113.SS "Options"
114Options are read from the command line, as usual,
10427eb2
MW
115but also (by default) from the script's second line,
116following a
e29834b8 117.RB ` @RUNLISP: '
10427eb2 118marker: see
e29834b8 119.B Operation
10427eb2 120below for the details.
e29834b8
MW
121.
122.PP
123The options accepted are as follows.
124.
125.TP
10427eb2 126.BR "\-h" ", " "\-\-help"
e29834b8 127Write a synopsis of
10427eb2 128.BR query-runlisp-config 's
e29834b8
MW
129command-line syntax
130and a description of the command-line options
131to standard output
132and immediately exit with status 0.
133.
134.TP
10427eb2 135.BR "\-V" ", " "\-\-version"
e29834b8 136Write
10427eb2 137.BR query-runlisp-config 's
e29834b8
MW
138version number
139to standard output
140and immediately exit with status 0.
141.
142.TP
10427eb2 143.BR "\-D" ", " "\-\-vanilla-image"
e29834b8
MW
144Don't check for a custom Lisp image.
145Usually,
146.B runlisp
147tries to start Lisp systems using a custom image,
148so that they'll start more quickly;
149the
150.RB ` \-D '
151option forces the use of the default `vanilla' image
152provided with the system.
153There's not usually any good reason to prefer the vanilla image,
154except for performance comparisons, or debugging
155.B runlisp
156itself.
10427eb2
MW
157Negate with
158.B +D
159or
160.BR \-\-no-vanilla-image .
e29834b8
MW
161.
162.TP
10427eb2 163.BR "\-E" ", " "\-\-command-line-only"
e29834b8
MW
164Don't read embedded options from the
165second line of the
166.I script
167file.
10427eb2
MW
168Negate with
169.B +E
170or
171.BR \-\-no-command-line-only .
e29834b8 172This has no effect in eval mode.
e29834b8
MW
173.
174.TP
eea3b0c7 175.BI "\-L" "\fR, " "\-\-accept-lisp=" sys , sys ,\fR\*(..
e29834b8
MW
176Use one of the named Lisp systems.
177Each
178.I sys
10427eb2
MW
179must name a supported Lisp system;
180the names are separated by a comma
181.RB ` , '
182and/or one or more whitespace characters.
e29834b8
MW
183This option may be given more than once:
184the effect is the same as a single option
185listing all of the systems named, in the same order.
186If a system is named more than once,
187a warning is issued (at verbosity level 1 or higher),
188and all but the first occurrence is ignored.
189.
190.TP
10427eb2
MW
191.BI "\-c" "\fR, " "\-\-config-file=" conf
192Read configuration from
193.IR conf .
194If
195.I conf
196is a directory, then all of the files within
197whose names end with
198.RB ` .conf ',
199are loaded, in ascending lexicographical order;
200otherwise,
201.I conf
202is opened as a file.
af677646 203All of the files are expected to be as described in
10427eb2 204.BR runlisp.conf (5).
e29834b8
MW
205.
206.TP
05a9f820
MW
207.BI "\-d" "\fR, " "\-\-dump-expression=" expr
208Evaluate the expression(s)
209.I expr
210and print the resulting value(s)
211to standard output
d2dbcc6f
MW
212(with
213.B *print-escape*
214true, as if by
05a9f820
MW
215.BR prin1 ).
216If a form produces multiple values,
217they are printed on a single line,
218separated by a single space character;
219if a form produces no values at all,
220then nothing is printed \(en not even a newline character.
221This option causes
222.B runlisp
223to execute in
224.I eval
225mode.
d2dbcc6f
MW
226See also
227.RB ` \-p ',
228which prints with
229.B *print-escape*
230false.
05a9f820
MW
231.
232.TP
10427eb2 233.BI "\-e" "\fR, " "\-\-evaluate-expression=" expr
e29834b8
MW
234Evaluate the expression(s)
235.I expr
236and discard the resulting values.
237This option causes
238.B runlisp
239to execute in
240.I eval
241mode.
242.
243.TP
10427eb2 244.BI "\-l" "\fR, " "\-\-load-file=" file
e29834b8
MW
245Read and evaluate forms from the
246.IR file .
247This option causes
248.B runlisp
249to execute in
250.I eval
251mode.
252.
253.TP
bf52b6ca 254.BR "\-n" ", " "\-\-dry-run"
e29834b8
MW
255Don't actually start the Lisp environment.
256This may be helpful for the curious,
257in conjunction with
258.RB ` \-v '
259to increase the verbosity.
10427eb2
MW
260Negate with
261.B +n
262or
263.BR "\-\-no-dry-run" .
e29834b8
MW
264.
265.TP
497e5a4a
MW
266.BI "\-o" "\fR, " "\-\-set-option=\fR[" sect :\fR] var = value
267Assign
268.I value
269to the variable
270.I var
271in configuration section
272.IR sect ,
273or
274.B @CONFIG
275if no section is specified.
276The value is unexpandable,
277and overrides any similarly named setting
278from the configuration file(s).
279.
280.TP
d2dbcc6f
MW
281.BI "\-p" "\fR, " "\-\-print-expression=" expr
282Evaluate the expression(s)
283.I expr
284and print the resulting value(s)
285to standard output
286(with
287.B *print-escape*
288false, as if by
289.BR princ ).
290If a form produces multiple values,
291they are printed on a single line,
292separated by a single space character;
293if a form produces no values at all,
294then nothing is printed \(en not even a newline character.
295This option causes
296.B runlisp
297to execute in
298.I eval
299mode.
300See also
301.RB ` \-d ',
302which prints with
303.B *print-escape*
304true.
305.
306.TP
10427eb2 307.BR "\-q" ", " "\-\-quiet"
e29834b8
MW
308Don't print warning messages.
309This option may be repeated:
310each use reduces verbosity by one step,
311counteracting one
312.RB ` \-v '
313option.
314The default verbosity level is 1,
315which prints only warning measages.
316.
317.TP
10427eb2 318.BR "\-v" ", " "\-\-verbose"
e29834b8
MW
319Print informational or debugging messages.
320This option may be repeated:
321each use increases verbosity by one step,
322counteracting one
323.RB ` \-q '
324option.
325The default verbosity level is 1,
326which prints only warning measages.
327Higher verbosity levels print informational and debugging messages.
328.
329.PP
330The
05a9f820 331.RB ` \-d ',
e29834b8 332.RB ` \-e ',
d2dbcc6f 333.RB ` \-l ',
e29834b8 334and
d2dbcc6f 335.RB ` \-p '
e29834b8
MW
336options may only be given on the command-line itself,
337not following a
d586960a 338.RB ` @RUNLISP: '
10427eb2 339marker in a script.
e29834b8
MW
340These options may be given multiple times:
341they will be processed in the order given.
342If any of these options is given, then no
343.I script
344name will be parsed;
345instead, use
346.RB ` \-l '
347to load code from files.
348The
349.IR arguments ,
ace01e71 350if any,
e29834b8
MW
351are still made available to the evaluated forms and loaded files.
352.
353.SS "Operation"
354The
355.B runlisp
356program behaves as follows.
10427eb2
MW
357.
358.hP 1.
e29834b8
MW
359The first thing it does is parse its command line.
360Options must precede positional arguments,
361though the boundary may be marked explicitly using
362.RB ` \-\- '
363if desired.
364If the command line contains any of
05a9f820 365.RB ` \-d ',
e29834b8 366.RB ` \-e ',
05a9f820 367.RB ` \-l ',
d2dbcc6f
MW
368or
369.RB ` \-p ',
e29834b8
MW
370then
371.B runlisp
372treats all of its positional arguments as
373.I arguments
374to provide to the given forms and files,
375and runs in
376.I eval
377mode;
378otherwise, the first positional argument becomes the
379.I script
380name, the remaining ones become
381.IR arguments ,
382and
383.B runlisp
384runs in
385.I script
386mode.
10427eb2 387.hP 2.
e29834b8
MW
388In
389.I script
390mode,
44ccabcb
MW
391and if the
392.RB ` \-E '
393option was not given,
e29834b8
MW
394.B runlisp
395reads the second line of the script file,
396and checks to see if it contains the string
397.RB ` @RUNLISP: '.
398If so, then the following text is parsed
399for
400.IR "embedded options" ,
401as follows.
10427eb2
MW
402.RS
403.PP
e29834b8
MW
404The text is split into words
405separated by sequences of whitespace characters.
406Whitespace,
407and other special characters,
408can be included in a word by
409.I quoting
410or
411.IR escaping .
412Text between single quotes
eea3b0c7 413.BR ' \*(.. '
e29834b8
MW
414is included literally, without any further interpretation;
415text between double quotes
eea3b0c7 416.BR """" \*(.. """"
e29834b8
MW
417is treated literally,
418except that escaping can still be used
419to escape (e.g.) double quotes and the escape character itself.
420Outside of single quotes, a backslash
421.RB ` \e '
422causes the following character to be included in a word
423regardless of its usual meaning.
424(None of this allows a newline character
425to be included in a word:
426this is simply not possible.)
427A word which is
428.RB ` \-\- '
429before processing quoting and escaping
430marks the end of embedded options.
431As a concession to Emacs users,
432if the sequence
433.RB ` \-*\- '
434appears at the start of a word
435before processing quoting and escaping,
436then everything up to and including the next occurrence of
437.RB ` \-*\- '
438is ignored.
10427eb2 439.PP
e29834b8
MW
440The resulting list of words
441is processed as if it held further command-line options.
10427eb2
MW
442Currently, only
443.RB ` \-D '
444and
445.RB ` \-L '
446options are permitted in embedded option lists:
447.RB ` \-h '
448and
449.RB ` \-v '
450are clearly only useful in interactive use;
451setting
452.RB ` \-q '
453or
454.RB ` \-v '
455would just be annoying;
456setting
457.RB ` \-c '
458or
459.RB ` \-o '
460would override the user's command-line settings;
461it's clearly too late to set
462.RB ` \-E ';
463and
e29834b8
MW
464.B runlisp
465is now committed to
466.I script
10427eb2 467mode, so it's too late for
05a9f820 468.RB ` \-d ',
e29834b8 469.RB ` \-e ',
d2dbcc6f 470.RB ` \-l ',
e29834b8 471and
d2dbcc6f 472.RB ` \-p '
10427eb2
MW
473too.
474.PP
e29834b8
MW
475(This feature allows scripts to provide options even if they use
476.BR env (1)
477to find
478.B runlisp
479on the
480.BR PATH ,
481or to provide more than one option,
482since many operating systems pass the text following
483the interpreter name on a
484.RB ` #! '
485line as a single argument, without further splitting it at spaces.)
10427eb2
MW
486.RE
487.
488.hP 3.
489If no
490.RB ` \-c '
491options were given,
492then the default configuration files are read:
493the system configuration from
494.B @etcdir@/runlisp.conf
e29834b8 495and
10427eb2
MW
496.BR @etcdir@/runlisp.d/*.conf ,
497and the user configuration from
498.B ~/.runlisp.conf
499and/or
500.BR ~/.config/runlisp.conf :
501see
502.RB runlisp.conf (5)
503for the details.
504.
505.hP 4.
e29834b8
MW
506The list of
507.I "acceptable Lisp implementations"
508is determined.
509If any
510.RB ` \-L '
10427eb2 511options have been found,
e29834b8
MW
512then the list of acceptable implementations
513consists of all of the implementations mentioned in
bf52b6ca 514.RB ` \-L '
e29834b8
MW
515options
516in any of the places
517.B runlisp
518looked for options,
519in the order of their first occurrence.
520(If an implementation is named more than once,
521then
522.B runlisp
523prints a warning to stderr
524and ignores all but the first occurrence.)
525If no
526.RB ` \-L '
527option is given, then
528.B runlisp
529uses a default list,
10427eb2
MW
530which consists of all of the Lisp implementations
531defined in its configuration,
532in the order in which they were defined.
533.
534.hP 5.
e29834b8
MW
535The list of
536.I "preferred Lisp implementations"
537is determined.
10427eb2
MW
538If the environment variable
539.B RUNLISP_PREFER
540is set,
541then its value should be a list of names of Lisp implementations
542separated by a comma and/or one or more whitespace characters.
543Otherwise, if there is a setting for the variable
544.B prefer
545in the
546.B @CONFIG
547configuration section,
548then its (expanded) value should be a list of Lisp implementations,
549in the same way.
550Otherwise, the list of preferred implementations is empty.
551.
552.hP 6.
553If
e29834b8 554.B runlisp
10427eb2
MW
555is running in
556.I eval
557mode, then a new command line is built,
558which invokes an internal script,
559instructing it to evaluate and print the requested expressions,
560and load the requested files.
561.
562.hP 7.
e29834b8
MW
563Acceptable Lisp implementations are tried in turn.
564First, the preferred implementations
565which are also listed as acceptable implementations
566are tried, in the order in which they appear
567in the preferred implementations list;
568then, the remaining acceptable implementations are tried
569in the order in which they appear
570in the acceptable implementations list.
10427eb2
MW
571.RS
572.PP
573A Lisp implementation is defined by a configuration section
574which defines a variable
575.BR run-script .
576The name of the configuration section
577is the name of the Lisp implementation,
578as used in the acceptable and preferred lists described above.
579.hP (a)
580The variable
581.B image-file
582is looked up in the configuration section.
583If a value is found, then
584.B runlisp
585looks up and expands
586.BR image-path ,
587and checks to see if a file exists with the resulting name.
588If so, it sets the variable
589.B @image
590to
591.B t
592in the configuration section.
593.hP (b)
594The variable
595.B run-script
596is expanded and word-split.
597The
598.I script
599(an internal script, in
600.I eval
601mode)
602and
603.IR argument s
604are appended, and
605the entire list is passed to the
e29834b8
MW
606.BR execvp (3)
607function.
608If that succeeds, the Lisp implementation runs;
609if it fails with
610.B ENOENT
611then other Lisp systems are tried;
612if it fails with some other error, then
613.B runlisp
614reports an error message to stderr
615and exits unsuccessfully
616(with code 127).
617If the
618.RB ` \-n '
619option was given, then
620.B runlisp
621just simulates the behaviour of
622.BR execvp (3),
623printing messages to stderr
624if the verbosity level is sufficiently high,
625and exits.
e29834b8
MW
626.
627.SS "Script environment"
10427eb2
MW
628Many Lisp implementations don't provide a satisfactory environment
629for scripts to run in.
630The actual task of invoking a Lisp implementation
631is left to configuration,
632but the basic configuration supplied with
e29834b8 633.B runlisp
10427eb2 634ensures the following facts about their environment.
e29834b8
MW
635.hP \*o
636The keyword
637.B :runlisp-script
638is added to the
639.B *features*
640list if
641.B runlisp
642is running in
643.I script
644mode.
645.hP \*o
646Most Lisp systems support a user initialization file
647which they load before entering the REPL;
648some also have a system initialization file.
649The
650.B runlisp
651program arranges
652.I not
653to read these files,
654so that the Lisp environment is reasonably predictable,
655and to avoid slowing down script startup
656with things which are convenient for use in an interactive session,
657but can't be relied upon by a script anyway.
658.hP \*o
659The Unix standard input, standard output, and standard error files
660are available through the Lisp
661.BR *standard-input* ,
662.BR *standard-output* ,
663and
664.BR *error-output*
665streams, respectively.
666.hP \*o
667Both
668.B *compile-verbose*
669and
670.B *load-verbose*
671are set to nil.
672On CMU\ CL,
673.B ext:*require-verbose*
674is also nil.
675Alas, this is insufficient to muffle noise while loading add-on systems
676on some implementations.
677.hP \*o
678If an error is signalled, and not caught by user code,
679then the process will print a message to stderr
680and exit with a nonzero status.
681The reported message may be a long, ugly backtrace,
682or a terse error report.
683If no error is signalled but not caught,
684then the process will exit with status 0.
685.hP \*o
686The initial package is
687.BR COMMON-LISP-USER ,
688which has no symbols `present' (i.e., imported or interned).
689.hP \*o
690The
691.B asdf
692and
693.B uiop
694systems are already loaded.
695Further systems can be loaded using
696.B asdf:load-system
697as usual.
698The script name
699(which is only meaningful if
700.B runlisp
701is in
702.I script
703mode, obviously)
704and arguments are available through the
705.B uiop:argv0
706function and
707.B uiop:*command-line-arguments*
708variable, respectively.
709.
710.\"--------------------------------------------------------------------------
711.
8996f767 712.SH BUGS
e29834b8
MW
713.hP \*o
714Loading ASDF systems is irritatingly noisy
715with some Lisp implementations.
716Suggestions for how to improve this are welcome.
717.hP \*o
718More Lisp implementations should be supported.
719I've supported the ones I have installed.
720I'm not willing to put a great deal of effort into supporting
721non-free Lisp implementations;
722but help supporting free Lisps is much appreciated.
723.hP \*o
724The protocol for passing the script name through to
725.B uiop
726(specifically, through the
727.B __CL_ARGV0
728environment variable)
729is terribly fragile,
730but supporting
731.B uiop
732is obviously a better approach than introducing a
733.BR runlisp -specific
734interface to the same information.
735I don't know how to fix this:
736suggestions are welcome.
737.
8996f767
MW
738.SH SEE ALSO
739.BR dump-runlisp-image (1),
740.BR query-runlisp-config (1),
741.BR runlisp.conf (5).
e29834b8 742.
8996f767 743.SH AUTHOR
e29834b8
MW
744Mark Wooding, <mdw@distorted.org.uk>
745.
746.\"----- That's all, folks --------------------------------------------------