common-lisp
Créer des fichiers binaires
Recherche…
BuildingApp
Les binaires Common Lisp autonomes peuvent être buildapp
avec buildapp
. Avant de pouvoir l'utiliser pour générer des fichiers binaires, nous devons l'installer et le construire.
La façon la plus simple de savoir comment utiliser quicklisp
et Common Lisp (cet exemple utilise [ sbcl
], mais cela ne devrait pas faire la différence.)
$ sbcl
This is SBCL 1.3.5.nixos, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.
SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses. See the CREDITS and COPYING files in the
distribution for more information.
* (ql:quickload :buildapp)
To load "buildapp":
Load 1 ASDF system:
buildapp
; Loading "buildapp"
(:BUILDAPP)
* (buildapp:build-buildapp)
;; loading system "buildapp"
[undoing binding stack and other enclosing state... done]
[saving current Lisp image into /home/inaimathi/buildapp:
writing 4800 bytes from the read-only space at 0x20000000
writing 3216 bytes from the static space at 0x20100000
writing 47349760 bytes from the dynamic space at 0x1000000000
done]
NIL
* (quit)
$ ls -lh buildapp
-rwxr-xr-x 1 inaimathi inaimathi 46M Aug 13 20:12 buildapp
$
Une fois que ce binaire est construit, vous pouvez l'utiliser pour construire des binaires de vos programmes Common Lisp. Si vous avez l'intention de le faire beaucoup, vous devriez probablement le placer quelque part sur votre PATH
afin de pouvoir l'exécuter avec buildapp
depuis n'importe quel répertoire.
Buildapp Hello World
Le binaire le plus simple possible
- N'a pas de dépendances
- Ne prend pas d'arguments en ligne de commande
- Juste écrit "Bonjour tout le monde!"
stdout
Après avoir construit buildapp
, vous pouvez simplement ...
$ buildapp --eval '(defun main (argv) (declare (ignore argv)) (write-line "Hello, world!"))' --entry main --output hello-world
[undoing binding stack and other enclosing state... done]
[saving current Lisp image into hello-world:
writing 4800 bytes from the read-only space at 0x20000000
writing 3216 bytes from the static space at 0x20100000
writing 43220992 bytes from the dynamic space at 0x1000000000
done]
$ ./hello-world
Hello, world!
$
Buildapp Bonjour Web World
Un exemple plus réaliste concerne un projet que vous --eval
avec plusieurs fichiers sur disque (plutôt qu'une option --eval
transmise à buildapp
), et certaines dépendances à buildapp
.
Étant donné que des choses arbitraires peuvent se produire pendant la recherche et le chargement de systèmes asdf
(y compris le chargement d'autres systèmes potentiellement non liés), il ne suffit pas d'inspecter les fichiers asd
des projets dont vous asdf
pour déterminer ce que vous devez charger. . L'approche générale consiste à utiliser quicklisp
pour charger le système cible, puis à appeler ql:write-asdf-manifest-file
pour écrire un manifeste complet de tout ce qui est chargé.
Voici un système de jouet construit avec hunchentoot
pour illustrer comment cela pourrait se produire dans la pratique:
;;;; buildapp-hello-web-world.asd
(asdf:defsystem #:buildapp-hello-web-world
:description "An example application to use when getting familiar with buildapp"
:author "inaimathi <[email protected]>"
:license "Expat"
:depends-on (#:hunchentoot)
:serial t
:components ((:file "package")
(:file "buildapp-hello-web-world"))
;;;; package.lisp
(defpackage #:buildapp-hello-web-world
(:use #:cl #:hunchentoot))
;;;; buildapp-hello-web-world.lisp
(in-package #:buildapp-hello-web-world)
(define-easy-handler (hello :uri "/") ()
(setf (hunchentoot:content-type*) "text/plain")
"Hello Web World!")
(defun main (argv)
(declare (ignore argv))
(start (make-instance 'easy-acceptor :port 4242))
(format t "Press any key to exit...~%")
(read-char))
;;;; build.lisp
(ql:quickload :buildapp-hello-web-world)
(ql:write-asdf-manifest-file "/tmp/build-hello-web-world.manifest")
(with-open-file (s "/tmp/build-hello-web-world.manifest" :direction :output :if-exists :append)
(format s "~a~%" (merge-pathnames
"buildapp-hello-web-world.asd"
(asdf/system:system-source-directory
:buildapp-hello-web-world))))
#### build.sh
sbcl --load "build.lisp" --quit
buildapp --manifest-file /tmp/build-hello-web-world.manifest --load-system hunchentoot --load-system buildapp-hello-web-world --output hello-web-world --entry buildapp-hello-web-world:main
Une fois que vous avez ces fichiers enregistrés dans un répertoire nommé buildapp-hello-web-world
, vous pouvez le faire
$ cd buildapp-hello-web-world/
$ sh build.sh
This is SBCL 1.3.7.nixos, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.
SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses. See the CREDITS and COPYING files in the
distribution for more information.
To load "cffi":
Load 1 ASDF system:
cffi
; Loading "cffi"
........
To load "buildapp-hello-web-world":
Load 1 ASDF system:
buildapp-hello-web-world
; Loading "buildapp-hello-web-world"
....
;; loading system "cffi"
;; loading system "hunchentoot"
;; loading system "buildapp-hello-web-world"
[undoing binding stack and other enclosing state... done]
[saving current Lisp image into hello-web-world:
writing 4800 bytes from the read-only space at 0x20000000
writing 4624 bytes from the static space at 0x20100000
writing 66027520 bytes from the dynamic space at 0x1000000000
done]
$ ls -lh hello-web-world
-rwxr-xr-x 1 inaimathi inaimathi 64M Aug 13 21:17 hello-web-world
Cela produit un binaire qui correspond exactement à ce que vous pensez, compte tenu de ce qui précède.
$ ./hello-web-world
Press any key to exit...
Vous devriez alors pouvoir lancer un autre shell, faire curl localhost:4242
et voir la réponse en texte clair de Hello Web World!
faire imprimer