Разделить каталог сборки с помощью xcodebuild

Страница руководства для xcodebuild читает:

Запустите xcodebuild из каталога содержащий ваш проект (т.е. каталог, содержащий projectname.xcodeproj package).

Я хотел бы сохранить исходный каталог (который является внешним объектом Subversion) чистым и немодифицированным, а также создать мои объектные файлы и исполняемые файлы в месте, полностью вне исходного каталога.

Есть ли способ создать отдельный каталог сборки из терминала с помощью xcodebuild, как вы можете сделать с инструментами make или даже msbuild в Windows?

Ответ 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:

Ответ 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 при запуске" parentPath должен быть нулем, но это не.

Я написал сообщение об этом решении с немного фона: xcodebuild: как реально изменить свой путь сборки.

P.S. Конечно, эта информация может быть изменена, но по состоянию на Xcode Version 7.3.1 (7D1014) она отлично работает для меня.

Ответ 3

В моем проекте установка SYMROOT оказалась достаточной для создания проекта в другом месте, оставив другие места нетронутыми.

Из Apple Ссылка на установку кода Xcode (которую я нашел через другой ответ здесь, спасибо!):

SYMROOT (путь создания продуктов)

Описание: путь к каталогу. Идентифицирует корень иерархии каталогов, содержащий файлы продуктов и промежуточные файлы сборки. Файлы продукта и сборки размещаются в подкаталогах этого каталога.

...

Влияет: BUILT_PRODUCTS_DIR, CONFIGURATION_BUILD_DIR (...)

Эта настройка также упоминается несколько раз на странице xcodebuild man:

Доступные действия:

build: создать цель в корне сборки (SYMROOT)...

clean: удалить сборку продуктов и промежуточных файлов из корня сборки (SYMROOT)....

Ответ 4

Вы должны установить параметр SYMROOT build в нужное место. Все другие соответствующие настройки сборки получены из него.