我正在尝试使用 ECL 构建可执行文件。我查看了文档和其他SO 问题,我们了解到使用 ECL v <= 16.1.3 我们必须添加一个
(require 'adsf)
然后我将我的项目推送到 asdf 注册表:
(pushnew "~/projects/my-project/" asdf:*central-registry* :test #'equal)
我加载它:
(load "my-project.asd")
我的程序显然有 Quicklisp 依赖项。
我将 Quicklisp 的初始化从我的复制.sbclrc
到~/.eclrc
:
#-quicklisp
(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
(user-homedir-pathname))))
(when (probe-file quicklisp-init)
(load quicklisp-init)))
所以我可以快速加载我的项目:(此步骤未出现在文档中,但这允许找到项目依赖项)
(ql:quickload "my-project")
我也
(use-package :my-project)
但现在,因为我想构建可执行文件
(asdf:make-build :my-project
:type :program
:move-here #P"./"
:epilogue-code '(progn (my-project:main)
(si:exit)))
我得到错误
在#<"ASDF/INTERFACE" package> 中找不到外部符号 MAKE-BUILD。
有人可以帮忙吗?谢谢 !
ECL 16.1.3
ps:而且好像,在REPL中,进入重启nb是没有效果的。
我的生成文件:
ecl-build:
~/.roswell/impls/x86-64/linux/ecl/16.1.3/bin/ecl \
--eval "(require 'asdf)" \
--eval '(format t "--- ASDF version: ~a~&" (asdf:asdf-version))' \
--eval "(pushnew \"~/projets/cl-torrents/\" asdf:*central-registry* :test 'equal)" \
--eval '(load "cl-torrents.asd")' \
--eval '(asdf:make-build :cl-torrents :type :program :move-here #P"./" :epilogue-code "(progn (torrents "matrix") (si:exit))")'
结果:
;;; Loading "/home/vince/quicklisp/setup.lisp"
;;; Loading #P"/home/vince/.roswell/impls/x86-64/linux/ecl/16.1.3/lib/ecl-16.1.3/asdf.fas"
--- ASDF version: 3.2.1
An error occurred during initialization:
Cannot find the external symbol MAKE-BUILD in #<"ASDF/INTERFACE" package>..
Makefile:22: recipe for target 'ecl-build' failed
make: *** [ecl-build] Error 1
10 月 27 日编辑 - 进度
现在最简单的路径似乎不确定是否使用捆绑到 ECL 中的 ASDF,这将具有该make-build
命令。
由于我的 Quicklisp 的初始化代码为~/.eclrc
. 我删除了它,现在我有了 ASDF v3.1.8.2,没关系。但是现在,ECL 不知道任何依赖项:
组件 :DEXADOR 未找到,# 需要。
确实,因为不再有 Quicklisp。
ECL 文档说将所有库路径包含到asdf:*central-registry*
. 一次偶然的机会,Quicklisp 将所有库安装到~/quicklisp/dists/quicklisp/software/
.
首先,我想知道这将如何在 Quicklisp 之前没有运行过的 CI 管道中工作……</p>
然后我看到只添加这个目录是不够的,Dexador的依赖又会找不到,我必须精确地添加dexador的目录:
--eval "(pushnew \"~/quicklisp/dists/quicklisp/software/dexador-20170830-git/\" asdf:*central-registry* :test 'equal)" \
那么我真的必须编写代码来包含这里的每个目录吗?
当 Quicklisp 以前没有运行过一次时如何使这项工作?
更新:使用与 Roswell 一起安装的 Ecl:require
在我的 .eclrc 中的所有内容之前输入 asdf,在 Quicklisp 初始化 3.2.1 和make-build
符号未知之后给出版本 3.1.8.2。
使用 Debian 的 Ecl:首先是 v2.33.10,然后是 v3.2.1。
看起来像一个死胡同。
11 月更新:我等待 ASDF 3.3.0 的发布来手动更新。这是越野车。邮件列表上的消息:等待 3.3.1:再次出现错误。
使用lisp-devel Docker 镜像,发布 ECL 16.1.3。(我不想在每个 VPS 上自己编译 ECL)。我可以构建一个可执行文件(重量为 52Mo),但出现运行时错误:
类型条件:在 > 编译文件 NIL 中引用但尚未创建的 SIMPLE-ERROR 包 ((UIOP/STREAM . #))