xcodebuild ACTIVE_COMPILATION_CONDITIONS 不会覆盖目标的 ACTIVE_COMPILATION_CONDITIONS

问题描述

我们正在尝试使用 xcodebuild 来构建我们的框架,而不是使用手动 Xcode IDE 运行按钮。问题是在我们的框架中我们使用 ACTIVE_COMPILATION_CONDITIONS,它有几个值。然后使用这些值在运行时检查特定框架是否已集成,例如检查 Sentry:

#if SENTRY_AVAILABLE
    import Sentry
#endif

问题在于,对于某些构建,我们需要覆盖我们的项目设置,特别是 ACTIVE_COMPILATION_CONDITIONS。但是,在以下脚本成功执行后,Xcode 仍然不会覆盖我们在项目中定义的 ACTIVE_COMPILATION_CONDITIONS 。

脚本:

xcodebuild -workspace project.xcworkspace -scheme SDKNR1 ONLY_ACTIVE_ARCH=NO 
EXCLUDED_ARCHS=arm64 ACTIVE_COMPILATION_CONDITIONS=SENTRY_AVAILABLE -configuration 
release -derivedDataPath $PROJECT_DIR/../simulators/SDKNR1 -sdk iphonesimulator
ENABLE_BITCODE=YES BITCODE_GENERATION_MODE=bitcode OTHER_CFLAGS="-fembed-bitcode" clean build

如您所见,我们定义了 ACTIVE_COMPILATION_CONDITIONS=SENTRY_AVAILABLE,但它不会覆盖目标 (SDKNR1) 的项目设置。假设,SDKNR1 没有任何 ACTIVE_COMPILATION_CONDITIONS。我们预计 xcodebuild 命令将覆盖目标的 ACTIVE_COMPILATION_CONDITIONS 并包含 SENTRY_AVAILABLE

欢迎任何想法,或者不可能?

解决方法

正确的构建设置键是“SWIFT_ACTIVE_COMPILATION_CONDITIONS”

您可以通过使用该命令并验证密钥是否存在来仔细检查:

xcodebuild -showBuildSettings <project/scheme/target/configuration flags>

来自 -showBuildSettings 的结果(被截断,对于在 Xcode 项目设置中为发布版本设置的 RELEASE_CONDITION2 [由于某种原因调试不会显示]):

.....
SUPPORTS_TEXT_BASED_API = NO
SWIFT_ACTIVE_COMPILATION_CONDITIONS = RELEASE_CONDITION2
SWIFT_COMPILATION_MODE = wholemodule
.....

在构建日志中,您应该看到(例如,设置 RELEASE_CONIDTION2,还要注意 ACTIVE_COMPLIATION_CONIDTIONS 被转换为 swiftc 的 -D 参数):

Build settings from command line:
    .....
    SDKROOT = iphoneos14.5
    SWIFT_ACTIVE_COMPILATION_CONDITIONS = RELEASE_CONDITION2
    .....

CompileSwiftSources normal arm64 com.apple.xcode.tools.swift.compiler .....
    .....
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc <most compiler options removed> -DRELEASE_CONDITION2

以上都是 Xcode 12.5