xcodebuild - 如何定义预处理宏?

25

当使用xcodebuild时如何定义预处理器宏?

我需要使用许多不同的配置来构建我的应用程序,并且我想使用一个shell脚本来运行多次xcodebuild并使用不同的预处理器宏。


这回答您的问题吗?[在Xcode 4.6中从命令行设置#define](https://dev59.com/z3DXa4cB1Zd3GeqP-kz0) - Eric
2个回答

38

你需要在 xcodebuild 命令行中传递 GCC_PREPROCESSOR_DEFINITIONS 参数。

请注意,该参数会被重新评估以进行类似于 shell 的单词拆分和引号处理,因此您需要小心,特别是当您的宏值不仅仅是简单的 1 时(例如 NSString 字面量)。

同样重要的是,在您设置的值中扩展 GCC_PREPROCESSOR_DEFINITIONS (使用单引号,这样您的脚本就不会将其扩展,而是由构建的 shell 进行扩展),否则您将失去此属性的项目构建设置。

以下代码将您的定义放入一个漂亮的 bash 数组中,然后按照一种 shell 东西得到良好转义的方式在 xcodebuild 命令行中扩展该数组:

defines=( TESTING=1 'IWISH_HOST=@"http://192.168.0.101:8080"' )

xcodebuild -verbose -scheme "MyAppScheme" \
    GCC_PREPROCESSOR_DEFINITIONS='$GCC_PREPROCESSOR_DEFINITIONS '"$(printf '%q ' "${defines[@]}")"

2
请问,是否必须给出一个值,如TESTING=1?是否有类似于#define TESTING的东西? - karim
好,我必须使用双引号并移除 $value。之前我的代码是 GCC_PREPROCESSOR_DEFINITIONS='$value ${e}',它没起作用;但是 GCC_PREPROCESSOR_DEFINITIONS="${e}" 就可以了。 - karim
@karim 我不知道$e是什么,但我感觉你完全错过了这个答案的重点。此外,defines数组是放置自定义宏定义的地方。上面的那个只是一个例子。很可能你的数组看起来完全不同。 - lhunath
$e 包含一个数组中的值。我的第二条评论是对第一条评论的回答。 :) - karim
5
这里有一个具体的例子,适用于XCode 5.1,如果有帮助的话。在源代码中,您将会看到:#ifdef COOL_FEATURE_ENABLED NSLog(@"Cool feature enabled in this build."); #endif。对于命令行构建,您将会使用:xcodebuild -verbose -scheme "MyAppScheme" GCC_PREPROCESSOR_DEFINITIONS='$GCC_PREPROCESSOR_DEFINITIONS COOL_FEATURE_ENABLED=1' - Goffredo
为了进一步解释Jeffro的示例(以及这个答案),单引号不会评估其中的$值(双引号会)。因此,$值由xcodebuild本身评估。出于这个原因,我们必须将$GCC_PREPROCESSOR_DEFINITIONS作为第一个值(实际上是一组空格分隔的值)传递,这意味着“在xcode项目中已经设置的所有预处理器定义”。 - M Katz

19

按下Cmd + I打开信息对话框。然后在“Build”选项卡中找到“Preprocessor Macros”设置。

...您可以在那里找到设置名称GCC_PREPROCESSOR_DEFINITIONS,因此您可以添加宏。

GCC_PREPROCESSOR_DEFINITIONS="foo=bar"

添加到xcodebuild参数中。


1
我相信KennyTM所说的一旦设置好(使用GUI),在xcodebuild中将会很好地工作。 - nall
2
我在查看xcodebuild的选项/标志时,甚至没有注意到设置设置是基本使用语法的一部分。谢谢。 - Jaka Jančar
6
想要使用多个定义时,应该使用什么分隔符? - Dirty Henry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接