Показаны сообщения с ярлыком проект. Показать все сообщения
Показаны сообщения с ярлыком проект. Показать все сообщения

пятница, 30 апреля 2010 г.

Как автоматически копировать нужные заголовки в нужное место при сборке Xcode-проекта

Сегодня узнал об очень удобной возможности автоматизировать действия при сборке проекта.

Предыстория:

Мне не хочется, чтобы разные проекты зависели от их относительного расположения на диске. При этом я хочу, чтобы заголовки всех моих библиотек (как и сами бинарники) всегда лежали в одном и том же месте, независимо от того, где находятся сами проекты библиотек.

Что я хочу автоматизировать:

В моей ситуации нужно копировать только некоторые заголовочные файлы в определённое место (например, в папку /MyLibs/include/QuartzDrawingLib/).

Раньше я делал это вручную (рискуя однажды забыть скопировать обновлённые заголовки, что порождает множество непредсказуемых проблем из-за несоответствия библиотеке устаревшим заголовкам).

Как это можно сделать?

1-й способ (через добавление скрипта):

Посмотрите на дерево Xcode-проекта. Там есть ниже всех исходников Targets (с иконкой, напоминающей красную мишень). Выберите в Targets вашу цель (как правило с названием вашего проекта), нажмите на неё правой кнопкой мыши и выберите из контестного меню Add - > New Build Phase - > New Run Script Build Phase.

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

Я ввёл примерно следующее:

destDir=/MyLibs/include/QuartzDrawingLib/
if [ -d "$destDir" ]
then
echo "Directory "$destDir" is found"
else
echo "Directory "$destDir" will be created"
mkdir "$destDir"
if [ -d "$destDir" ]
then
echo "Directory "$destDir" is created"
else
echo "Directory "$destDir" is not created!"
echo "Exit script..."
exit 1
fi
fi

echo Copying headers...

cp Classes/SomeClass1.h $destDir
cp Classes/SomeClass2.h $destDir
cp Classes/SomeClass3.h $destDir
cp Classes/SomeClass4.h $destDir
cp Classes/SomeClass5.h $destDir

