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

时间:2017-10-02 07:08:27

标签: common-lisp asdf ecl

我正在尝试使用ECL构建可执行文件。我查看了the doc和其他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)))

我收到错误

  

在#<“ASDF / INTERFACE”包中找不到外部符号MAKE-BUILD>。

有人可以帮忙吗?谢谢!

ECL 16.1.3

ps:似乎在REPL中输入重启nb无效。

我的makefile:

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

编辑27,oct - 进度

现在最简单的路径似乎不确定使用捆绑到ECL中的ASDF,它将具有make-build命令。

我有一个较新的ASDF版本,因为我将Quicklisp的初始化代码导入~/.eclrc。我删除它,现在我有ASDF v3.1.8.2,这没关系。但现在,ECL并不知道任何依赖:

  

组件:未找到DEXADOR,#。

要求

确实,因为不再有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之前没有运行一次,如何使这项工作?

更新:使用Roswell安装Ecl:require 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的重量),但是出现了运行时错误:

  

类型的条件:SIMPLE-ERROR   &gt;中引用的包((UIOP / STREAM。#))编译文件    零   但尚未创建

3 个答案:

答案 0 :(得分:2)

似乎与ASDF和ECL的兼容性问题这在最后一次提交中解决了look here

  

在ECL上添加make-build

     

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

您可以从此repo

安装/使用最后一个ASDF

答案 1 :(得分:1)

您可以使用捆绑的ASDF(这是一个冻结的3.1.7版本,其中一些修补程序被反向移植) - 然后您使用 if ($this->request->is('get')) { $itemname= $this->request->query('item_name'); $searchitem = $this->MbPriceList->find('all') ->contain(['MbItemList' => function ($q) { return $q->select(['item_name']); }]) ->select(['MbItemList.item_name', 'id']); $this->set([ 'response' => $searchitem, '_serialize' => ['response'] ]); } 加载ASDF,或者您可以使用上游3.3版本。

如果您对使用上游ASDF感兴趣,请下载asdf.lisp文件并致电: (require asdf)代替(load (compile-file "/path/to/asdf.lisp"))

答案 2 :(得分:0)

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

供参考,启动Docker并挂载源:

ql:quickload :closer-mop

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

  

类型的条件:SIMPLE-ERROR   &gt;中引用的包((UIOP / STREAM。#))编译文件    零   但尚未创建

在加载我的应用程序之前,我似乎还必须手动{{1}}。

我不会对此进行调查。

相关问题