1

我正在尝试编写一个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

(也就是说,一个 VPATH 构建foo.el在 srcdir 中,我正在尝试构建_build。)

如果bar.el依赖于foo.el(via(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). 这里发生了什么?

4

2 回答 2

1

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

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

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

效果很好。

于 2012-07-12T21:52:06.170 回答
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 的定义错误时才会失败。

于 2012-07-12T21:11:36.003 回答