通过给定的xcode / clang

我有几个普通的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
lzkyun 回答:通过给定的xcode / clang

要让您了解使用纯make编程并以gmtt作为帮助程序库的外观:

include gmtt/gmtt.mk

#CC_VERSION_OUTPUT := 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

CC_VERSION_OUTPUT := 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

CC_VERSION := $(call glob-match,$(CC_VERSION_OUTPUT),Apple LLVM version * (clang-*)*Target: *-apple-* *)

LLVM_VERSION := $(subst .,$(word 2,$(CC_VERSION)))
LLVM_MAJOR := $(word 1,$(LLVM_VERSION))
LLVM_MINOR := $(word 2,$(LLVM_VERSION))
CLANG_VERSION := $(word 4,$(CC_VERSION))
PLATFORM := $(word 8,$(CC_VERSION))
OS := $(word 10,$(CC_VERSION))

# Table for OSX version minimum (last column)
# platform | OS | LVM-major | LLVM-minor | OSX-version
define COMPATIBILITY_TABLE :=
5
x86_64 darwin16.7.0   9   0   10.5
x86_64 darwin18.0.0  10   0   10.6
endef

#$(info $(LLVM_MAJOR) $(LLVM_MINOR) $(OS) $(PLATFORM))

MACOSX_VERSION_MIN := $(call select,5,$(COMPATIBILITY_TABLE),$$(and $$(call str-eq,$$1,$(PLATFORM)),\
                                                                    $$(call str-eq,$$2,$(OS)),\
                                                                    $$(or $$(call int-ge,$$3,$(LLVM_MAJOR)),\
                                                                          $$(and $$(call int-eq,$$(LLVM_MAJOR)),\
                                                                                 $$(call int-ge,$$4,$(LLVM_MINOR))))))

$(info -mmacosx_version_min=$(MACOSX_VERSION_MIN))

select语句的从句很吵。根据您的假设,您也可以使用$(call glob-match...)

本文链接:https://www.f2er.com/3124006.html

大家都在问