在批处理模式下从字节编译文件中捕获错误

时间:2012-07-08 23:54:58

标签: emacs elisp bytecode

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

.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)正确定义,但我有两个问题:

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

+- foo.el <- foo.el lives in $(abs_srcdir)
+- _build/
++- bar.el
++- Makefile

(即,foo.el居住在srcdir中的VPATH构建,我正在尝试构建_build。)

如果bar.el取决于foo.el(通过(require 'foo)(provide 'foo)),则尝试编译bar.elc会失败并显示错误:

In toplevel form:
../bar.el:1:1:Error: Cannot open load file: foo

这让我感到奇怪,因为我以为$(abs_srcdir)正在load-path上。发生了什么事?

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

2 个答案:

答案 0 :(得分:0)

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

生成文件:

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:

(defun foo-fun ()
  (message "foo"))

(provide 'foo)

bar.el:     (要求'foo)

(defun bar-fun ()
  (foo-fun))

(provide 'bar)

此示例适用于我,只有在为abs_srcdir提供错误定义时才会失败。

答案 1 :(得分:0)

我遇到的第一个问题是,使用VPATH构建时,未找到构建目录中的文件(例如,通过调用(require))。出于某种原因,将nil放到load-path上不起作用,但是$(abs_srcdir)可以使用。

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

(unless (byte-compile-file "$<") (kill-emacs 1))

效果很好。