2

我正在尝试使用 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”?

感谢您的任何帮助或参考。

** * ** * ** * ***第 2部分* ** * ** * ** * **

好的,根据您的建议,这是继续:

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# 使用 autoloads 运行 autoloadswd=$(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 文件

Makefile 的一部分在lisp/

     # 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 文件都已经存在。好的,现在我有两个错误,其中一个:)(当然如果没有连接)

再次感谢你。

4

2 回答 2

0

众所周知,生成的 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

几乎肯定会失败。

第一关就够了。告诉我们结果,我们将继续。

于 2012-03-29T12:23:03.507 回答
0

我建议您尝试使用 Emacs-24 预测试,如果失败,请将其报告为错误。

于 2012-03-29T13:27:22.973 回答