Сборка FreeType2 под iOS

в 8:44, , рубрики: freetype, iOS, компиляция, разработка под iOS, метки: , ,

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

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

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

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

i386

$ ./configure CFLAGS="-arch i386"
$ make

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

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

x86_64

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

$ ./configure CFLAGS="-arch x86_64";make clean;make
$ cp objs/.libs/libfreetype.a libfreetype-x86_64.a

armv7

armv7 используется в iPhone 3GS, iPhone 4, iPhone 4S. Здесь нам придется использовать кросскомпиляцию и аргументов для сборки будет больше.

$ ./configure --prefix=/usr/local/iphone --host=arm-apple-darwin --enable-static=yes --enable-shared=no
CPPFLAGS="-arch armv7 -fpascal-strings -Os -fmessage-length=0 -fvisibility=hidden -miphoneos-version-min=4.3 -I/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/usr/include/libxml2 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk"
CC=`xcrun -sdk iphoneos -find clang`
CFLAGS="-arch armv7 -fpascal-strings -Os -fmessage-length=0 -fvisibility=hidden -miphoneos-version-min=4.3 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk"
LD=`xcrun -sdk iphoneos -find ld`
LDFLAGS="-arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk -miphoneos-version-min=4.3"
AR=`xcrun -sdk iphoneos -find ar`
$ make clean;make
$ cp objs/.libs/libfreetype.a libfreetype-armv7.a

armv7s

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

$ ./configure --prefix=/usr/local/iphone --host=arm-apple-darwin --enable-static=yes --enable-shared=no
CPPFLAGS="-arch armv7s -fpascal-strings -Os -fmessage-length=0 -fvisibility=hidden -miphoneos-version-min=4.3 -I/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/usr/include/libxml2 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk"
CC=`xcrun -sdk iphoneos -find clang`
CFLAGS="-arch armv7s -fpascal-strings -Os -fmessage-length=0 -fvisibility=hidden -miphoneos-version-min=4.3 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk"
LD=`xcrun -sdk iphoneos -find ld`
LDFLAGS="-arch armv7s -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk -miphoneos-version-min=4.3"
AR=`xcrun -sdk iphoneos -find ar`
$ make clean;make
$ cp objs/.libs/libfreetype.a libfreetype-armv7s.a

arm64

arm64 самая актуальная архитектура на момент написания заметки.
На данный момент мы еще не победили сборку под эту архитектуру. Заметка будет обновлена позже, когда ситуация изменится.
Впрочем, вы можете разрабатывать под современные iOS устройства используя сборку под архитектуру armv7/armv7s. arm64 обратно совместима с этими архитектурами.

Важно

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

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

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

$ lipo -create -output libfreetype.a libfreetype-i386.a libfreetype-x86_64.a libfreetype-armv7.a libfreetype-armv7s.a

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

Мы можем проверить, что все на месте используя команду lipo c аргументом -info

$ lipo -info libfreetype.a
Architectures in the fat file: libfreetype.a are: i386 x86_64 armv7 armv7s

Ну вот и все. Добавляйте полученную библиотеку в свой XCode проект и работайте с ней!
Удачи!

Автор: AllexIn

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js