Создание бинарных файлов

Иногда хочется сделать из своего кода на lisp бинарный файл, который можно было бы запустить в другой системе. Довольно краткий обзор по этой проблеме представлен ниже. Ознакомившись с ним, читатель поймёт куда дальше копать.

Эта заметка стара и датируется 12 годом, возможно сейчас технологии ушли далеко вперёд или наоборот умерли за ненадобностью. Я просто решил перенести её со своего прошлого блога, для того, чтобы объединить все свои знания по lisp на этом портале. К тому же, надеюсь, что кому-то даже такие знания окажутся полезными.

Создание бинарных файлов. Для этого нужен ECL. В репозиториях ubuntu есть, в репозиториях simply не нашёл. В любом случае я качал с git, который указан на официальном сайте. Там версия новей (12.7 на текущий момент).

git clone git://git.code.sf.net/p/ecls/ecl ecl # ECL source code

Скачиваем из git исходные файлы. Затем конфигурируем, компилируем, и устанавливаем:

cd ./ecl
./configure --prefix=/usr/local
make
make install

В ubuntu теперь доступно по псевдониму ecl в simply путь: /usr/local/bin/ecl

Да, компилироваться будет долго. Теперь несколько команд внутри самого ecl для компиляции:

(compile-file "hello.lisp" :system-p t)
(c:build-program "myecl" :lisp-files '("hello.o"))
(quit)

вводить либо по очереди, либо все вместе и потом ещё enter.

Вообще ecl не обязателен. Можно компилировать и в sbcl, только файлы получаются размером в 44 МБ. Потому что там кроме файла ещё и сам sbcl весь лежит 😀

(sb-ext:save-lisp-and-die "my-program.exe" :executable t :toplevel #'main)

И напоследок функция, для получения argv в lisp:

(defun my-command-line ()
(or
#+SBCL *posix-argv*
#+LISPWORKS system:*line-arguments-list*
#+CMU extensions:*command-line-words*
#+ECL ext:*command-args*
nil))

P.S: Проблема в simply-linux решилась простым обновлением. Я взял sbcl 1.0.0.58, скомпилировал у себя и установил, кроме того я взял новый slime. Вот и всё. И мне кажется, что проблема больше в slime. Вот текст конфигурационного файла для simply, старые версии компилятора и slime я не удалял.

(setq inferior-lisp-program "/usr/local/bin/sbcl")
(add-to-list 'load-path "~/slime/")
(require 'slime)
(slime-setup)

Создание бинарных файлов: 10 комментариев

    1. Возможно это по причине того, что создавался он с помощью sbcl. В этом случае, как и было описано в статье внутри файла лежит сам sbcl. С этим уже ничего не поделать.

      1. sbcl поддерживает сжатие образа (см. в мануале, раздел «Saving a core image»).
        Так же можно попробовать еще провернуть фокус, описанный в https://gist.github.com/burtonsamograd/f08f561264ff94391300

        Но этот метод еще нужно дорабатывать, плюс он может потребовать некоторой доработки. Clozure CL, если я правильно помню, генерирует образы поменьше

          1. Спасибо автору за блог. Это хорошее, нужное дело, так как лисп определённо заслуживает больше любви)

          2. Приятно слышать, что блог пригодился кому-то ещё 🙂

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.