【问题标题】:How to determine where 'ar' is being called in Makefile?如何确定在 Makefile 中调用 'ar' 的位置?
【发布时间】:2018-03-26 03:39:32
【问题描述】:

我正在尝试在 OS X 上构建 Git。Git 依赖于 libidn2。 libidn2 2.0.0 失败:

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)

如何找到arMakefiles 集合中被调用的位置?

【问题讨论】:

  • This annswer 可能会有所帮助——基本上添加 make V=1 ...

标签: macos makefile libtool unix-ar


【解决方案1】:

要简单了解失败的配方,您可以:

  1. 回显规则(即回显 $(AM_V_CCLD)$(libidn2_la_LINK) ...)
  2. 添加第二个无法停止 make 的命令

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

在您的情况下,使用 makefile 选项 --debug=m 可以提供帮助

【讨论】:

  • 问题的重点是OP不知道哪个规则导致了错误,那么修改规则的建议有什么帮助?此外,选项-d(见上文)涵盖了选项--debug=m
  • 错误信息直接指向配方,如问题所述:“Makefile:1027: recipe for target 'libidn2.la' failed” 请注意,make 选项 -d 等效于 - -debug=a 不包括 --debug=m,如 gmake 文档第 105 页所述:link
  • 对我来说,无论如何,OP 正在查看正确的 makefile 并不明显,但经过反思,echo 命令会确认这一点。根据您的链接,“请注意,‘all’选项 [--debug=a] 确实启用了此选项 [--debug=m]。”
  • 好的,我必须比合成更清楚,谢谢你的帮助。如果您对我的回答扣分,也许现在您可以恢复它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
相关资源
最近更新 更多