使用 ECL 构建可执行文件:缺少依赖项或无法在 asdf/interface 中找到 make-build

Building an executable with ECL: missing dependency or can not find make-build in asdf/interface

我正在尝试使用 ECL 构建可执行文件。我查看了 the doc and this other SO question,我们了解到 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)))

我收到错误

Cannot find the external symbol MAKE-BUILD in #<"ASDF/INTERFACE" package>.

有人可以帮忙吗?谢谢!

ECL 16.1.3

ps: 而且好像在REPL里面输入restart 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 版本。我删除了它,现在我有 ASDF v3.1.8.2,没问题。但是现在,ECL 不知道任何依赖关系:

Component :DEXADOR not found, required by #.

确实如此,因为已经没有 Quicklisp 了。

ECL doc 表示将所有库路径包含到 asdf:*central-registry* 中。一个偶然的机会,Quicklisp 将所有库安装到 ~/quicklisp/dists/quicklisp/software/

首先,我想知道这将如何在 Quicklisp 之前没有 运行 的 CI 管道中工作......

然后我看到只添加这个目录是不行的,Dexador的依赖又会找不到,我只好准确添加dexador的目录:

    --eval "(pushnew \"~/quicklisp/dists/quicklisp/software/dexador-20170830-git/\" asdf:*central-registry* :test 'equal)" \

那么我真的必须编写代码来包含这里的每个目录吗?

当 Quicklisp 以前没有 运行 一次时如何使它工作?

更新:随着 Ecl 与 Roswell 一起安装:requireing asdf 在我的 .eclrc 中的所有内容之前给出版本 3.1.8.2,在 Quicklisp 初始化 3.2.1 和make-build 符号未知。

使用 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),但出现 运行 时间错误:

Condition of type: SIMPLE-ERROR Package ((UIOP/STREAM . #)) referenced in > compiled file NIL but has not been created

这似乎是与 ASDF 和 ECL 的兼容性问题,这在上次提交中解决了 look here

Add back make-build on ECL

This provides for backward compatibility with ECL, whose current maintainer Daniel K. has decided to keep supporting the make-build interface and has forked ASDF for that.

你可以install/use来自这个repo

的最后一个ASDF

您可以使用捆绑的 ASDF(这是一个冻结的 3.1.7 版本,向后移植了一些修复程序)– 然后您使用 (require asdf) 加载 ASDF,或者您可以使用上游 3.3 版本。

如果您有兴趣使用上游 ASDF,请下载 asdf.lisp 文件并调用: (load (compile-file "/path/to/asdf.lisp")) 而不是 (require 'asdf)

我使用了 lisp-devel Docker 图片,发布了 ECL 16.1.3。 (我不想在每个 VPS 上自己编译 ECL)。我可以构建一个可执行文件(重量为 52Mo VS 78Mo 与 SBCL),因此我能够使用 Gitlab CI.

交付它

作为参考,启动 Docker 并安装您的源代码:

service docker start
docker run --rm -it -v /home/you/projets/project:/usr/local/share/common-lisp/source  daewok/lisp-devel:latest bash

不幸的是我遇到了一个运行时错误:

Condition of type: SIMPLE-ERROR Package ((UIOP/STREAM . #)) referenced in > compiled file NIL but has not been created

看来我还必须 ql:quickload :closer-mop 手动加载我的应用程序。

我不会调查这个。