簡體   English   中英

在 Cygwin 中構建 Emacs 時,目標“自動加載”的配方失敗

[英]Recipe for target `autoloads' failed while building Emacs in Cygwin

我正在嘗試使用 Cyqwin 在 64 位 Windows 7 上構建 Emacs:

Emacs 23.3 或 23.4

CYGWIN_NT-6.1-WOW64 1.7.11(0.260/5/3) 2012-02-24 14:05 i686 Cygwin

./configure 日志中的一些信息:

    What compiler should emacs be built with?    
    gcc -g -O2 -Wdeclarati
    What operating system and machine description files should Emacs use?
    `s/cygwin.h' and `m/intel386.h'

我能夠毫無問題地創建 Makefile。 但是,如果我運行 make 程序,它會構建幾分鍾,然后在某些時候,它會卡住 2 分鍾,然后產生錯誤:

Makefile:149: recipe for target `autoloads' failed
make[2]: *** [autoloads] Interrupt
Makefile:198: recipe for target `/cygdrive/c/emacs-23.3/src/../lisp/loaddefs.el' failed
make[1]: *** [/cygdrive/c/emacs-23.3/src/../lisp/loaddefs.el] Interrupt
Makefile:339: recipe for target `src' failed
make: *** [src] Interrupt

在這兩種情況下(Emacs 23.3 和 23.4)Makefile:149 指的是 Emacs\\lisp 文件夾中 makefile 的相同部分:

    149 autoloads: $(LOADDEFS) doit
    150 , chmod +w $(lisp)/ps-print.el $(lisp)/emulation/tpu-edt.el \
    151    $(lisp)/emacs-lisp/cl-loaddefs.el $(lisp)/mail/rmail.el \
    152    $(lisp)/dired.el $(lisp)/ibuffer.el
    153  wd=$(lisp); $(setwins_almost); \
    154  echo Directories: $$wins; \
    155  $(emacs) -l autoload --eval '(setq generated-autoload-file "$(lisp)/loaddefs.el")' -f batch-update-autoloads $$wins

在 23.3 版中。 為 *.el 文件生成自動加載時,建築物卡住了:

    Generating autoloads for progmodes/cc-mode.el...
    Generating autoloads for progmodes/cc-mode.el...done
    Generating autoloads for progmodes/cc-styles.el...
    Generating autoloads for progmodes/cc-styles.el...done
    Generating autoloads for progmodes/cc-vars.el...
    Generating autoloads for progmodes/cc-vars.el...done
    Generating autoloads for international/ccl.el...
    Makefile:149: recipe for target `autoloads' failed
    make[2]: *** [autoloads] Interrupt

在版本 23.4 中,建築物在保存 loaddef 時卡住了:

    make[2]: Entering directory `/cygdrive/c/emacs-23.4/lisp'
    chmod +w /cygdrive/c/emacs-23.4/lisp/ps-print.el /cygdrive/c/emacs-23.4/lisp/emulation/tpu-edt.el \
    /cygdrive/c/emacs-23.4/lisp/emacs-lisp/cl-loaddefs.el /cygdrive/c/emacs-23.4/lisp/mail/rmail.el \
    /cygdrive/c/emacs-23.4/lisp/dired.el /cygdrive/c/emacs-23.4/lisp/ibuffer.el
    wd=/cygdrive/c/emacs-23.4/lisp; subdirs=`(cd $wd; find . -type d -print)`;  for file in $subdirs; do  case $file in */Old | */RCS | */CVS | */CVS/* | */.* | */.*/* | */=* | */obsolete | */term ) ;;  *) wins="$wins $wd/$file" ;;  esac;  done           ; \
    echo Directories: $wins; \
    EMACSLOADPATH=/cygdrive/c/emacs-23.4/lisp LC_ALL=C ../src/bootstrap-emacs.exe -batch --no-site-file --multibyte -l autoload --eval '(setq generated-autoload-file "/cygdrive/c/emacs-23.4/lisp/loaddefs.el")' -f batch-update-autoloads $wins
    Directories: /cygdrive/c/emacs-23.4/lisp/. /cygdrive/c/emacs-23.4/lisp/./calc /cygdrive/c/emacs-23.4/lisp/./calendar /cygdrive/c/emacs-23.4/lisp/./cedet /cygdrive/c/emacs-23.4/lisp/./cedet/ede /cygdrive/c/emacs-23.4/lisp/./cedet/semantic /cygdrive/c/emacs-23.4/lisp/./cedet/semantic/analyze /cygdrive/c/emacs-23.4/lisp/./cedet/semantic/bovine /cygdrive/c/emacs-23.4/lisp/./cedet/semantic/decorate/cygdrive/c/emacs-23.4/lisp/./cedet/semantic/symref /cygdrive/c/emacs-23.4/lisp/./cedet/semantic/wisent /cygdrive/c/emacs-23.4/lisp/./cedet/srecode /cygdrive/c/emacs-23.4/lisp/./emacs-lisp /cygdrive/c/emacs-23.4/lisp/./emulation /cygdrive/c/emacs-23.4/lisp/./erc /cygdrive/c/emacs-23.4/lisp/./eshell /cygdrive/c/emacs-23.4/lisp/./gnus /cygdrive/c/emacs-23.4/lisp/./international /cygdrive/c/emacs-23.4/lisp/./language /cygdrive/c/emacs-23.4/lisp/./mail /cygdrive/c/emacs-23.4/lisp/./mh-e /cygdrive/c/emacs-23.4/lisp/./net /cygdrive/c/emacs-23.4/lisp/./nxml /cygdrive/c/emacs-23.4/lisp/./org /cygdrive/c/emacs-23.4/lisp/./play /cygdrive/c/emacs-23.4/lisp/./progmodes /cygdrive/c/emacs-23.4/lisp/./textmodes /cygdrive/c/emacs-23.4/lisp/./url
    Saving file /cygdrive/c/emacs-23.4/lisp/loaddefs.el...
    Makefile:149: recipe for target `autoloads' failed
    make[2]: *** [autoloads] Interrupt

