common-lisp
Skapa binärer
Sök…
Building Buildapp
Fristående Common Lisp-binärer kan byggas med buildapp
. Innan vi kan använda den för att generera binära filer måste vi installera och bygga den.
Det enklaste sättet jag vet hur man använder quicklisp
och en Common Lisp (det här exemplet använder [ sbcl
], men det borde inte göra någon skillnad vilken du har).
$ 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
$
När du har byggt det binära kan du använda det för att konstruera binära filer för dina Common Lisp-program. Om du tänker göra detta mycket, bör du förmodligen också placera det någonstans på din PATH
så att du bara kan köra det med buildapp
från valfri katalog.
Buildapp Hello World
Den enklaste binära du kan bygga
- Har inga beroenden
- Tar inga kommandoradsargument
- Bara skriver "Hej värld!" att
stdout
När du har byggt buildapp
kan du bara ...
$ 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 Hello Web World
Ett mer realistiskt exempel innebär ett projekt du bygger med flera filer på hårddisken (snarare än en --eval
alternativ skickas till buildapp
), och några beroenden för att dra in.
Eftersom godtyckliga saker kan hända när man hittar och laddar asdf
system (inklusive laddning av andra, potentiellt oberoende system), räcker det inte bara att inspektera asd
filerna för de projekt du är beroende av för att ta reda på vad du behöver ladda . Den allmänna metoden är att använda quicklisp
att ladda målsystemet och sedan ringa ql:write-asdf-manifest-file
att skriva ut en fullständig manifest för allt som laddas.
Här är ett hunchentoot
byggt med hunchentoot
att illustrera hur det kan hända i praktiken:
;;;; 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
När du har sparat filerna i en katalog med namnet buildapp-hello-web-world
kan du göra det
$ 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
Detta producerar en binär som gör exakt vad du tror det borde med tanke på ovanstående.
$ ./hello-web-world
Press any key to exit...
Du borde då kunna avfyra ett curl localhost:4242
skal, göra curl localhost:4242
och se klartext svar från Hello Web World!
bli tryckt ut.