如何确定'ar'在Makefile中被调用的位置?

问题描述:

我想在OS X上构建Git。Git依赖于libidn2。 libidn2 2.0.0失败:如何确定'ar'在Makefile中被调用的位置?

make all-am 
make[3]: Entering directory '/Users/jwalton/Build-Scripts/libidn2-2.0.0/lib' 
    CC  idna.lo 
    CC  lookup.lo 
    CC  decode.lo 
    CC  register.lo 
    CC  bidi.lo 
    CC  version.lo 
    CC  error.lo 
    CC  punycode.lo 
    CC  free.lo 
    CC  data.lo 
    CC  tr46map.lo 
    CC  tables.lo 
    CC  context.lo 
    CCLD  libidn2.la 
warning: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm: no name list 
warning: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm: no name list 
copying selected object files to avoid basename conflicts... 
ar: temporary file: No such file or directory 
Makefile:1027: recipe for target 'libidn2.la' failed 
make[3]: *** [libidn2.la] Error 1 
make[3]: Leaving directory '/Users/jwalton/Build-Scripts/libidn2-2.0.0/lib' 
Makefile:955: recipe for target 'all' failed 
make[2]: *** [all] Error 2 
make[2]: Leaving directory '/Users/jwalton/Build-Scripts/libidn2-2.0.0/lib' 
Makefile:1065: recipe for target 'all-recursive' failed 
make[1]: *** [all-recursive] Error 1 
make[1]: Leaving directory '/Users/jwalton/Build-Scripts/libidn2-2.0.0' 
Makefile:974: recipe for target 'all' failed 
make: *** [all] Error 2 

我的食谱打造libidn2找到所有的Makefile和它修复ARARFLAGS

if [[ "$IS_DARWIN" -ne "0" ]]; then 
    for mfile in $(find "$PWD" -name 'Makefile'); do 
     echo "Fixing Makefile $mfile" 
     sed -i "" 's|AR = ar|AR = /usr/bin/libtool|g' "$mfile" 
     sed -i "" 's|ARFLAGS = cr|ARFLAGS = -static -o|g' "$mfile" 
    done 
fi 

我已经证实,它修复了所有的Makefile:

$ find $PWD -name Makefile -exec grep 'AR =' {} \; | egrep -iv 'amtar|char' 
AR = /usr/bin/libtool 
ac_ct_AR = /usr/bin/libtool 
AR = /usr/bin/libtool 
ac_ct_AR = /usr/bin/libtool 
AR = /usr/bin/libtool 
ac_ct_AR = /usr/bin/libtool 
AR = /usr/bin/libtool 
ac_ct_AR = /usr/bin/libtool 
AR = /usr/bin/libtool 
ac_ct_AR = /usr/bin/libtool 
AR = /usr/bin/libtool 
ac_ct_AR = /usr/bin/libtool 
AR = /usr/bin/libtool 
ac_ct_AR = /usr/bin/libtool 
AR = /usr/bin/libtool 
ac_ct_AR = /usr/bin/libtool 
AR = /usr/bin/libtool 
ac_ct_AR = /usr/bin/libtool 

我也试过AR="/usr/bin/libtool" ARFLAGS="-static -o" ./configuremake AR="/usr/bin/libtool" ARFLAGS="-static -o",但是这些选择没有兑现。它会产生额外的失败版本。

Makefile调试支持相当糟糕,所以我不确定如何继续。 make -d即使是最简单的任务也失败了,例如提供文件名和行号。 remake -d会产生相同的无益结果。由别人编写的大型项目加剧了这种情况。

$ make -d 
... 
Putting child 0x7f9bf0c45cf0 (libidn2.la) PID 75531 on the chain. 
Live child 0x7f9bf0c45cf0 (libidn2.la) PID 75531 
    CCLD  libidn2.la 
warning: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm: no name list 
warning: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm: no name list 
copying selected object files to avoid basename conflicts... 
ar: temporary file: No such file or directory 
Reaping losing child 0x7f9bf0c45cf0 PID 75531 
Makefile:1027: recipe for target 'libidn2.la' failed 

这里的线1027,这是不调用ar

libidn2.la: $(libidn2_la_OBJECTS) $(libidn2_la_DEPENDENCIES) $(EXTRA_libidn2_la\ 
_DEPENDENCIES) 
     $(AM_V_CCLD)$(libidn2_la_LINK) -rpath $(libdir) $(libidn2_la_OBJECTS) $\ 
(libidn2_la_LIBADD) $(LIBS) 

我怎样才能找到其中ar被称为Makefiles集合中?

+2

[这annswer(https://stackoverflow.com/a/5820432/425738)可以帮助 - 基本上加上'使V = 1 ...' – ldav1s

要一个失败的配方,你可以简单理解:

  1. 呼应的规则(即回声$(AM_V_CCLD)$(libidn2_la_LINK)...)
  2. 添加从而未能阻止第二个命令制作

如果您需要其他帮助,请在这里报告这些更改后的make输出。

在你的情况下,使用的makefile选项--debug = M可以帮助

+0

问题的关键在于OP不知道哪个规则导致错误,因此修改规则的建议如何提供帮助?另外,选项'-d'(见上面)涵盖了选项'--debug = m'。 – Beta

+0

错误信息直接指向配方,如问题中所述: “Makefile:1027:recipe for target'libidn2.la'failed” 请注意make选项-d等同于--debug =一个不包括--debug = m,在gmake文档的第105页解释:[link](https://www.gnu.org/software/make/manual/make.pdf) –

+0

它不明显 - 无论如何 - 对我来说,OP正在查看正确的makefile,但是反思是的,一个'echo'命令可以证实这一点。并根据您的链接,“请注意'all'选项[--debug = a]确实启用了此选项[--debug = m]。” – Beta