xcodebuild ACTIVE_COMPILATION_CONDITIONS 不会覆盖目标的 ACTIVE_COMPILATION_CONDITIONS

xcodebuild ACTIVE_COMPILATION_CONDITIONS does not override target's 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 的结果(被截断,因为 RELEASE_CONDITION2 在发布构建的 Xcode 项目设置中设置 [由于某种原因调试不会显示]):

.....
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

以上都是Xcode12.5