首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在批处理模式下从byte-compile-file捕获错误

在批处理模式下从byte-compile-file捕获错误
EN

Stack Overflow用户
提问于 2012-07-09 07:54:58
回答 2查看 263关注 0票数 1

我正在尝试编写一个makefile代码片段来将.el文件编译成.elc文件。我有以下代码片段:

代码语言:javascript
复制
.el.elc:
        $(EMACS) -q -Q --batch \
                       --eval "(progn
                                 (setq load-path (cons \"$(abs_srcdir)\" load-path)) 
                                 (setq load-path (cons nil load-path))
                                 (defun byte-compile-dest-file (f) \"$@\")
                                 (condition-case nil
                                   (byte-compile-file \"$<\")
                                   (error (kill-emacs 1))))"

(我已经为表示设置了代码片段的格式,make可能不会喜欢这种布局。)

$(abs_srcdir)的定义是正确的,但我有两个问题:

首先:使用如下的目录布局:

代码语言:javascript
复制
+- foo.el <- foo.el lives in $(abs_srcdir)
+- _build/
++- bar.el
++- Makefile

(也就是说,VPATH构建,其中foo.el驻留在srcdir中,而我正尝试在_build中构建。)

如果bar.el依赖于foo.el (通过(require 'foo)(provide 'foo)),则编译bar.elc的尝试将失败,并显示以下错误:

代码语言:javascript
复制
In toplevel form:
../bar.el:1:1:Error: Cannot open load file: foo

这让我觉得很奇怪,因为我认为我是在load-path上使用$(abs_srcdir)。发生什么事了?

第二个问题是,即使发生这种情况,emacs也会以0状态退出,尽管我努力将(byte-compile-file)调用包装在(condition-case)中。这里发生了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-13 05:52:06

我遇到的第一个问题是,在VPATH构建中,无法找到构建目录中的文件(例如,通过调用(require) )。由于某些原因,在load-path上整合nil不起作用,但整合$(abs_srcdir)可以。

第二个问题是我无法捕捉到(byte-compile)引发的错误。这是由wvxvw解决的:(byte-compile)不会引发错误,但如果编译成功,则返回t。因此,类似这样的东西:

代码语言:javascript
复制
(unless (byte-compile-file "$<") (kill-emacs 1))

效果很好。

票数 1
EN

Stack Overflow用户

发布于 2012-07-13 05:11:36

我清理了您给出的代码片段,并在目录~/test中执行了一个测试用例。我最终得到了以下三个文件。

Makefile:

代码语言:javascript
复制
abs_srcdir=~/test

all: foo.elc bar.elc

clean:
        rm -rf *.elc

%.elc: %.el
    emacs -Q --batch --eval "(progn (add-to-list 'load-path \"$(abs_srcdir)\") (defun byte-compile-dest-file (f) \"$@\") (condition-case nil (byte-compile-file\"$<\") (error (kill-emacs 1))))"

foo.el:

代码语言:javascript
复制
(defun foo-fun ()
  (message "foo"))

(provide 'foo)

bar.el:(需要'foo)

代码语言:javascript
复制
(defun bar-fun ()
  (foo-fun))

(provide 'bar)

这个例子适用于我,只有在我给出了错误的abs_srcdir定义时才会失败。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11387679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档