common-lisp
Erstellen von Binärdateien
Suche…
Gebäude bauenapp
Standalone-Common-Lisp-Binaries können mit buildapp
. Bevor wir es zum Erzeugen von Binärdateien verwenden können, müssen wir es installieren und erstellen.
Am einfachsten weiß ich, wie man quicklisp
und Common Lisp verwendet (dieses Beispiel verwendet [ sbcl
], aber es sollte keinen Unterschied machen, welchen Sie verwenden).
$ 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
$
Wenn Sie diese Binärdatei erstellt haben, können Sie Binärdateien Ihrer Common Lisp-Programme erstellen. Wenn Sie beabsichtigen , diese viel zu tun, sollten Sie es auch wahrscheinlich irgendwo auf Ihrem setzen PATH
, so dass Sie nur mit ausführen können buildapp
aus einem beliebigen Verzeichnis.
Buildapp Hallo Welt
Die einfachste mögliche Binärdatei, die Sie erstellen könnten
- Hat keine Abhängigkeiten
- Nimmt keine Befehlszeilenargumente an
- Schreibt einfach "Hallo Welt!"
stdout
Nachdem Sie buildapp
, können Sie einfach ...
$ 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 Hallo Webwelt
Ein realistischeres Beispiel betrifft ein Projekt, das Sie mit mehreren Dateien auf der Festplatte erstellen (und nicht die Option --eval
die an buildapp
) sowie einige Abhängigkeiten, die Sie buildapp
.
Da beim Finden und Laden von asdf
Systemen beliebige Dinge passieren können (einschließlich des Ladens anderer, möglicherweise nicht zusammenhängender Systeme), reicht es nicht aus, nur die asd
Dateien der Projekte zu überprüfen, von denen Sie abhängig sind, um herauszufinden, was Sie laden müssen . Der allgemeine Ansatz besteht quicklisp
, das Zielsystem mit quicklisp
zu laden und anschließend ql:write-asdf-manifest-file
, um ein volles Manifest über alles zu schreiben, was geladen ist.
Hier ist ein Spielzeug mit hunchentoot
zu zeigen, wie das in der Praxis passieren könnte:
;;;; 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
Wenn Sie diese Dateien in einem Verzeichnis namens buildapp-hello-web-world
gespeichert haben, können Sie dies tun
$ 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
Dies erzeugt eine Binärdatei, die genau das tut, was Sie angesichts der obigen Angaben Ihrer Meinung nach tun sollten.
$ ./hello-web-world
Press any key to exit...
Sie sollten dann in der Lage sein, eine andere Shell zu curl localhost:4242
und die Klartextantwort von Hello Web World!
ausdrucken lassen