有誰知道我該如何修復這個錯誤? 錯誤的 C 編譯器? 更改生成文件? 使用帶有某些參數的“make”?

感謝您提供任何幫助或參考。

** * ** * ** * *** PART2 * ** * ** * ** * **

好的,這里是根據您的建議繼續:

1# make autoloads是不可能的,因為這個子部分在子 makefile 中,所以它會產生錯誤:

$ make autoloads
chmod +w /cygdrive/c/emacs-23.4/lisp/ps-print.el /cygdrive/c/emacs-23.4/lisp/emulation/tpu-edt.el \
  /cygdrive/c/emacs-23.4/lisp/emacs-lisp/cl-loaddefs.el /cygdrive/c/emacs-23.4/lisps/mail/rmail.el \
   /cygdrive/c/emacs-23.4/lisp/dired.el /cygdrive/c/emacs-23.4/lisp/ibuffer.el
 wd=/cygdrive/c/emacs-23.4/lisp; subdirs=`(cd $wd; find . -type d -print)`;  for file in $subdirs; do  case $file in */Old | */RCS | */CVS | */CVS/* | */.* | */.*/* | */=* | */obsolete | */term ) ;;  *) wins="$wins $wd/$file" ;;  esac;  done; \
echo Directories: $wins; \
EMACSLOADPATH=/cygdrive/c/emacs-23.4/lisp LC_ALL=C ../src/emacs -batch --no-site-file --multibyte -l autoload --eval '(setq generated-autoload-file "/cygdrive/c/emacs-23.4/lisp/loaddefs.el")' -f batch-update-autoloads $wins
Directories: /cygdrive/c/emacs-23.4/lisp/. /cygdrive/c/emacs-23.4/lisp/./calc /cygdrive/c/emacs-23.4/lisp/./calendar /cygdrive/c/emacs-23.4/lisp/./cedet /cygdrive/c/emacs-23.4/lisp/./cedet/ede /cygdrive/c/emacs-23.4/lisp/./cedet/semantic /cygdrive/c/emacs-23.4/lisp/./cedet/semantic/analyze /cygdrive/c/emacs-23.4/lisp/./cedet/semantic/bovine /cygdrive/c/emacs-23.4/lisp/./cedet/semantic/decorate /cygdrive/c/emacs-23.4/lisp/./cedet/semantic/symref /cygdrive/c/emacs-23.4/lisp/./cedet/semantic/wisent /cygdrive/c/emacs-23.4/lisp/./cedet/srecode /cygdrive/c/emacs-23.4/lisp/./emacs-lisp /cygdrive/c/emacs-23.4/lisp/./emulation /cygdrive/c/emacs-23.4/lisp/./erc /cygdrive/c/emacs-23.4/lisp/./eshell /cygdrive/c/emacs-23.4/lisp/./gnus /cygdrive/c/emacs-23.4/lisp/./international /cygdrive/c/emacs-23.4/lisp/./language /cygdrive/c/emacs-23.4/lisp/./mail /cygdrive/c/emacs-23.4/lisp/./mh-e /cygdrive/c/emacs-23.4/lisp/./net /cygdrive/c/emacs-23.4/lisp/./nxml /cygdrive/c/emacs-23.4/lisp/./org /cygdrive/c/emacs-23.4/lisp/./play /cygdrive/c/emacs-23.4/lisp/./progmodes /cygdrive/c/emacs-23.4/lisp/./textmodes /cygdrive/c/emacs-23.4/lisp/./url
 /bin/sh: line 2: ../src/emacs: No such file or directory
 Makefile:149: recipe for target `autoloads' failed
 make: *** [autoloads] Error 127

如果我做錯了什么,請糾正我。

2# 刪除$(LOADDEFS) doit實際上不會改變結果

3# 只運行第一部分

autoloads:
   chmod +w $(lisp)/ps-print.el $(lisp)/emulation/tpu-edt.el \
  $(lisp)/emacs-lisp/cl-loaddefs.el $(lisp)/mail/rmail.el \
  $(lisp)/dired.el $(lisp)/ibuffer.el

在自動加載中沒有錯誤地解決,

然而 20 秒后它凍結了一段時間並產生另一個錯誤

(這個問題的描述如下)

4# 只運行第二部分:

autoloads:
   wd=$(lisp); $(setwins_almost); \
   echo Directories: $$wins; \
   $(emacs) -l autoload --eval '(setq generated-autoload-file "$(lisp)/loaddefs.el")' -f batch-update-autoloads $$wins

因原點錯誤而崩潰

5# 也可以像 3# 一樣運行自動加載

 wd=$(lisp);

自動加載沒有錯誤,后來與 3# 中的錯誤相同

6# 使用wd=$(lisp);$(setwins_almost);運行自動加載wd=$(lisp);$(setwins_almost); 自動加載沒有錯誤,后來與 3# 中的錯誤相同

7#也添加一行

echo Directories: $$wins; 

自動加載沒有錯誤,后來與 3# 中的錯誤相同

8#也添加一行

$(emacs) -l autoload --eval '(setq generated-autoload-file "$(lisp)/loaddefs.el")' -f batch-update-autoloads $$wins

當然是原點錯誤

第二個錯誤的描述(第 3 部分):

make[2]: Entering directory `/cygdrive/c/emacs-23.4/lisp'
Compiling /cygdrive/c/emacs-23.4/src/../lisp/abbrev.el
>>Error occurred processing /cygdrive/c/emacs-23.4/src/../lisp/abbrev.el: Symbol's value as variabl                        e is void ((warning-series))
Makefile:1478: recipe for target `compile-onefile' failed
make[2]: *** [compile-onefile] Error 1
make[2]: Leaving directory `/cygdrive/c/emacs-23.4/lisp'
Makefile:195: recipe for target `/cygdrive/c/emacs-23.4/src/../lisp/abbrev.elc' failed
make[1]: *** [/cygdrive/c/emacs-23.4/src/../lisp/abbrev.elc] Error 2
make[1]: Leaving directory `/cygdrive/c/emacs-23.4/src'
Makefile:339: recipe for target `src' failed
make: *** [src] Error 2

在此之前編譯了很多 *.el 文件

lisp/ Makefile 的一部分

     # The src/Makefile.in has its own set of dependencies and when they decide
     # that one Lisp file needs to be re-compiled, we had better recompile it as
     # well, otherwise every subsequent make will again call us, until we finally
     # end up deciding that yes, the file deserves recompilation.
     # One option is to try and reproduce exactly the same dependencies here as
     # we have in src/Makefile.in, but it turns out to be painful
     # (e.g. src/Makefile.in may have a dependency for ../lisp/foo.elc where we
     # only know of $(lisp)/foo.elc).  So instead we provide a direct way for
     # src/Makefile.in to rebuild a particular Lisp file, no questions asked.
     # Use byte-compile-refresh-preloaded to try and work around some of
     # the most common problems of not bootstrapping from a clean state.
1477     compile-onefile:
1478         @echo Compiling $(THEFILE)
1479         @# Use byte-compile-refresh-preloaded to try and work around some of
1480         @# the most common bootstrapping problems.
1481         @$(emacs) -l bytecomp -f byte-compile-refresh-preloaded  $(BYTE_COMPILE_EXTRA_FLAGS) -f batch-byte-compile $(THEFILE)

Makefile中有一個ELC文件列表:

## Explicitly list the .elc files, for the sake of parallel builds.
## http://lists.gnu.org/archive/html/bug-gnu-emacs/2008-05/msg00016.html
## This can probably be done more elegantly, but needs to be portable.
ELCFILES = \
    $(lisp)/abbrev.elc \
    $(lisp)/abbrevlist.elc \
    $(lisp)/add-log.elc \
    $(lisp)/align.elc \
    $(lisp)/allout.elc \
    $(lisp)/ansi-color.elc \
    $(lisp)/apropos.elc \
    $(lisp)/arc-mode.elc \

...

    $(lisp)/info.elc \
    $(lisp)/informat.elc \
    $(lisp)/international/ccl.elc \
    $(lisp)/international/characters.elc \
    $(lisp)/international/fontset.elc \
    $(lisp)/international/isearch-x.elc \

Makefile 可能會從 *.elc 文件中重新創建 *.el 文件,但是所有 *.el 文件都已經存在。 好的,現在我有兩個錯誤,一個是:)(當然如果沒有連接)

再次感謝你。

眾所周知,生成的 makefile 難以維護和排除故障,但我們可以嘗試。 有問題的規則有兩個先決條件和兩個命令,第二個由四個串聯在一起的 shell 命令組成:

autoloads: $(LOADDEFS) doit
    chmod +w $(lisp)/ps-print.el $(lisp)/emulation/tpu-edt.el \
   $(lisp)/emacs-lisp/cl-loaddefs.el $(lisp)/mail/rmail.el \
   $(lisp)/dired.el $(lisp)/ibuffer.el
   wd=$(lisp); $(setwins_almost); \
   echo Directories: $$wins; \
   $(emacs) -l autoload --eval '(setq generated-autoload-file "$(lisp)/loaddefs.el")' -f batch-update-autoloads $$wins

首先,我會嘗試make autoloads 如果出現同樣的錯誤,我們可以繼續,否則發布結果。

然后刪除先決條件( $(LOADDEFS) doit ,因為它們應該是冪等的,並且對這條規則的操作沒有影響(除非 makefile真的很復雜),然后再試一次。

然后把命令拆分成更小的命令,一一嘗試。 第一的

autoloads:
    chmod +w $(lisp)/ps-print.el $(lisp)/emulation/tpu-edt.el \
   $(lisp)/emacs-lisp/cl-loaddefs.el $(lisp)/mail/rmail.el \
   $(lisp)/dired.el $(lisp)/ibuffer.el

這應該不會出錯。 如果是,那么可能缺少其中一個文件; 發布結果。 如果沒有,則在沒有第一個命令的情況下嘗試第二個命令:

autoloads:
   wd=$(lisp); $(setwins_almost); \
   echo Directories: $$wins; \
   $(emacs) -l autoload --eval '(setq generated-autoload-file "$(lisp)/loaddefs.el")' -f batch-update-autoloads $$wins

我希望這會產生與最初相同的錯誤; 如果沒有,只需將第一個命令放回並繼續。

現在分解第二個命令。 我們不能省略早期的部分,因為后面的部分依賴於它們,所以首先嘗試

autoloads:
   wd=$(lisp);

這應該有效,除非lisp (是的,是的,我知道)。 然后

autoloads:
   wd=$(lisp); $(setwins_almost);

我敢打賭這就是失敗的地方,但如果沒有,請繼續:

autoloads:
   wd=$(lisp); $(setwins_almost); \
   echo Directories: $$wins; 

那應該工作。 然后

autoloads:
   wd=$(lisp); $(setwins_almost); \
   echo Directories: $$wins; \
   $(emacs) -l autoload --eval '(setq generated-autoload-file "$(lisp)/loaddefs.el")' -f batch-update-autoloads $$wins

幾乎肯定會失敗。

第一次通過就足夠了。 告訴我們結果,我們將繼續。

我建議您嘗試使用 Emacs-24 預測試,如果失敗,請將其報告為錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM