Pull to refresh

Сборка FreeType2 под iOS

Reading time 5 min
Views 8K
imageimage
В интернете есть множество заметок о том, как собирать freetype под iOS.
Все эти заметки объединены общей характеристикой — они не работают.
Дело в том, что все инструкции оперируют gcc для сборки библиотеки, но начиная с XCode 5 gcc не входит в поставку и для сборки под iOS надо использовать clang.
Нет ни одной заметки о том, как компилировать правильно.
Исправляем эту несправедливость.


Подготовка к сборке


Предполагается, что XCode у Вас уже скачан и настроен
Freetype базируется на sourceforge, оттуда и забираем.
Полученный архив не забываем распаковать.

Для сборки универсальной библиотеки нам понадобится 5 раз повторить компиляцию библиотеки с разными параметрами.
Все инструкции выполняются из корневого каталога freetype.

i386


$ ./configure --enable-static=yes --enable-shared=no CC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc CFLAGS="-arch i386 -Wno-extended-offsetof -miphoneos-version-min=4.2 -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.1.sdk/usr/include -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.1.sdk" CPP=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cpp AR=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar LDFLAGS="-arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.1.sdk -miphoneos-version-min=4.2"
$ make

Этими командами мы настраиваем сборку для i386 архитектуры и собираем библиотеку. Полученная библиотека разместится в каталоге objs/.libs/libfreetype.a
Переименовываем полученную библиотеку и копируем в корень. Она понадобится нам на последнем шаге сборки.

$ cp objs/.libs/libfreetype.a libfreetype-i386.a

x86_64


Аналогичным способом собираем под x86_64, добавляем команду make clean, чтобы избавиться от результатов предыдущей сборки

$ ./configure --enable-static=yes --enable-shared=no CC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc CFLAGS="-arch x86_64 -Wno-extended-offsetof -miphoneos-version-min=4.2 -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.1.sdk/usr/include -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.1.sdk" CPP=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cpp AR=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar LDFLAGS="-arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.1.sdk -miphoneos-version-min=4.2";make clean;make
$ cp objs/.libs/libfreetype.a libfreetype-x86_64.a


armv7

armv7 используется в iPhone 3GS, iPhone 4, iPhone 4S. Добавляем параметры для кросс-компиляции.

$ ./configure --host=arm-apple-darwin --enable-static=yes --enable-shared=no CC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc CFLAGS="-arch armv7 -pipe -std=c99 -Wno-extended-offsetof -Wno-trigraphs -fpascal-strings -O2 -Wreturn-type -Wunused-variable -fmessage-length=0 -fvisibility=hidden -miphoneos-version-min=4.2 -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/usr/include -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk" AR=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar LDFLAGS="-arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk -miphoneos-version-min=4.2"
$ make clean;make
$ cp objs/.libs/libfreetype.a libfreetype-arm7.a


armv7s

armv7s используется в iPhone 5, iPhone 5S. Конфигурация отличается минимально.

$ ./configure --host=arm-apple-darwin --enable-static=yes --enable-shared=no CC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc CFLAGS="-arch armv7s -pipe -std=c99 -Wno-extended-offsetof -Wno-trigraphs -fpascal-strings -O2 -Wreturn-type -Wunused-variable -fmessage-length=0 -fvisibility=hidden -miphoneos-version-min=5.0 -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/usr/include -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk" AR=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar LDFLAGS="-arch armv7s -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk -miphoneos-version-min=5.0"
$ make clean;make
$ cp objs/.libs/libfreetype.a libfreetype-arm7s.a


arm64

arm64 — самая актуальная архитектура на момент написания заметки.

$ ./configure --host=arm-apple-darwin --enable-static=yes --enable-shared=no CC=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc CFLAGS="-arch arm64 -pipe -std=c99 -Wno-extended-offsetof -Wno-trigraphs -fpascal-strings -O2 -Wreturn-type -Wunused-variable -fmessage-length=0 -fvisibility=hidden -miphoneos-version-min=6.0 -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/usr/include -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk" AR=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar LDFLAGS="-arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk -miphoneos-version-min=6.0"
$ make clean;make
$ cp objs/.libs/libfreetype.a libfreetype-arm64.a


Важно

Не забудьте поменять iPhoneOS7.1.sdk на ту версию sdk, которая установлена у Вас сейчас. 7.1 — актуальная версия на момент написания заметки, но обновления выходят достаточно часто и, вполне вероятно, что к моменту прочтения Вами этой инструкции версия уже изменилась.

Сборка универсальной библиотеки

У нас есть 5 отдельных библиотек в корне.
Нам надо их собрать в одну универсальную библиотеку. Для этого используем инструмент lipo.

$ lipo -create -output libfreetype.a libfreetype-i386.a libfreetype-x86_64.a libfreetype-arm7.a libfreetype-arm7s.a libfreetype-arm64.a

Теперь там же в корне лежит долгожданная libfreetype.a, поддерживающая все нужные нам архитектуры.

Ну вот и все. Добавляйте полученную библиотеку в свой XCode проект и работайте с ней!
Удачи!
Tags:
Hubs:
+13
Comments 21
Comments Comments 21

Articles