Created
April 9, 2019 16:44
-
-
Save Wizermil/8e02922f3c09f774560c8d3180ac705a to your computer and use it in GitHub Desktop.
Script to compile harfbuzz + freetype static library for iOS
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
FREETYPE_VERSION="2.10.0" | |
HARFBUZZ_VERSION="2.4.0" | |
ARCHS=("i386" "armv7" "armv7s" "arm64" "arm64e" "x86_64") | |
SDK_VERSION="12.2" | |
ROOT_DIR=$(pwd) | |
WORKER=$(getconf _NPROCESSORS_ONLN) | |
BUILD_DIR_FREETYPE2="build/ios/freetype2" | |
BUILD_DIR_HARFBUZZ="build/ios/harfbuzz" | |
error() { | |
echo -e "$@" 1>&2 | |
} | |
fail() { | |
error "$@" | |
exit 1 | |
} | |
function build_freetype() { | |
HAS_HARFBUZZ=$1 | |
cd "$ROOT_DIR" || exit 1 | |
if $HAS_HARFBUZZ; then | |
echo " " | |
BUILD_DIR_FREETYPE2="build/ios/freetype2_harfbuzz" | |
fi | |
LOG_FILE="$ROOT_DIR/$BUILD_DIR_FREETYPE2/build.log" | |
if [ -d "$BUILD_DIR_FREETYPE2/download" ]; then | |
rm -rf "$BUILD_DIR_FREETYPE2/download" | |
fi | |
if [ -d "$BUILD_DIR_FREETYPE2/source" ]; then | |
rm -rf "$BUILD_DIR_FREETYPE2/source" | |
fi | |
if [ -f "$LOG_FILE" ]; then | |
rm "$LOG_FILE" | |
touch "$LOG_FILE" | |
fi | |
mkdir -p "$BUILD_DIR_FREETYPE2/download" | |
mkdir -p "$BUILD_DIR_FREETYPE2/source" | |
echo "Downloading: freetype" | |
curl -Lo "$BUILD_DIR_FREETYPE2/download/freetype-$FREETYPE_VERSION.tar.gz" "http://download.savannah.gnu.org/releases/freetype/freetype-$FREETYPE_VERSION.tar.gz" >> "$LOG_FILE" 2>&1 || fail "Error download freetype" | |
echo "Downloaded: freetype" | |
echo "Uncompressing: freetype" | |
tar zxf "$BUILD_DIR_FREETYPE2/download/freetype-$FREETYPE_VERSION.tar.gz" -C "$BUILD_DIR_FREETYPE2/source" >> "$LOG_FILE" 2>&1 || fail "Error uncompress freetype" | |
echo "Uncompressed: freetype" | |
for ARCH in "${ARCHS[@]}"; do | |
echo " " | |
cd "$ROOT_DIR" || exit 1 | |
if [ -d "$BUILD_DIR_FREETYPE2/output/$ARCH" ]; then | |
rm -rf "$BUILD_DIR_FREETYPE2/output/$ARCH" | |
fi | |
mkdir -p "$BUILD_DIR_FREETYPE2/output/$ARCH" | |
cp -R "$BUILD_DIR_FREETYPE2/source/freetype-$FREETYPE_VERSION/" "$BUILD_DIR_FREETYPE2/output/$ARCH" | |
if [ -d "$BUILD_DIR_FREETYPE2/install/$ARCH" ]; then | |
rm -rf "$BUILD_DIR_FREETYPE2/install/$ARCH" | |
fi | |
mkdir -p "$BUILD_DIR_FREETYPE2/install/$ARCH" | |
if [ "$ARCH" = "i386" ] || [ "$ARCH" = "x86_64" ]; then | |
PLATFORM="iPhoneSimulator" | |
MIN_VERSION="-mios-simulator-version-min" | |
else | |
PLATFORM="iPhoneOS" | |
MIN_VERSION="-mios-version-min" | |
fi | |
BUILD_SDKROOT="/Applications/Xcode.app/Contents/Developer/Platforms/$PLATFORM.platform/Developer/SDKs/${PLATFORM}${SDK_VERSION}.sdk" | |
export LDFLAGS="-arch $ARCH -pipe -isysroot $BUILD_SDKROOT $MIN_VERSION=10.0 -Os" | |
export CFLAGS="-arch $ARCH -pipe -isysroot $BUILD_SDKROOT -fembed-bitcode $MIN_VERSION=10.0 -Os" | |
export CPPFLAGS="$CFLAGS" | |
export CXXFLAGS="$CFLAGS -fno-exceptions -fno-rtti" | |
export CC="clang" | |
export CPP="clang -E" | |
export CXX="clang++" | |
if $HAS_HARFBUZZ; then | |
export HARFBUZZ_CFLAGS="-I$ROOT_DIR/$BUILD_DIR_HARFBUZZ/install/$ARCH/include/harfbuzz" | |
export HARFBUZZ_LIBS="-L$ROOT_DIR/$BUILD_DIR_HARFBUZZ -lharfbuzz" | |
fi | |
cd "$ROOT_DIR/$BUILD_DIR_FREETYPE2/output/$ARCH" || exit 1 | |
if [ -d "$BUILD_DIR_FREETYPE2/download" ]; then | |
rm -rf "$BUILD_DIR_FREETYPE2/download" | |
fi | |
if [ "$ARCH" == "arm64" ] || [ "$ARCH" == "arm64e" ]; then | |
HOST="aarch64" | |
else | |
HOST="${ARCH}" | |
fi | |
echo "Configuring: freetype $ARCH" | |
FREETYPE_CONFIGURE_CMD="./configure --host=$HOST-apple-darwin \\ | |
--prefix=$ROOT_DIR/$BUILD_DIR_FREETYPE2/install/$ARCH \\ | |
--enable-static \\ | |
--disable-shared \\ | |
--with-sysroot=$BUILD_SDKROOT \\ | |
--without-zlib \\ | |
--without-png \\ | |
--without-bzip2" | |
if $HAS_HARFBUZZ; then | |
FREETYPE_CONFIGURE_CMD="$FREETYPE_CONFIGURE_CMD --with-harfbuzz=yes" | |
else | |
FREETYPE_CONFIGURE_CMD="$FREETYPE_CONFIGURE_CMD --without-harfbuzz" | |
fi | |
eval "$FREETYPE_CONFIGURE_CMD" >> "$LOG_FILE" 2>&1 || fail "Error configuration freetype $ARCH" | |
echo "Configured: freetype $ARCH" | |
echo "Compiling: freetype $ARCH" | |
make -j "$WORKER" >> "$LOG_FILE" 2>&1 || fail "Error compilation freetype $ARCH" | |
echo "Compiled: freetype $ARCH" | |
echo "Installing: freetype $ARCH" | |
make install >> "$LOG_FILE" 2>&1 || fail "Error installation freetype $ARCH" | |
echo "Installed: freetype $ARCH" | |
done | |
cd "$ROOT_DIR/$BUILD_DIR_FREETYPE2" || exit 1 | |
if [ -f "libfreetype.a" ]; then | |
rm -f "libfreetype.a" | |
fi | |
echo " " | |
echo "Creating Flat Lib: freetype" | |
LIPO_CMD="lipo -create" | |
for ARCH in "${ARCHS[@]}"; do | |
if [ -f "$ROOT_DIR/$BUILD_DIR_FREETYPE2/install/$ARCH/lib/libfreetype.a" ]; then | |
LIPO_CMD="$LIPO_CMD $ROOT_DIR/$BUILD_DIR_FREETYPE2/install/$ARCH/lib/libfreetype.a" | |
fi | |
done | |
LIPO_CMD="$LIPO_CMD -output libfreetype.a" | |
eval "$LIPO_CMD" >> "$LOG_FILE" 2>&1 || fail "Error creation flat freetype" | |
echo "Created Flat Lib: freetype" | |
} | |
build_freetype false | |
cd "$ROOT_DIR" || exit 1 | |
LOG_FILE="$ROOT_DIR/$BUILD_DIR_HARFBUZZ/build.log" | |
if [ -d "$BUILD_DIR_HARFBUZZ/download" ]; then | |
rm -rf "$BUILD_DIR_HARFBUZZ/download" | |
fi | |
if [ -d "$BUILD_DIR_HARFBUZZ/source" ]; then | |
rm -rf "$BUILD_DIR_HARFBUZZ/source" | |
fi | |
if [ -f "$LOG_FILE" ]; then | |
rm "$LOG_FILE" | |
touch "$LOG_FILE" | |
fi | |
mkdir -p "$BUILD_DIR_HARFBUZZ/download" | |
mkdir -p "$BUILD_DIR_HARFBUZZ/source" | |
echo " " | |
echo "Downloading: harfbuzz" | |
curl -Lo "$BUILD_DIR_HARFBUZZ/download/harfbuzz-$HARFBUZZ_VERSION.tar.bz2" "https://github.com/harfbuzz/harfbuzz/releases/download/$HARFBUZZ_VERSION/harfbuzz-$HARFBUZZ_VERSION.tar.bz2" >> "$LOG_FILE" 2>&1 || fail "Error download harfbuzz" | |
echo "Downloaded: harfbuzz" | |
echo "Uncompressing: harfbuzz" | |
tar jxf "$BUILD_DIR_HARFBUZZ/download/harfbuzz-$HARFBUZZ_VERSION.tar.bz2" -C "$BUILD_DIR_HARFBUZZ/source" >> "$LOG_FILE" 2>&1 || fail "Error uncompress harfbuzz" | |
echo "Uncompressed: harfbuzz" | |
for ARCH in "${ARCHS[@]}"; do | |
echo " " | |
cd "$ROOT_DIR" || exit 1 | |
if [ -d "$BUILD_DIR_HARFBUZZ/output/$ARCH" ]; then | |
rm -rf "$BUILD_DIR_HARFBUZZ/output/$ARCH" | |
fi | |
mkdir -p "$BUILD_DIR_HARFBUZZ/output/$ARCH" | |
cp -R "$BUILD_DIR_HARFBUZZ/source/harfbuzz-$HARFBUZZ_VERSION/" "$BUILD_DIR_HARFBUZZ/output/$ARCH" || exit 1 | |
if [ -d "$BUILD_DIR_HARFBUZZ/install/$ARCH" ]; then | |
rm -rf "$BUILD_DIR_HARFBUZZ/install/$ARCH" | |
fi | |
mkdir -p "$BUILD_DIR_HARFBUZZ/install/$ARCH" | |
if [ "$ARCH" = "i386" ] || [ "$ARCH" = "x86_64" ]; then | |
PLATFORM="iPhoneSimulator" | |
MIN_VERSION="-mios-simulator-version-min" | |
else | |
PLATFORM="iPhoneOS" | |
MIN_VERSION="-mios-version-min" | |
fi | |
BUILD_SDKROOT="/Applications/Xcode.app/Contents/Developer/Platforms/$PLATFORM.platform/Developer/SDKs/${PLATFORM}${SDK_VERSION}.sdk" | |
export LDFLAGS="-arch $ARCH -pipe -isysroot $BUILD_SDKROOT $MIN_VERSION=10.0 -Os" | |
export CFLAGS="-arch $ARCH -pipe -isysroot $BUILD_SDKROOT $MIN_VERSION=10.0 -fembed-bitcode -Os" | |
export CPPFLAGS="$CFLAGS" | |
export CXXFLAGS="$CFLAGS -fno-exceptions -fno-rtti" | |
export CC="clang" | |
export CPP="clang -E" | |
export CXX="clang++" | |
export FREETYPE_CFLAGS="-I$ROOT_DIR/$BUILD_DIR_FREETYPE2/install/$ARCH/include/freetype2" | |
export FREETYPE_LIBS="-L$ROOT_DIR/$BUILD_DIR_FREETYPE2 -lfreetype" | |
cd "$ROOT_DIR/$BUILD_DIR_HARFBUZZ/output/$ARCH" || exit 1 | |
if [ -d "$BUILD_DIR_HARFBUZZ/download" ]; then | |
rm -rf "$BUILD_DIR_HARFBUZZ/download" | |
fi | |
if [ "$ARCH" == "arm64" ] || [ "$ARCH" == "arm64e" ]; then | |
HOST="aarch64" | |
else | |
HOST="${ARCH}" | |
fi | |
echo "Configuring: harfbuzz $ARCH" | |
./configure --host="$HOST-apple-darwin" \ | |
--prefix="$ROOT_DIR/$BUILD_DIR_HARFBUZZ/install/$ARCH" \ | |
--enable-static \ | |
--disable-shared \ | |
--with-sysroot=$BUILD_SDKROOT \ | |
--disable-gtk-doc-html \ | |
--enable-introspection \ | |
--without-fontconfig \ | |
--without-glib \ | |
--without-gobject \ | |
--without-icu \ | |
--without-cairo \ | |
--with-ucdn=yes \ | |
--with-freetype=yes >> "$LOG_FILE" 2>&1 || fail "Error configuration harfbuzz $ARCH" | |
sed -i '' -e "s!\$wl-bind_at_load!!g" "ltmain.sh" | |
sed -i '' -e "s!\$wl-bind_at_load!!g" "libtool" | |
echo "Configured: harfbuzz $ARCH" | |
echo "Compiling: harfbuzz $ARCH" | |
make -j "$WORKER" >> "$LOG_FILE" 2>&1 || fail "Error compilation harfbuzz $ARCH" | |
echo "Compiled: harfbuzz $ARCH" | |
echo "Installing: harfbuzz $ARCH" | |
make install >> "$LOG_FILE" 2>&1 || fail "Error installation harfbuzz $ARCH" | |
echo "Installed: harfbuzz $ARCH" | |
done | |
cd "$ROOT_DIR/$BUILD_DIR_HARFBUZZ" || exit 1 | |
if [ -f "libharfbuzz.a" ]; then | |
rm -f "libharfbuzz.a" | |
fi | |
echo " " | |
echo "Creating Flat Lib: harfbuzz" | |
LIPO_CMD="lipo -create" | |
for ARCH in "${ARCHS[@]}"; do | |
if [ -f "$ROOT_DIR/$BUILD_DIR_HARFBUZZ/install/$ARCH/lib/libharfbuzz.a" ]; then | |
LIPO_CMD="$LIPO_CMD $ROOT_DIR/$BUILD_DIR_HARFBUZZ/install/$ARCH/lib/libharfbuzz.a" | |
fi | |
done | |
LIPO_CMD="$LIPO_CMD -output libharfbuzz.a" | |
eval "$LIPO_CMD" >> "$LOG_FILE" 2>&1 || fail "Error creation flat harfbuzz" | |
echo "Created Flat Lib: harfbuzz" | |
build_freetype true |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment