我有几个普通的C程序(实际上是某些主机dlopen()
所制的插件)可以编译,并且我想支持尽可能多的OSX / macOS版本。
OSX / macOS实际支持的版本数量并不那么重要,但是我力求最大范围地覆盖(“一切皆有可能”)。
C程序实际上不使用libc之外的任何库,而是跨平台的(linux / windows / macOS)。
为了获得最大的兼容性,我在macOS上编译时使用了-mmacosx-version-min
标志。
过去,我使用-mmacosx-version-min=10.5
在 macOS Sierra 上构建了我的二进制文件,该文件过去运行良好。现在,此标志已硬编码在我的Makefile
中。
但是,由于我已经将构建机器升级到 macOS Mojave ,因此构建失败,并显示以下内容:
ld:找不到-lgcc_s.10.5的库
因此,似乎XCode的最新版本的最低部署目标为OSX-10.6。
显然,我可以去更新所有的Makefile文件以使用-mmacosx-version-min=10.6
,但是当苹果公司决定放弃 10.6 支持时,我想我很快就会遇到同样的问题。
所以我的问题是:有什么方法可以以编程方式确定 构建主机上-mmacosx-version-min
的最小支持值吗?
我的构建系统是一个非常简单的纯GNU make
(没有自动工具,CMake等),我希望保持这种状态。
因此,任何检查都应该足够简单,以便在make
调用开始时进行。
理想情况是:
CflaGS+=-mmacosx-version-min=$(shell xcodebuild --minimum-supported-version)
想法?
注意:我的目标构建主机是无头CI机器,通常只安装“ cmdline”版本的构建工具。任何建议的解决方案都应在未安装完整的 XCode 套件的系统上运行。
在旧系统上
有趣的是,在 Sierra 上指定了一个非常低的部署目标得到了更为优雅的处理:
例如添加-mmacosx-version-min=10.1
会毫无问题地编译,创建一个 x86_64 二进制文件(仅从OSX-10.4开始才支持iirc),并且-根据otool -l
仅与 OSX-10.4 。
鉴于旧版本的clang / Xcode / ...可以很好地处理-mmacosx-version-min
的超出范围的值,我想知道这是否真的是苹果方面的回归错误。
更多信息
这是 Mojave 上的编译器告诉我的是它自己的版本:
$ cc --version
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.0.0
Thread model: posix
InstalledDir: /library/Developer/CommandLineTools/usr/bin
在 Sierra 上(一切正常),我得到:
$ cc --version
Apple LLVM version 9.0.0 (clang-900.0.38)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /library/Developer/CommandLineTools/usr/bin