common-lisp
Создание бинарников
Поиск…
Строительство Buildapp
Автономные Common Lisp-файлы могут быть созданы с помощью buildapp
. Прежде чем мы сможем использовать его для создания двоичных файлов, нам нужно его установить и построить.
Самый простой способ я знаю, как использовать quicklisp
и Common Lisp (в этом примере используется [ sbcl
], но не имеет значения, какой из них у вас есть).
$ 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
$
Когда вы создадите этот двоичный файл, вы можете использовать его для создания двоичных файлов ваших общих программ Lisp. Если вы намереваетесь сделать это много, вы также можете поместить его где-нибудь в свой PATH
чтобы вы могли просто запустить его с помощью buildapp
из любого каталога.
Buildapp Hello World
Простейший возможный двоичный код, который вы могли бы построить
- Не имеет зависимостей
- Не принимает аргументы командной строки
- Просто пишет «Привет, мир!».
stdout
После того, как вы построили buildapp
, вы можете просто ...
$ 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
Более реалистичный пример включает проект, который вы создаете с несколькими файлами на диске (а не с опцией --eval
переданной buildapp
), и некоторыми зависимостями, чтобы втянуть.
Поскольку во время поиска и загрузки систем asdf
(включая загрузку других, потенциально несвязанных систем) может случиться что-либо, недостаточно просто проверить файлы asd
проектов, в которых вы находитесь, чтобы узнать, что вам нужно загрузить , Общий подход - использовать quicklisp
для загрузки целевой системы, а затем вызвать ql:write-asdf-manifest-file
чтобы выписать полный манифест всего загруженного.
Вот игрушечная система, построенная с помощью hunchentoot
чтобы проиллюстрировать, как это может произойти на практике:
;;;; 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
После того, как вы сохраните эти файлы в каталоге с именем buildapp-hello-web-world
, вы можете сделать
$ 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
Это создает двоичный файл, который делает именно то, что, по вашему мнению, должен, учитывая вышеизложенное.
$ ./hello-web-world
Press any key to exit...
Затем вы можете запустить еще одну оболочку, сделать curl localhost:4242
и увидеть ответ в стиле « Hello Web World!
распечатайте.