如何在xcconfig变量中追加值?

时间:2009-09-08 13:19:35

标签: xcode xcconfig

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

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

GCC_PREPROCESSOR_DEFINITIONS = '$(GCC_PREPROCESSOR_DEFINITIONS) NEW_VALUE'

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

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

8 个答案:

答案 0 :(得分:31)

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

我建议您以级联方式定义设置。让我们假设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的每个目标构建配置。一个真实的项目将使用更复杂的设置,使用项目的配置文件和目标的不同设置,但你明白了。

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

这是GTM的简化,去了解更多信息。

答案 1 :(得分:10)

根据Xcode构建系统指南:

  

配置单元包含时   一个以上的定义   特定的构建设置,Xcode使用   单元中的最后一个定义。保持   记住配置文件   无法访问构建设置   配置中的定义   他们包含的文件。那是你   无法修改所做的定义   包含的配置文件;您   只能取代它。

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

答案 2 :(得分:8)

这有效:

xcodebuild GCC_PREPROCESSOR_DEFINITIONS='$(value) NEW_VALUE'

答案 3 :(得分:4)

another question有一个答案可能有助于解决这一特定问题。它描述了一种技术,每个层组成定义的子集,然后在叶级xcconfig将它们全部组合在一起。

答案 4 :(得分:4)

我认为在尝试将Cocoapods xcconfig文件集成到我自己的文件中时,我偶然发现了一种更好的方法。我想在我的项目中设置以下内容

GCC_PREPROCESSOR_DEFINITIONS = CONFIGURATION_$(CONFIGURATION)

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

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

更新:

如果您需要覆盖特定配置的设置,那么您很想编写类似

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

遗憾的是,这不起作用但是将第二个声明放入一个仅由Debug配置加载的文件中将正确覆盖设置。

答案 5 :(得分:3)

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

从Xcode 10开始,xcconfig现在可以正常工作:$(inherited)实际上扩展到先前定义的变量值。

  

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

(Xcode 10 beta 1发行说明)

例如,给出两个简单的.xcconfig文件:

//  Generic.xcconfig
OTHER_SWIFT_FLAGS = $(inherited) -DMY_GENERIC_FLAG

// Debug.xcconfig
#include "Generic.xcconfig"
OTHER_SWIFT_FLAGS = $(inherited) -DMY_DEBUG_FLAG

假设您的项目使用Debug.xcconfig进行调试配置,您将获得-DMY_GENERIC_FLAG -DMY_DEBUG_FLAG的预期值OTHER_SWIFT_FLAGS

(而不仅仅是Xcode 9和早期版本中的-DMY_DEBUG_FLAG

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

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

// Merged xcconfig files after resolving #include
OTHER_SWIFT_FLAGS = -DMY_GENERIC_FLAG
OTHER_SWIFT_FLAGS = $(inherited) -DMY_DEBUG_FLAG
  • 在第一行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

// Second.xcconfig
OTHER_SWIFT_FLAGS = $(inherited) -DMY_SECOND_FLAG

// Last.xcconfig
#include "Generic.xcconfig"
OTHER_SWIFT_FLAGS = $(inherited) -DMY_LAST_FLAG

// Merge.xcconfig
#include "First.xcconfig"
#include "Second.xcconfig"
OTHER_SWIFT_FLAGS = $(inherited) -DMY_INTERMEDIATE_FLAG
#include "Last.xcconfig"

我们假设这次我们在配置中使用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

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

请注意,当然,如果您忘记其中一个定义中的$(inherited),您将打破继承链并仅从底部定义中获取值,而不是$(inherited)的定义。

1 可能希望xcconfig文件继承在Project级别定义的先前值,但似乎不是这种情况

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

答案 6 :(得分:1)

这适用于Xcode 2.4.1:

GCC_PREPROCESSOR_DEFINITIONS = "$(GCC_PREPROCESSOR_DEFINITIONS) NEW_VALUE"

在编辑配置文件和目标的构建信息中显示的更改之间,您有时需要几秒钟。

答案 7 :(得分:0)

您希望使用占位符$(继承)来表示从较低级别继承的值,例如

GCC_PREPROCESSOR_DEFINITIONS = "$(inherited) NEW_VALUE"