使用 xcodebuild 分离构建目录

Posted

技术标签:

【中文标题】使用 xcodebuild 分离构建目录【英文标题】:Separate build directory using xcodebuild 【发布时间】:2011-02-11 14:08:37 【问题描述】:

xcodebuild 的手册页内容如下:

从目录运行 xcodebuild 包含您的项目(即 目录包含 projectname.xcodeproj 包)。

我想保持我的源目录(Subversion 外部)干净且未修改,并将我的目标文件和可执行文件构建到完全位于源目录之外的位置。

有什么方法可以使用xcodebuild 从终端构建单独的构建目录,就像您可以在 Windows 上使用make 工具甚至msbuild 一样?

【问题讨论】:

【参考方案1】:

您可以从命令行设置构建设置。 CONFIGURATION_BUILD_DIR 将设置构建目录。例如:

xcodebuild -project YourProject.xcodeproj -configuration Debug -target All ARCHS=x86_64 ONLY_ACTIVE_ARCH=YES CONFIGURATION_BUILD_DIR=../some/other/dir

可在 Apple 网站上找到参考:

Build Setting Reference

【讨论】:

我发现我还需要设置CONFIGURATION_TEMP_DIR,然后这对我有用。 你可以设置 BUILD_DIR 也可以:D【参考方案2】:

为了实现完全分离,必须更改以下构建设置(不仅仅是CONFIGURATION_BUILD_DIR,就像接受的答案所建议的那样),否则 Xcode 仍会在其默认构建文件夹下构建它的一些工件。

在我的机器上,Xcode 通常会将所有内容构建到./Build./DerivedData,其中当前目录是我的项目之一。

我希望 xcodebuild 构建 Build-command-line 文件夹下的所有内容,因此我使用 xcodebuild -scheme MyScheme -showBuildSettings | grep Build\/ 查找与所有构建路径相对应的所有构建设置,并且通过试验结束错误,我发现“生成”构建设置足以将 xcodebuild 生成的所有构建工件 重定向到自定义文件夹。

我最终使用了以下命令:

BUILD_DIR=./Build-command-line
DERIVED_DATA_DIR=$(BUILD_DIR)/DerivedData

xcodebuild -project MyProject.xcodeproj \
         -IDEBuildOperationMaxNumberOfConcurrentCompileTasks=`sysctl -n hw.ncpu` \
         -scheme MyScheme \
         -sdk iphonesimulator \
         -destination 'platform=ios Simulator,name=iPhone 6S Plus,OS=latest' \
         -xcconfig command-line-build.xcconfig \
         -derivedDataPath $(DERIVED_DATA_DIR) \
         test

command-line-build.xcconfig 在哪里:

HERE_BUILD=$(SRCROOT)/Build-command-line
HERE_INTERMEDIATES=$(HERE_BUILD)/Intermediates

// Paths
// the following paths are enough to redirect everything to $HERE_BUILD
MODULE_CACHE_DIR    = $(HERE_BUILD)/DerivedData/ModuleCache
OBJROOT             = $(HERE_INTERMEDIATES)
SHARED_PRECOMPS_DIR = $(HERE_INTERMEDIATES)/PrecompiledHeaders
SYMROOT

注意:确保在 xcconfig 中使用绝对路径,否则可能会出现错误:Xcode crashing on startup “parentPath must be nil but it is not。

我写了一篇关于这个解决方案的帖子,有点背景:xcodebuild: how to really change its build path。

附:当然,这些信息可能会发生变化,但从 Xcode Version 7.3.1 (7D1014) 开始,它对我来说非常有效。

【讨论】:

斯坦尼斯拉夫,你可能是(唯一的人:))知道this one:O 不,我不知道。对不起:)【参考方案3】:

Xcode 10

如果您使用的是 CocoaPods,则适用于工作区:

xcodebuild -workspace youProject.xcworkspace -scheme yourScheme -sdk iphonesimulator -configuration Release SYMROOT=$(PWD)/build

这会将您的 .app 放入 ./build/Release-iphonesimulator

【讨论】:

【参考方案4】:

在我的项目中,设置 SYMROOT 足以在不同的位置构建项目,而其他位置保持不变。

来自 Apple 的 Xcode Build Setting Reference(我是通过另一个答案在这里找到的,谢谢!):

SYMROOT(构建产品路径)

描述:目录路径。标识包含产品文件和中间构建文件的目录层次结构的根。产品和构建文件放置在该目录的子目录中。

...

影响:BUILT_PRODUCTS_DIR、CONFIGURATION_BUILD_DIR (...)

xcodebuild 手册页中也多次提及此设置:

可用的操作有:

build:在构建根目录(SYMROOT)中构建目标...

clean:从构建根目录 (SYMROOT) 中删除构建产品和中间文件....

【讨论】:

如果您想将所有内容重定向到自定义文件夹,至少OBJROOT 非常重要,因为相当多的文件夹依赖于它,而不是SYMROOT。我刚刚检查了 Xcode 7.3.1 - MODULE_CACHE_DIR 和 SHARED_PRECOMPS_DIR 也独立于SYMROOT。所以你的答案仍然会在默认构建目录中构建一些东西,但也许这对你的任务来说已经足够了。【参考方案5】:

您应该将SYMROOT 构建设置设置为您想要的位置。所有其他相关的构建设置都源自它。

【讨论】:

【参考方案6】:

您也可以临时更改工作目录并从那里运行命令。即

 (cd dir1/dir2/MyApp && xcodebuild build -workspace "MyApp.xcworkspace" -scheme "MyApp")

【讨论】:

以上是关于使用 xcodebuild 分离构建目录的主要内容,如果未能解决你的问题,请参考以下文章

iOS Xcodebuild

Xcode 7.2 使用 xcodebuild 构建项目失败

使用 Xcode 的命令行构建工具存档(xcodebuild 存档)

如何将旧版构建系统与 Xcode 10 的“xcodebuild”一起使用?

xcodebuild 比 Xcode 慢得多?

为啥在使用 XCode 和 xcodebuild 之间存在差异?