如何在xcconfigvariables中追加值?

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

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

GCC_PREPROCESSOR_DEFINITIONS = '$(GCC_PREPROCESSOR_DEFINITIONS) NEW_VALUE'

NEW_VALUE符号不会被添加到预处理器定义中。

有没有人成功地将新值添加到xcconfig文件中的variables?

由于在这个问题的其他答案中陈述的原因,你不能容易地inheritance价值。

我build议在级联中定义您的设置。 让我们假设APP是你的项目前缀,并简单地定义一些CFLAGS:

platform.xcconfig:

 APP_PLATFORM_CFLAGS = -DMAS=1 

project.xcconfig:

 #include "platform.xcconfig" APP_PROJECT_CFLAGS = -DBETA=1 

目标one.xcconfig:

 #include "project.xcconfig" APP_TARGET_CFLAGS = -DSUPER_COOL=1 #include "merge.xcconfig" 

目标two.xcconfig:

 #include "project.xcconfig" APP_TARGET_CFLAGS = -DULTRA_COOL=1 #include "merge.xcconfig" 

merge.xcconfig:

 OTHER_CFLAGS = $(inherited) $(APP_PLATFORM_CFLAGS) $(APP_PROJECT_CFLAGS) $(APP_TARGET_CFLAGS) 

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

另外,请记住, $(inherited)是指层次结构中较高的层次,而不是较早的层次。 例如,它从目标级别的项目级别inheritance。 不知道这是否也适用于Xcode 4。

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

根据Xcode构build系统指南:

当configuration单元包含特定构build设置的多个定义时,Xcode将使用单元中的最后一个定义。 请记住,configuration文件无权访问它们包含的configuration文件中的设置定义。 也就是说,你不能修改在一个包含的configuration文件中做的定义; 你只能取代它。

所以,我想这意味着它是不可能附加值给一个给定的variables。

这工作:

 xcodebuild GCC_PREPROCESSOR_DEFINITIONS='$(value) NEW_VALUE' 

还有一个问题可以帮助解决这个问题。 它描述了一个技术,每个层组成一个定义的子集,然后把它们放在叶级别的xcconfig中。

我想我试图将Cocoapods xcconfig文件集成到我自己的程序中时,遇到了一个稍微好一点的方法。 我喜欢在我的项目中设置以下内容

 GCC_PREPROCESSOR_DEFINITIONS = CONFIGURATION_$(CONFIGURATION) 

不幸的是,这与Pods.xcconfig附带的定义冲突。 如其他地方所述,$(inheritance)不能按预期工作。 什么工作是以下

 GCC_PREPROCESSOR_DEFINITIONS[config=*] = CONFIGURATION_$(CONFIGURATION) $(inherited) 

更新:

如果你需要重写一个特定configuration的设置,那么你会试图写一些类似的东西

 GCC_PREPROCESSOR_DEFINITIONS[config=*] = CONFIGURATION_$(CONFIGURATION) $(inherited) GCC_PREPROCESSOR_DEFINITIONS[config=Debug] = DEBUG=1 CONFIGURATION_$(CONFIGURATION) $(inherited) 

可悲的是,这将无法正常工作,但将第二个声明放入一个文件,只有通过debuggingconfiguration加载将正确覆盖设置。

这在Xcode 2.4.1中适用于我:

 GCC_PREPROCESSOR_DEFINITIONS =“$(GCC_PREPROCESSOR_DEFINITIONS)NEW_VALUE”

在编辑configuration文件和目标的Build Info中显示的变化之间,你必须有几秒的时间。

你想使用占位符$(inheritance)来表示从较低级别inheritance的值,例如

 GCC_PREPROCESSOR_DEFINITIONS = "$(inherited) NEW_VALUE"