Как исправить ошибку asdf при использовании buildapp в проекте quicklisp

В последнее время я делаю свой первый quicklisp-проект и хочу им поделиться. Я разместил это на github, но не у всех установлены emacs + slime + quicklisp, поэтому я хотел сделать исполняемый файл, который я мог бы поместить с кодом.

Для этого я использую buildapp и следую шагам, изложенным в этом ответ на переполнение стека.

$ sbcl --no-userinit --no-sysinit --non-interactive \
       --load ~/quicklisp/setup.lisp \
       --eval '(ql:quickload "ltk-colorpicker")' \
       --eval '(ql:write-asdf-manifest-file "quicklisp-manifest.txt")'

$ buildapp --output out \
           --manifest-file quicklisp-manifest.txt \
           --load-system ltk-colorpicker \
           --entry colorpicker

После выполнения этих команд я получаю следующую ошибку:

Fatal INPUT-ERROR-IN-LOAD:
  READ error during LOAD:

    The symbol "*SYSTEM-DEFINITION-SEARCH-FUNCTIONS*" is not external in the ASDF/FIND-SYSTEM package.

      Line: 16, Column: 90, File-Position: 15267

      Stream: #<SB-INT:FORM-TRACKING-STREAM for "file /home/nathan/quicklisp/local-projects/ltk-colorpicker/dumper-2SKVI5f7.lisp" {1001B70F83}>

Основная проблема здесь в том, что я даже не знаю, как начать это исправлять. Я видел эту проблему gibhub, но она была связана с проблемами с Homebrew и он даже не упоминает buildapp. Все очень запутанно. И я надеюсь, что смогу получить помощь.

Заранее спасибо за любые ответы.


person Trashtalk    schedule 21.08.2019    source источник
comment
Упомянутая вами проблема с github упоминает buildapp, и мне кажется, что проблема заключается в отсутствии обратной совместимости между ASDF и buildapp. Возможно, вам нужна более новая версия buildapp (или соберите ее из исходного кода).   -  person Svante    schedule 22.08.2019
comment
К вашему сведению, вы не должны обязаны использовать buildapp для создания исполняемых файлов. Мы можем использовать asdf:make, см. lispcookbook.github.io/cl-cookbook/ scripting.html#with-asdf и пс: требую скриншот :)   -  person Ehvince    schedule 22.08.2019


Ответы (2)


Я могу воспроизвести ошибку. Как было предложено в комментариях, вы можете создать актуальную версию buildapp следующим образом:

$ sbcl
* (ql:quickload :buildapp)
...

* (buildapp:build-buildapp 
    (merge-pathnames "bin/buildapp" (user-homedir-pathname)))

Эта сборка $HOME/bin/buildapp. Когда я использую новый двоичный файл, ошибки больше нет.

Вы также можете избежать создания исполняемого файла (который может оказаться устаревшим), систематически вызывая функцию buildapp::main из Common Lisp; тогда у вас всегда будет версия, соответствующая текущему выпуску quicklisp:

* (buildapp::main 
    '("BUILDAPP" ;; argv[0] must exist but the value is not important
      "--manifest-file" "/tmp/quicklisp-manifest.txt" 
      "--load-system" "drakma" "--output" "/tmp/test"))
person coredump    schedule 22.08.2019

Некоторая дополнительная информация с моей точки зрения:

Решение состояло в том, чтобы использовать новейшую версию buildapp, как упоминал @coredump. Я обновился, перейдя на страницу github, загрузив zip и выполнив следующие команды в точке, где buildapp хранится.

$ make
$ cp buildapp /usr/bin

(Конечно, это работает только в Linux.) Это не элегантное решение, но buildapp не обновлялось 4 года, я думаю, что это достаточно безопасная ставка. Я тоже ошибся с командой. Часть --entry неверна. Это должно было быть: `--entry ltk-colorpicker::main``, где main — это функция, которая принимает одну переменную, поскольку этого требует спецификация.

Главное вот это: (main (i) (declare (ignore i)) (colorpicker))

person Trashtalk    schedule 22.08.2019