Поиск…


Строительство 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

Простейший возможный двоичный код, который вы могли бы построить

  1. Не имеет зависимостей
  2. Не принимает аргументы командной строки
  3. Просто пишет «Привет, мир!». 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! распечатайте.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow