Separate build directory using xcodebuild

我是研究僧i 提交于 2019-12-03 05:18:45

You can set build settings from the command line. The CONFIGURATION_BUILD_DIR will set the build directory. For example:

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

A reference is found on Apple's site:

Stanislav Pankevich

To achieve complete separation the following build settings have to be changed (more than just CONFIGURATION_BUILD_DIR like accepted answer suggests), otherwise Xcode still builds some of its artifacts under its default build folder.

On my machine Xcode normally builds everything to ./Build and ./DerivedData where current directory is one of my project.

I wanted xcodebuild to build everything under Build-command-line folder so I used xcodebuild -scheme MyScheme -showBuildSettings | grep Build\/ to find all build settings that correspond to all build paths and by trial-end-error I found "the generative" build settings that are enough to redirect all build artefacts produced by xcodebuild to custom folder.

I ended up using the following command:

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

Where command-line-build.xcconfig is:

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

Note: Make sure you use absolute paths in your xcconfig, otherwise you may have error: Xcode crashing on startup “parentPath must be nil but it is not.

I have written a post about this solution with a bit of background: xcodebuild: how to really change its build path.

P.S. Of course this information is subject to change but as of Xcode Version 7.3.1 (7D1014) it works perfectly for me.

In my project, setting SYMROOT turned out to be sufficient to build the project in a different location, leaving other locations untouched.

From Apple's Xcode Build Setting Reference (which I came across via another answer here, thanks!):

SYMROOT (Build Products Path)

Description: Directory path. Identifies the root of the directory hierarchy that contains product files and intermediate build files. Product and build files are placed in subdirectories of this directory.

...

Affects: BUILT_PRODUCTS_DIR, CONFIGURATION_BUILD_DIR (...)

This setting is also mentioned a few times in the xcodebuild man page:

Available actions are:

build: Build the target in the build root (SYMROOT)...

clean: Remove build products and intermediate files from the build root (SYMROOT)....

Xcode 10

For a Workspace if you're using CocoaPods:

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

That will put your .app in ./build/Release-iphonesimulator

You should set the SYMROOT build setting to your desired location. All of the other relevant build settings are derived from it.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!