2013-07-18 1 views
3

У меня есть makefile, который использует xcodebuild для создания проекта Xcode. Мой вопрос:где настройки загрузки xcodebuild (из проекта Xcode или из того, что установлено в make-файле)?

Это настройки в make-файле (который использует xcodebuild) или настройки в проекте Xcode, которые будут использоваться при вызове make-файла для создания проекта?

Например, если у меня есть некоторые настройки в файле управления, такие как:

SDKROOT =/Developer/SDKs/MacOSX10.5.sdk ARCHS="i386 x86_64" 
CXXFLGS =-I/Users/XXYY/dev/Frameworks/Headers -DUNIX (just an example to show where to check header files, this is different from what is set in the Xcode project) 

target: 
     xcodebuild build -target [email protected] -configuration Release 


... ... 

Будет ли установка здесь (SDKROOT и CXXFLGS) будут использоваться?

Если да, то я могу настроить проект Xcode (называемый проектом A) для ссылки на некоторые из моих собственных фреймворков, помещенных в $ (HOME)/Library/Frameworks, а затем отправить их пользователям.

В то же время, когда я создаю этот проект A, я могу установить его для ссылки на фреймворки, которые строятся в то же самое время, когда я создаю проект A в своем make-файле.

Таким образом, когда пользователи откроют мой проект A, рамки будут связаны с их $ HOME/Library/Frameworks. (Структуру попросят скопировать туда)

или Может быть, я могу спросить, как я могу установить путь поиска для своих собственных фреймворков, когда пытаюсь выдавать проект (который использует мои собственные фреймворки)? Процесс в make-файле будет следующим: сначала создайте мои фреймворки, затем мой проект (очевидно, мой проект будет связан с новой сборкой фреймворка).

