如何在xcconfig变量中追加值?

Mar*_*ote 42 xcode xcconfig

我正在使用Xcode和.xcconfig文件.我试图在预处理器定义中附加一些值,但我根本无法使它工作.

我尝试了以下(以及此的许多变体),但到目前为止没有运气:

GCC_PREPROCESSOR_DEFINITIONS = '$(GCC_PREPROCESSOR_DEFINITIONS) NEW_VALUE'

NEW_VALUE符号根本不会添加到预处理器定义中.

有没有人成功地将新值附加到xcconfig文件中的变量?

djr*_*ero 32

出于此问题的其他答案中所述的原因,您无法轻松继承值.

我建议您以级联方式定义设置.让我们假设APP是你的项目前缀,并简单地定义了几个CFLAGS:

platform.xcconfig:

APP_PLATFORM_CFLAGS = -DMAS=1
Run Code Online (Sandbox Code Playgroud)

project.xcconfig:

#include "platform.xcconfig"
APP_PROJECT_CFLAGS = -DBETA=1
Run Code Online (Sandbox Code Playgroud)

目标one.xcconfig:

#include "project.xcconfig"
APP_TARGET_CFLAGS = -DSUPER_COOL=1
#include "merge.xcconfig"
Run Code Online (Sandbox Code Playgroud)

目标two.xcconfig:

#include "project.xcconfig"
APP_TARGET_CFLAGS = -DULTRA_COOL=1
#include "merge.xcconfig"
Run Code Online (Sandbox Code Playgroud)

merge.xcconfig:

OTHER_CFLAGS = $(inherited) $(APP_PLATFORM_CFLAGS) $(APP_PROJECT_CFLAGS) $(APP_TARGET_CFLAGS)
Run Code Online (Sandbox Code Playgroud)

然后,您将基于每个目标构建配置target-xxx.xcconfig.一个真实的项目将使用更复杂的设置,使用项目的配置文件和目标的不同设置,但你明白了.

另外,请记住,在层次结构$(inherited)中指的是更高级别,而不是更早.例如,它从目标级别的项目级别继承.不确定这是否也适用于Xcode 4.

这是GTM的简化,去那里了解更多.


Mar*_*ote 10

根据Xcode构建系统指南:

当配置单元包含特定构建设置的多个定义时,Xcode使用单元中的最后一个定义.请记住,配置文件无权访问它们包含的配置文件中的构建设置定义.也就是说,您无法修改包含的配置文件中的定义; 你只能替换它.

所以,我想这意味着无法将值附加到给定变量.


小智 9

这有效:

xcodebuild GCC_PREPROCESSOR_DEFINITIONS='$(value) NEW_VALUE'
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我只是使用`GCC_PREPROCESSOR_DEFINITIONS = $(value)NEW_VALUE`(没有引号)。 (2认同)

Gui*_*gis 6

如其他答案所述,在Xcode 10之前,xcconfig文件不能简单地继承和扩展彼此的值。但,

从Xcode 10开始,xcconfig现在可以像预期的那样工作:$(inherited)实际上扩展为该变量的先前定义的值。

当.xcconfig文件包含相同构建设置的多个分配时,以后使用$(inherited)或的分配$(<setting_name>)将继承.xcconfig中以前的分配。旧版生成系统导致对.xcconfig中定义的任何其他使用$(inherited)$(<setting_name>)跳过。要检测您的.xcconfig是否受此改进影响,请运行defaults write com.apple.dt.XCBuild EnableCompatibilityWarningsForXCBuildTransition -bool YES在Terminal中将使Xcode生成有关此情况的警告。

(Xcode 10 beta 1发行说明)

因此,例如,给定两个简单的.xcconfig文件:

// Generic.xcconfig
OTHER_SWIFT_FLAGS = $(inherited) -DMY_GENERIC_FLAG
Run Code Online (Sandbox Code Playgroud)

// Debug.xcconfig
#include "Generic.xcconfig"
OTHER_SWIFT_FLAGS = $(inherited) -DMY_DEBUG_FLAG
Run Code Online (Sandbox Code Playgroud)

