我正在使用Xcode和.xcconfig文件。我试图在预处理器定义中附加一些值,但我根本无法使它工作。
我尝试了以下(以及此的许多变体),但到目前为止没有运气:
GCC_PREPROCESSOR_DEFINITIONS = '$(GCC_PREPROCESSOR_DEFINITIONS) NEW_VALUE'
NEW_VALUE
符号根本不会添加到预处理器定义中。
是否有人成功将新值附加到xcconfig文件中的变量?
答案 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文件无法简单地继承和扩展彼此的值。但是,
$(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"