Если я установил путь для фрейма для ссылки на myframeworkfolder/build/Release/* .frameworks, этот путь необходимо сбросить, когда проект будет скопирован другим пользователям. Если я установил путь для фреймворка для ссылки, например,/Library/Frameworks, то другим пользователям не нужно менять путь. У кого-то есть предложения, что я должен делать правильно? Или мне нужно установить путь для моей структуры в/Library/Frameworks, а затем, когда я закончу создание фреймворка, скопируйте его в/Library/Frameworks, а затем создайте мой проект. Правильно ли это?

Спасибо.

ответ

4

Ничего себе - много вопросов, заданных в этот вопрос! Давайте попробуем их устранить один за другим:

Будет ли использоваться настройка (SDKROOT и CXXFLGS)?

Нет, вы успешно сделали Makefile переменного, но они не получают подобраны командой xcodebuild в вашей цели сборки - вам нужно будет установить эти значения в качестве дополнительных параметров сборки по команде xcodebuild. На странице руководства для xcodebuild, мы видим, что этот формат присваивание для сборки конфигурации переопределяет было дистиллированная до [setting=value ...] из полного формата команды:

xcodebuild [-project имя_проекта] -схема schemename [-конфигурация ConfigurationName] [ -sdk [sdkfullpath | sdkname]] [buildaction ...] [установка = значение ...] [-userdefault = значение ...]

Это означает, что вы должны установить параметры построения в ключ-значение стилизованной формат команду xcodebuild.Важно отметить, что параметры сборки имеют иерархию - некоторые из них определяются SDK, которые затем могут быть переопределены на уровне проекта, которые могут быть дополнительно переопределены на целевом уровне, которые затем могут быть переопределены секцией настроек xcodebuild, и может быть переопределено в последний раз с использованием специфического xcodebuild -xcconfig file.

Это просто ... отлично ... С таким количеством мест, где нужно вводить настройку установки, как мы должны делать эту работу?

Это то, где вы, как проектировщик проекта, должны принимать решения о том, как ваш код, создавать продукты и фреймворки будут использоваться, повторно использоваться и даже злоупотреблять другими. Чем более общий или общий параметр сборки, тем выше в конфигурации он должен идти, чтобы он был применим к самому широкому набору целей. Например, SDKROOT - это один такой параметр сборки, который, вероятно, будет установлен в настройках сборки на уровне проекта, так как очень вероятно, что потребители этого проекта захотят использовать тот же SDK, что и для создания или использования этих фреймворков. Вы, конечно же, должны принять решение о том, должна ли настройка быть так называемой «глобальной» для всех целей и тщательно продвигать/понижать ваши конфигурации сборки. Поскольку в вашем исходном вопросе не так много подробностей о ваших приложениях/фреймворках/вариантах использования, существует мало конкретных рекомендаций, которые SO-сообщество сможет предоставить. Вместо этого я укажу вам в сторону передового опыта и оставлю его вам, чтобы применить эти лучшие практики к вашей ситуации.

Теперь вернусь к Makefile ... Если вы собираетесь запустить эту сборку непосредственно из терминала, с прикладными этими пользовательскими параметрами командной строки, ваша команда xcodebuild будет выглядеть примерно так:

xcodebuild -project Testing.xcodeproj -target Тестирование SDKROOT = '/ Developer/SDKs/MacOSX10.5.sdk' ARCHS = 'i386 x86_64' CXXFLGS = '- I/Users/XXYY/dev/Frameworks/Headers -DUNIX'

При запуске первые несколько строк вывода команды xcodebuild будут выглядеть так:

параметров сборки из командной строки:
арками = i386 x86_64
CXXFLGS = -I/Users/XXYY/Dev/Frameworks/Headers -DUNIX
SDKROOT = /Developer/SDKs/MacOSX10.5.sdk

Эта команда может быть перенесена в файл макияж с относительно небольшого числа изменений:

xcodebuild -project Testing.xcodeproj -target Тестирование SDKROOT = $ {SDKROOT} арок = $ {арки} CXXFLGS = $ {CXXFLG S}

${FOO} обозначения Makefile синтаксиса переменная замена - идти вперед и вставьте эту новую xcodebuild строку в ваш Makefile, а затем поиграться со значениями ваших переменных, и, наконец, вызвать марку. Вы увидите те же самые первые строки вывода xcodebuild, как и раньше, и они будут отражать изменения, внесенные вами в переменные makefile.

Поздравляем! Теперь вы передали переменные makefile в Xcodebuild!

Потенциальная ловушка: Ваша переменная SDKROOT, кажется, использует папку старой школы/разработчика для справки SDK. Неясно, собираетесь ли вы строить из этого каталога против более старых 10.5 SDK или нет, но я бы поставил под угрозу, что это просто осталось от версий Xcode в пре-Mac App Store. Если ваш проект не имеет определенную зависимость от 10.5, подумайте об обновлении Вашего пути SDKROOT к более современному SDKs в их новом местоположении:

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk

Затем переходит к ряду вопросов о рамочных и желании сделать их доступными другим.

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

Учитывая машины безопасности

Если это так, то установка этих скомпилированные рамок для системы или пользователя Каркасы библиотеки, вероятно не то, что вы хотите делать. Во-первых, папка/Library/Frameworks требует, чтобы приложение имело корневой доступ к машине, что, конечно же, создавало бы нетривиальный риск безопасности для машин. Папка «Рамки» пользователя (~/Library/Frameworks) лишь немного более безопасна, но также является таким необычным вариантом использования, что такая папка не существует по умолчанию! На самом деле существует относительно мало ситуаций, в которых было бы целесообразно продвигать структуру всей системы или всего пользователя.

Вместо этого, поскольку вы действительно ищете гарантированное известное местоположение, вы, вероятно, захотите, чтобы ваши продукты сборки копировались в папку внутри самой директории проекта. Тогда независимо от того, где ваши пользователи копируют папку проекта, относительные ссылки на подпапки основных папок проекта всегда будут правильными!

Естественно, есть несколько вариантов:

  1. Добавить фазу сборки Копирование файлов в конце и скопировать встроенные продукты из стандартного каталога сборки изделий с известной подпапках основной папки проекта , Как и раньше, вы можете обновить ссылки на проект по отношению к корню проекта.
  2. Установите DSTROOT в $ {SRCROOT}, INSTALL_PATH в именованный каталог внутри папки вашего проекта и установите для DEPLOYMENT_LOCATION значение 1. Это приведет к тому, что ваша инфраструктура будет «установлена» на этот известный путь в вашем проекте, и вы можете установить все остальные заголовки и каркасные пути поиска относительно этого известного местоположения.

В зависимости от потребностей вашего проекта один из этих вариантов может оказаться более легким в обслуживании в долгосрочной перспективе, - который будет полностью зависеть от вашего проекта и как вы ожидаете, что ваши пользователи будут потреблять ваши фреймворки. Одно абсолютно точно, если вам абсолютно не нужно root-доступ для ваших фреймворков, лучше всего избегать этих библиотек Library/Frameworks все вместе.

Надеюсь, это поможет вам в правильном направлении, и если у вас есть какие-либо вопросы Followup бросить на комментарий в конце этого ответа, и я посмотрю, смогу ли я уточнить, разработать и т.д.

 Смежные вопросы

  • Нет связанных вопросов^_^