我正在尝试编写一个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)
中。这里发生了什么?
答案 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))
效果很好。