我正在尝试编写一个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 (通过(require 'foo)和(provide 'foo)),则编译bar.elc的尝试将失败,并显示以下错误:
In toplevel form:
../bar.el:1:1:Error: Cannot open load file: foo这让我觉得很奇怪,因为我认为我是在load-path上使用$(abs_srcdir)。发生什么事了?
第二个问题是,即使发生这种情况,emacs也会以0状态退出,尽管我努力将(byte-compile-file)调用包装在(condition-case)中。这里发生了什么?
发布于 2012-07-13 05:52:06
我遇到的第一个问题是,在VPATH构建中,无法找到构建目录中的文件(例如,通过调用(require) )。由于某些原因,在load-path上整合nil不起作用,但整合$(abs_srcdir)可以。
第二个问题是我无法捕捉到(byte-compile)引发的错误。这是由wvxvw解决的:(byte-compile)不会引发错误,但如果编译成功,则返回t。因此,类似这样的东西:
(unless (byte-compile-file "$<") (kill-emacs 1))效果很好。
发布于 2012-07-13 05:11:36
我清理了您给出的代码片段,并在目录~/test中执行了一个测试用例。我最终得到了以下三个文件。
Makefile:
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定义时才会失败。
https://stackoverflow.com/questions/11387679
复制相似问题