autoconf 配置脚本在较新的 Xcode 版本下中断

Posted

技术标签:

【中文标题】autoconf 配置脚本在较新的 Xcode 版本下中断【英文标题】:autoconf configure script broke under a newer Xcode version 【发布时间】:2022-01-21 04:42:44 【问题描述】:

我正在尝试在较新版本的 MacOS 和 Xcode 下构建 apcupsd 包,但当前版本的 apcupsd 提供的 configure 脚本在 Xcode 12.4 下中断(尽管它在 Xcode 11.2 下工作)。

错误是gethostbyname_r 是必需的。现在,configure 测试这个功能,通常它会适应不提供它的系统。然而,在较新的 Xcode 版本中,configure 只是以错误退出。我认为这与 Apple 强制设置 -Werror 有关。我发现我可以通过在configure 中注释掉损坏的测试,然后运行它并明确传递configure 应该设置的标志来获得成功的构建。但这不是很令人满意。

是否有一种通用方法可以将覆盖传递给编译器的configure?我尝试在CPPFLAGSCFLAGS 环境中为configure 设置-Wno-error,但configtest 程序似乎忽略了这些。似乎正在发生的事情是 configure 看到 gethostbyname_r 不存在并将其设置为 no 但后来仍然对其进行测试。我只是想知道是否有标志或其他东西可以克服这个错误,因为在我看来,无论 Apple 在 11.2 版之后破坏(或修复)Xcode 所做的一切都会破坏很多人的项目。

我正在寻找不涉及修改程序源或 Autotools 输入文件的解决方案。项目手册在这方面没有帮助。


作为更新:apcupsd 列表中的某个人告诉我,此问题已在更高版本的 Xcode 中修复。我还没有尝试过,但是当我这样做时,如果事实证明是这样,我会发布后续跟进

【问题讨论】:

Apple 在 Xcode 12 中将 -Werror 设为默认值时破坏了许多项目的构建,但我不认为 Autotools 是向量之一。 【参考方案1】:

是否有一种通用方法可以将覆盖传递给configure 编译器?我尝试在CPPFLAGSCFLAGS 中设置-Wno-error configure 的环境,但 configtest 程序似乎忽略了 那些。

如果您在configure 的环境中设置CFLAGSCPPFLAGS 变量,那么configure 不仅应该在构建测试程序时使用这些标志,而且还应该记住该变量,以便您不要不需要再次指定make。确实,这……

似乎发生的事情是 configure 看到了 gethostbyname_r 不存在并将其设置为 no

... 建议它在您的情况下这样做。

在这种情况下,如果它似乎稍后再次测试,或者尽管确定该功能不存在但以其他方式失败,那么这表明项目自身的自动工具存在缺陷。

我只是想知道是否有旗帜或其他东西 为了克服这个错误,

您已经尝试了最有可能的候选人 (CFLAGS)。或者,您也可以通过使用cache file 来解决此问题。这仍然很老套,但我认为比修改configure 脚本要少。恐怕我对此没有具体的指导。

在我看来,无论 Apple 做了什么 在 11.2 版本之后破坏(或修复)Xcode 会破坏很多 人们的项目。

确实如此。这并不意味着有一个快速或简单的解决方案,尽管如果 Apple 确实在更高版本的 Xcode 中解决了这个问题,那将是个好消息。

【讨论】:

无论 CFLAGS 或任何其他变量测试设置如何,配置总是在 gethostbyname_r 不存在(否)的情况下进行测试。它爆炸的第二个测试是当它尝试测试正在使用的 gethostbyname_r 版本时。 @TedMittelstaedt,configure 脚本可能针对特定功能的版本执行的任何测试都必须针对项目进行自定义。具体来说,我无法谈论这样的测试可能会做什么。首先在这种情况下执行这样的测试似乎有缺陷,如果该测试没有响应用户指定的CFLAGS,那么这是一个额外的、更微妙的缺陷。 @TedMittelstaedt,您可能会尝试的另一个技巧是将所需选项粘贴到 CC 的定义上,例如:CC='gcc -Wno-error' ./configure。这是一个令人讨厌的 hack,这就是为什么我之前没有提到它,但它有可能有效。更一般地说,./configure --help 应该为您提供特定脚本提供的所有旋钮和杠杆的全面摘要,包括标准和自定义。 不幸的是,CC='gcc -Wno-error' ./configure 不起作用。到目前为止,我发现唯一要做的就是在 configure 中注释掉 case 开关并传递 CPPFLAGS=' -DHAVE_FUNC_GETHOSTBYNAME_R_0' ,其中卡在 variables.mak 文件中,然后可用于代码。 apcupsd 的原始作者确实有将 gethostbyname 调用变体放入单个 gethostbyname.c 文件的感觉,并且其中的代码会查找该定义,如果看到它会选择历史 gethostbyname() 函数而不是 gethostbyname_r 函数( s)

以上是关于autoconf 配置脚本在较新的 Xcode 版本下中断的主要内容,如果未能解决你的问题,请参考以下文章

较新的 Xcode 版本中缺少“空应用程序”(Objective-C)

为啥在较新的 Android 设备上预检失败,但在较旧的设备和台式机上却没有?

FCM - 为啥在较新的 Firebase Admin SDK 中不再支持 FCM 直接通道?

在 android 中获取位置无法在较新的设备上运行

使用3D Touch防止在较新的iPad上拖动图像和链接

Mono 本机二进制包无法在较新的 Linux 内核中加载 libc