и так далее (из папки Classes в текущей директории копируются все ТОЛЬКО НУЖНЫЕ МНЕ заголовки в корень системного диска в папку /MyLibs/include/QuartzDrawingLib/

Теперь не нужно это делать каждый раз вручную.

Всё тоже самое можно сделать ВНЕ ПРОЕКТА как отдельный исполняемый скрипт (в виде обычного текстового файла), только перед написанием всех команд не забудьте сверху написать #!/bin/bash
Кроме того, после написания скрипта (т.е. текстового файла ВНЕ ПРОЕКТА) нужно данный текстовый файл сделать исполняемым - для этого выполните в консоли команду:
chmod +x NameOfScriptFile

2-й способ (который значительно проще, но менее надёжный, так как не гарантирует обновление имеющихся копий заголовков, т.е. их приходится удалять и снова нажимать кнопку Build):

Выберите в Targets вашу цель (как правило с названием вашего проекта), нажмите на неё правой кнопкой мыши и выберите из контестного меню Add - > New Build Phase - > New Copy Files Build Phase (после появления новой иконки добавленной фазы, в настройках этой фазы можно указать абсолютный путь куда копировать те файлы, которые вы будете добавлять в эту фазу в дереве проекта).

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

вторник, 27 апреля 2010 г.

Как сделать скрипт для компиляции и линковки сразу нескольких Xcode-проектов

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

В Мac OS в командной строке (в терминале) всё делается примерно также, как и в любой Unix-подобной системе.

Чтобы оставаться в терминале, можно даже и не открывать текстовый отдельный редактор, потому что есть встроенные редактор vi (или vim, насколько я знаю, этот редактор очень любят старые Linux-хакеры). Справку по этому редактору можно найти во многих статьях и учебниках (посвящённых Unix/Linux).

В самом верху вашего скрипта (текстового файла, содержащего все необходимые команды для выполнения) введите:

#!/bin/bash

Для того, чтобы добавить в скрипт команду для сборки (компиляции и линковки) Xcode-проекта, добавьте строку (вместо myProject.xcodeproj нужно указать правильный путь к файлу проекта):

xcodebuild -project myProject.xcodeproj -target targetname

(насчёт аргумента, который нужно ввести вместо targetname можно выяснять набрав команду
man xcodebuild

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

xcodebuild -project myProject.xcodeproj -activetarget

При выполнении этой команды всё будет компилироваться и линковаться точно также, как если бы вы снова открыли ваш проект в среде разработки и нажали на кнопочку "Build".


После того, как напишите и сохраните ваш скрипт (из команд для сборки нескольких проектов), обязательно позвольте ему стать исполняемым файлом, выполнив в терминале команду (при условии, что вместо scriptFileName указан правильный путь к файлу):

chmod +x scriptFileName

Если после компиляции+линковки (т.е. после сборки бинарника) вы видите, что дата создания бинарного файла стоит старая, то это лишь из-за того, что в исходниках или настройках проекта ничего не изменялось со времени прошлой сборки бинарника.

Ну вот собственно и всё.

Переименование Xcode-проекта и приложения (для iPhone)

Можно легко переименовывать основной контейнер проекта (который в Windows/Unix выглядит как обычная папка, а в Finder из Mac OS выглядит внешне как файл с расширением *.xcodeproj) - обычно это не вызывает никаких проблем.

Это может пригодиться, если вы делаете в Xcode приложение или библиотеку для Mac OS и для iPhone, используя общие исходные файлы. В таком случае достаточно сделать копию *.xcodeproj-контейнера и дать ему другое имя.

Несколько иначе обстоит дело при попытке изменить имя приложения для iPhone, т.е. название программы, как оно отображается в списке приложений на экране iPhone. Сейчас в новой версии iPhoneSDK в меню Xcode есть возможность переименовать проект (и вероятно название программы) - но я пока не исследовал эту возможность.

Далее я расскажу про старый способ переименовать проект, который я уже проверил несколько раз (об этом я узнал из зарубежных источников).

Скопируйте папку всего проекта (не только вышеупомянутый контейнер с расширением *.xcodeproj, но и все исходники с ресурсами) в надёжное место — вдруг что-то получится не так, как вы хотели. Вообще, полезно всегда делать копии всех важных файлов как можно чаще (или использовать систему контроля версий).

Войдите в ту папку, в которой вы будете переименовывать проект. Давайте будем считать для примера, что мы хотим переименовать AppleSample в MyCoolApp.

1) Переименуйте AppleSample.xcodeproj в MyCoolApp.xcodeproj.
2) Переименуйте AppleSample_Prefix.pch в MyCoolApp_Prefix.pch
3) Удалите папку build folder (используя Finder).
4) Откройте.xcodeproj как контейнер-папку (используя контекстное меню, например нажав на правую кнопку мыши, в зависимости от настроек Mac OS). В этой папке есть несколько файлов (обычно 3 или 4). Их нужно будет редактировать в текстовом редакторе (желательно с подсветкой синтаксиса для вашего же удобства — можно открыть даже с помощью Xcode).
5) Откройте project.pbxproj как текст и переименуйте все встречающиеся строки со старым именем AppleSample на новое имя MyCoolApp. Лучше не используйте для этого операцию «Найти и заменить (find an replace)». Имейте ввиду, что если вы захотите изменить строки, содержащие AppleSampleAppDelegate.h и AppleSampleAppDelegate.m, то изменение этих строк вынудит вас переименовать файлы с этими именами физичеки (поменять имена на те, что вы укажете в строках вместо старых).
6) Откройте файл с расширением.pbxuser (имя этого файла содержит ваше системное имя пользователя). Повторите все предыдущие шаги по редактированию строк.
7) Откройте все xib-файлы (их ещё принято называть nib-файлами) как текстовые или source файлы и повторите все предыдущие шаги по редактированию строк (это особенно актуально, если вы осмелились переименовать исходники главного делегата приложения).
8) Попробуйте после всего этого открыть проект в Xcode, и сделайте Clean и Build.

Постоянные читатели