changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/lib/cli/multi.lisp

changeset 649: 6e5006dfe7b8
parent: 926d95e5fdc7
child: af486e0a40c9
author: Richard Westhaver <ellis@rwest.io>
date: Thu, 12 Sep 2024 22:38:22 -0400
permissions: -rw-r--r--
description: clap parsing updates
648
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
1
 ;;; multi.lisp --- Multi-entry Lisp Cores
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
2
 
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
3
 ;; Busybox-style Lisp binaries
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
4
 
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
5
 ;;; Commentary:
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
6
 
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
7
 ;; We have quite a few Lisp 'binaries' at this point, each of which
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
8
 ;; are quite bloated Lisp core images with tons of duplication.
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
9
 
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
10
 ;; This setup isn't ideal and while we can compress each individual
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
11
 ;; core, we are much better off if we can just share the same core
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
12
 ;; image and access multiple top-level entrypoints easily.
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
13
 
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
14
 ;; The problem of course is that we want to be able to execute the
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
15
 ;; single core the same as we would the individual bloated
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
16
 ;; binaries. To do this we have two options:
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
17
 
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
18
 ;; - build (non-lisp) trampoline programs which loads the
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
19
 ;;   (non-executable) core as a shared library, and calls
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
20
 ;;   foreign-symbols exposed from lisp.
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
21
 
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
22
 ;; - parse argv[0] and dispatch to the correct top-level
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
23
 ;;   function. Control argv[0] by symlinking to the executable core.
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
24
 
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
25
 ;; This package currently exposes an API for the latter.
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
26
 
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
27
 ;;; Code:
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
28
 (in-package :cli/multi)
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
29
 
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
30
 (defmacro define-multi-main ((&key default (exit t) (export t)) &rest mains)
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
31
   "Define a MAIN function for the current package which dispatches
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
32
   based on the value of '(ARG0)' at runtime to one of the pairs in
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
33
   MAINS.
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
34
 
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
35
 Each element of MAINS is a list of the form (NAME FUNCTION) where NAME
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
36
 is the filename of the symlink which will be handled by the associated
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
37
 main FUNCTION.
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
38
 
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
39
 When you save an executable lisp image with this function you should
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
40
 arrange for symlinks for each handled value of (ARG0) to be generated
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
41
 ."
649
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 648
diff changeset
42
   `(cli/clap::defmain (:exit ,exit :export ,export)
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 648
diff changeset
43
        (string-case ((pathname-name (arg0)) :default ,default)
6e5006dfe7b8 clap parsing updates
Richard Westhaver <ellis@rwest.io>
parents: 648
diff changeset
44
          ,@mains)))
648
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
45
 
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
46
 (defun make-symlinks (src &optional directory &rest names)
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
47
   "Make a set of symlinks from SRC to NAMES.
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
48
 
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
49
 If DIRECTORY is non-nil each name in NAMES is considered relative to
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
50
 it."
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
51
   (when directory
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
52
     (setf names (mapcar (lambda (n) (merge-pathnames n directory)) names)))
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
53
   (dolist (n names)
926d95e5fdc7 cli/multi and slime-cape fixes
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
54
     (sb-posix:symlink src n)))