Skip to content

Instantly share code, notes, and snippets.

@Wizermil
Created April 9, 2019 16:44
Show Gist options
  • Save Wizermil/8e02922f3c09f774560c8d3180ac705a to your computer and use it in GitHub Desktop.
Save Wizermil/8e02922f3c09f774560c8d3180ac705a to your computer and use it in GitHub Desktop.
Script to compile harfbuzz + freetype static library for iOS
#!/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