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 | 42 | `(cli/clap::defmain (:exit ,exit :export ,export) |
43 | (string-case ((pathname-name (arg0)) :default ,default) |
|
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))) |