假设您的项目使用Debug.xcconfig作为其Debug配置,您将获得预期-DMY_GENERIC_FLAG -DMY_DEBUG_FLAGOTHER_SWIFT_FLAGS

(而不只是-DMY_DEBUG_FLAGXcode 9和更早的版本中)


新行为非常简单: $(inherited)只需替换为先前定义的变量值(如果有)即可。

因此,在前面的示例中,如果我们扩展该#include语句,我们将获得以下xcconfig文件:

// Merged xcconfig files after resolving #include
OTHER_SWIFT_FLAGS = -DMY_GENERIC_FLAG
OTHER_SWIFT_FLAGS = $(inherited) -DMY_DEBUG_FLAG
Run Code Online (Sandbox Code Playgroud)
  • 第一行的OTHER_SWIFT_FLAGS值是-DMY_GENERIC_FLAG$(inherited)扩展为无,因为这是OTHER_SWIFT_FLAGS我们遇到1的第一个定义)。
  • 在第二行(OTHER_SWIFT_FLAGS如果已覆盖),其值现在为-DMY_GENERIC_FLAG -DMY_DEBUG_FLAG(其先前值+新添加的标志)。

在更复杂的xcconfig设置中,情况可能如下所示:

// First.xcconfig
OTHER_SWIFT_FLAGS = $(inherited) -DMY_FIRST_FLAG
Run Code Online (Sandbox Code Playgroud)

// Second.xcconfig
OTHER_SWIFT_FLAGS = $(inherited) -DMY_SECOND_FLAG
Run Code Online (Sandbox Code Playgroud)

// Last.xcconfig
#include "Generic.xcconfig"
OTHER_SWIFT_FLAGS = $(inherited) -DMY_LAST_FLAG
Run Code Online (Sandbox Code Playgroud)

// Merge.xcconfig
#include "First.xcconfig"
#include "Second.xcconfig"
OTHER_SWIFT_FLAGS = $(inherited) -DMY_INTERMEDIATE_FLAG
#include "Last.xcconfig"
Run Code Online (Sandbox Code Playgroud)

假设这次我们在配置中使用Merge.xcconfig。

的解析值OTHER_SWIFT_FLAGS将是-DMY_FIRST_FLAG -DMY_SECOND_FLAG -DMY_INTERMEDIATE_FLAG -DMY_LAST_FLAG

刚开始时这可能令人惊讶,但实际上是有道理的:#include解决了问题后,我们最终得到了这个xcconfig:

OTHER_SWIFT_FLAGS = $(inherited) -DMY_FIRST_FLAG
OTHER_SWIFT_FLAGS = $(inherited) -DMY_SECOND_FLAG
OTHER_SWIFT_FLAGS = $(inherited) -DMY_INTERMEDIATE_FLAG
OTHER_SWIFT_FLAGS = $(inherited) -DMY_LAST_FLAG
Run Code Online (Sandbox Code Playgroud)

最终的解析值就是最后一行定义-DMY_LAST_FLAG的值,再加上它从上一行继承的值,-DMY_INTERMEDIATE_FLAG等等。

请注意,自然地,如果您忘记$(inherited)了其中一个定义,则会破坏继承链,仅从底部定义中获取值,直到没有时才从定义中获取值$(inherited)


1可能希望xcconfig文件继承项目级别定义的以前的值,但事实并非如此


从Xcode 10 beta 1开始,似乎构建设置编辑器无法正确解析xcconfig文件中定义的变量的正确值,并显示这些值,就像使用旧的Xcode 10以前的行为已解析一样。我对此提交了rdar:// 40873121(https://openradar.appspot.com/radar?id=4925869923500032)。

  • @RogerOba我刚刚验证了,Xcode 12.5 中似乎没有任何变化 (2认同)

Cha*_*son 1

这在 Xcode 2.4.1 中对我有用:

GCC_PREPROCESSOR_DEFINITIONS = "$(GCC_PREPROCESSOR_DEFINITIONS) NEW_VALUE"

有时,您确实必须在编辑配置文件和目标的构建信息中显示更改之间留出几秒钟的时间。