使用 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 一起安装:require
ing 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
手动加载我的应用程序。
我不会调查这个。
我正在尝试使用 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 一起安装:require
ing 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
手动加载我的应用程序。
我不会调查这个。