0

我正在尝试使用 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 . #))

4

3 回答 3

2

似乎与 ASDF 和 ECL 的兼容性存在问题,这已在最后一次提交中解决,请看这里

在 ECL 上添加回 make-build

这提供了与 ECL 的向后兼容性,其当前的维护者 Daniel K. 已决定继续支持 make-build 接口并为此分叉了 ASDF。

您可以安装/使用此repo中的最后一个 ASDF

于 2017-10-02T22:19:03.883 回答
1

我使用了lisp-devel Docker 镜像,发布了 ECL 16.1.3。(我不想在每个 VPS 上自己编译 ECL)。我可以构建一个可执行文件(重量为 52Mo VS 使用 SBCL 重量为 78Mo),因此我能够使用 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

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

类型条件:在 > 编译文件 NIL 中引用但尚未创建的 SIMPLE-ERROR 包 ((UIOP/STREAM . #))

ql:quickload :closer-mop在加载我的应用程序之前,我似乎也必须手动操作。

我不会调查这个。

于 2017-11-21T16:51:12.210 回答
1

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

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

于 2017-10-08T16:43:51.967 回答