1

.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)は正しく定義されていますが、2 つの問題があります。

まず、次のようなディレクトリ レイアウトを使用します。

+- 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. 何が起こったか?

2 番目の問題は、これが発生した場合でも、呼び出しを でemacsラップしようとしているにもかかわらず、ステータス 0 で終了することです。ここで何が起こったのですか?(byte-compile-file)(condition-case)

4

2 に答える 2

1

私が最初に抱えた問題は、VPATHビルドでは、ビルドディレクトリ内のファイルが見つからなかったということでした((require)たとえば、への呼び出しによって)。何らかの理由で、consing onは機能nilload-pathませんが、consing$(abs_srcdir)は機能します。

2番目の問題は、によって発生したエラーをキャッチできなかったこと(byte-compile)です。これはwvxvwによって解決されました:(byte-compile)エラーは発生しませんがt、コンパイルが成功すると戻ります。したがって、次のようなものです。

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

うまく動作します。

于 2012-07-12T21:52:06.170 に答える
0

あなたがくれたスニペットをクリーンアップし、ディレクトリでテストケースを行いました~/test。最終的に、次の 3 つのファイルが作成されます。

メイクファイル:

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 に答える