8

在使用 xcodebuild 进行命令行构建并且没有运气时,我正在尝试设置 #define 宏。

我已经尝试过了-DMYMACRO=1MYMACRO=1我能想到的一切都没有,但没有任何效果。

如何从命令行设置#define?

4

2 回答 2

27

罗杰,

您正在寻找的是一种通过命令行工具 xcodebuild 设置 GCC_PREPROCESSOR_MACROS 的方法。xcodebuild 的手册页显示了应用这些设置的格式,但是 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 实用工具侧边栏的 Quick Help Inspector 是查找的地方。

  1. 访问项目的构建设置屏幕。
  2. 通过单击 Xcode 右上角的 Organizer 按钮旁边的“Utilities”按钮,确保 Sidebar(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} 来提取您设置的任何其他配置值。

我必须用撇号包装价值吗?

如果您想设置多个值,那么是的,您需要将值包含在撇号中,否则如果您从命令行设置两个或多个预处理器宏,则第二个 + 宏将被解释为构建设置而不是预处理器宏...不完全正确的行为。撇号用作将多个值收集在一起的一种方式。对于我的示例 xcodebuild 命令,我想让 xcodebuild 使用继承的预处理器宏集以及我的特定 BKM 设置,因此我将值包装在撇号中,以告诉 xcodebuild 将它们都视为预处理器宏。

这也适用于工作区吗?

绝对地!只需修改命令以使用 -workspace 参数而不是 -project 参数,您就可以开展业务了!

于 2013-04-29T08:31:30.130 回答
1

斯威夫特 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
于 2021-11-30T11:30:23.013 回答