Ничего себе - много вопросов, заданных в этот вопрос! Давайте попробуем их устранить один за другим:
Будет ли использоваться настройка (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) лишь немного более безопасна, но также является таким необычным вариантом использования, что такая папка не существует по умолчанию! На самом деле существует относительно мало ситуаций, в которых было бы целесообразно продвигать структуру всей системы или всего пользователя.
Вместо этого, поскольку вы действительно ищете гарантированное известное местоположение, вы, вероятно, захотите, чтобы ваши продукты сборки копировались в папку внутри самой директории проекта. Тогда независимо от того, где ваши пользователи копируют папку проекта, относительные ссылки на подпапки основных папок проекта всегда будут правильными!
Естественно, есть несколько вариантов:
- Добавить фазу сборки Копирование файлов в конце и скопировать встроенные продукты из стандартного каталога сборки изделий с известной подпапках основной папки проекта , Как и раньше, вы можете обновить ссылки на проект по отношению к корню проекта.
- Установите DSTROOT в $ {SRCROOT}, INSTALL_PATH в именованный каталог внутри папки вашего проекта и установите для DEPLOYMENT_LOCATION значение 1. Это приведет к тому, что ваша инфраструктура будет «установлена» на этот известный путь в вашем проекте, и вы можете установить все остальные заголовки и каркасные пути поиска относительно этого известного местоположения.
В зависимости от потребностей вашего проекта один из этих вариантов может оказаться более легким в обслуживании в долгосрочной перспективе, - который будет полностью зависеть от вашего проекта и как вы ожидаете, что ваши пользователи будут потреблять ваши фреймворки. Одно абсолютно точно, если вам абсолютно не нужно root-доступ для ваших фреймворков, лучше всего избегать этих библиотек Library/Frameworks все вместе.
Надеюсь, это поможет вам в правильном направлении, и если у вас есть какие-либо вопросы Followup бросить на комментарий в конце этого ответа, и я посмотрю, смогу ли я уточнить, разработать и т.д.