在Xcode 4.6中如何从命令行设置#define

8

我正在尝试在使用xcodebuild进行命令行构建时设置#define宏,但没有成功。

我尝试了-DMYMACRO=1和MYMACRO=1以及我所能想到的其他方法,但都不起作用。

您如何从命令行设置#define?

2个回答

27

Roger,

你想要做的是通过命令行工具xcodebuild设置GCC_PREPROCESSOR_MACROS。 xcodebuild的man页面显示了应用这些设置的格式,但是SYNOPSIS部分只将其称为“setting=value ...”。

 xcodebuild [-project projectname] -scheme schemename [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [buildaction ...] [setting=value ...] [-userdefault=value ...]
 xcodebuild -workspace workspacename -scheme schemename [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [buildaction ...] [setting=value ...] [-userdefault=value ...]
最终,您可以通过使用此格式并知道要更改的实际构建设置名称,在命令行上直接设置任何构建设置值。自然会引出一个问题...
如何找到构建设置名称?
很高兴你问了! Xcode 4的侧边栏是查找实际命令行构建设置名称的最简单的地方。
当寻找构建设置名称时,Xcode 4实用程序侧边栏中的“快速帮助检查器”是去查找的地方。
1.访问项目的“Build Settings”屏幕。 2.通过单击Xcode右上角组织者按钮旁边的“Utilities”按钮,确保侧边栏(Xcode所称的“Utilities”)可见。 3.在实用程序侧边栏中,确保“快速帮助检查器”可见。
或者,直接使用Option+Command+2显示“快速帮助检查器”!
最后,您要找到您的构建设置:
1.搜索要更改的构建设置或滚动构建设置列表。 2.单击您感兴趣的构建设置,并观察快速帮助检查器更新。 3.快速帮助检查器的“声明”部分显示了您想要使用的命令行构建设置名称。
对于您最初问到的预处理器宏设置,该设置为:
GCC_PREPROCESSOR_DEFINITIONS
将这些内容整合到您的原始问题中,您可以通过提供SETTING_NAME='DESIRED_VALUE'以及其他xcodebuild命令来简单地在命令行上设置此构建设置。在我组装的一个名为“TestApp”的快速测试项目中,我希望将预处理器宏“BKM”设置为值1,我的xcodebuild命令将是:
xcodebuild -project TestApp.xcodeproj -scheme TestApp GCC_PREPROCESSOR_DEFINITIONS='${inherited} BKM=1'
为什么要在那里添加${inherited}?
如果您正在使用预处理器宏,则可能有多个宏正在使用。其中一些您可能不想从命令行更改,但仍已编码进目标或项目的构建设置中。使用“$ {inherited}”的方法指示xcodebuild还使用在较高级别定义的构建设置,而不仅使用我们在xcodebuild命令中定义的那些构建设置。在大多数情况下,您将想要使用$ {inherited}来拉入您设置的任何其他配置值。
我是否必须将值包裹在引号中?
如果您想设置多个值,那么是的,您需要将值包装在引号中;否则,如果从命令行设置两个或多个预处理器宏,则第2+个宏将被解释为构建设置而不是预处理器宏...并非完全正确的行为。引号充当将设置的多个值收集在一起的方法。在我的示例xcodebuild命令中,我希望xcodebuild使用继承的预处理器宏组和特定的BKM设置,因此我将值包装在引号中,以告诉xcodebuild将它们都视为预处理器宏。
这对工作区也有效吗?
绝对可以!只需修改命令以使用-workspace参数而不是-project参数,您就可以开始了!

1
请注意以下有关编程的内容。仅返回翻译文本:注:使用单引号,不要使用双引号。 - Quanturium

1

Swift 5+, Xcode 13+

您可以通过以下方式将OTHER_SWIFT_FLAGS传递给xcodebuild:

xcodebuild \
    build \
    "OTHER_SWIFT_FLAGS=${inherited} -D STAGING" \
    -target "TargetName" \
    -scheme "SchemeName"

这将导致以下结果:
#if STAGING
// this will compile
#else
// this won't compile
#endif

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