如何确定'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和它修复AR
和ARFLAGS
:
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" ./configure
和make 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
集合中?
要一个失败的配方,你可以简单理解:
- 呼应的规则(即回声$(AM_V_CCLD)$(libidn2_la_LINK)...)
- 添加从而未能阻止第二个命令制作
如果您需要其他帮助,请在这里报告这些更改后的make输出。
在你的情况下,使用的makefile选项--debug = M可以帮助
问题的关键在于OP不知道哪个规则导致错误,因此修改规则的建议如何提供帮助?另外,选项'-d'(见上面)涵盖了选项'--debug = m'。 – Beta
错误信息直接指向配方,如问题中所述: “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) –
它不明显 - 无论如何 - 对我来说,OP正在查看正确的makefile,但是反思是的,一个'echo'命令可以证实这一点。并根据您的链接,“请注意'all'选项[--debug = a]确实启用了此选项[--debug = m]。” – Beta
[这annswer(https://stackoverflow.com/a/5820432/425738)可以帮助 - 基本上加上'使V = 1 ...' – ldav1s