使用 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 分离构建目录的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 7.2 使用 xcodebuild 构建项目失败
使用 Xcode 的命令行构建工具存档(xcodebuild 存档)