Skip to content

Instantly share code, notes, and snippets.

@Wizermil
Last active April 10, 2019 16:57
Show Gist options
  • Save Wizermil/06389c13e9732e31a3652eb3b596c68c to your computer and use it in GitHub Desktop.
Save Wizermil/06389c13e9732e31a3652eb3b596c68c to your computer and use it in GitHub Desktop.
Script to compile harfbuzz + freetype static library for android
#!/bin/bash
FREETYPE_VERSION="2.10.0"
HARFBUZZ_VERSION="2.4.0"
ARCHS=("armv7" "arm64" "x86" "x86_64")
ROOT_DIR=$(pwd)
WORKER=$(getconf _NPROCESSORS_ONLN)
BUILD_DIR_FREETYPE2="build/android/freetype2"
BUILD_DIR_HARFBUZZ="build/android/harfbuzz"
if [[ -z "$NDK_ROOT" ]]; then
echo "set NDK_ROOT env variable"
exit 1
fi
export ANDROID_TOOLCHAIN="$NDK_ROOT/toolchains/llvm/prebuilt/darwin-x86_64"
export PATH="$ANDROID_TOOLCHAIN/bin:$PATH"
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/android/freetype2_harfbuzz"
fi
LOG_FILE="$ROOT_DIR/$BUILD_DIR_FREETYPE2/build.log"
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"
if [ ! -f "$BUILD_DIR_FREETYPE2/download/freetype-$FREETYPE_VERSION.tar.gz" ]; then
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"
fi
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"
case $ARCH in
armv7)
export HOST="arm-linux-androideabi"
export CC="armv7a-linux-androideabi16-clang"
export CXX="armv7a-linux-androideabi16-clang++"
export AR="arm-linux-androideabi-ar"
export AS="arm-linux-androideabi-as"
export LD="arm-linux-androideabi-ld"
export RANLIB="arm-linux-androideabi-ranlib"
export NM="arm-linux-androideabi-nm"
export STRIP="arm-linux-androideabi-strip"
export CFLAGS="--sysroot=$ANDROID_TOOLCHAIN/sysroot -Wl,--fix-cortex-a8 -fPIC -DANDROID -D__ANDROID_API__=16 -Os"
export CPPFLAGS="$CFLAGS"
export CXXFLAGS="$CFLAGS -fno-exceptions -fno-rtti"
export LDFLAGS="-Wl,--fix-cortex-a8"
;;
arm64)
export HOST="aarch64-linux-android"
export CC="aarch64-linux-android21-clang"
export CXX="aarch64-linux-android21-clang++"
export AR="aarch64-linux-android-ar"
export AS="aarch64-linux-android-as"
export LD="aarch64-linux-android-ld"
export RANLIB="aarch64-linux-android-ranlib"
export NM="aarch64-linux-android-nm"
export STRIP="aarch64-linux-android-strip"
export CFLAGS="--sysroot=$ANDROID_TOOLCHAIN/sysroot -fPIC -DANDROID -D__ANDROID_API__=21 -Os"
export CPPFLAGS="$CFLAGS"
export CXXFLAGS="$CFLAGS -fno-exceptions -fno-rtti"
export LDFLAGS=""
;;
x86)
export HOST="i686-linux-android"
export CC="i686-linux-android16-clang"
export CXX="i686-linux-android16-clang++"
export AR="i686-linux-android-ar"
export AS="i686-linux-android-as"
export LD="i686-linux-android-ld"
export RANLIB="i686-linux-android-ranlib"
export NM="i686-linux-android-nm"
export STRIP="i686-linux-android-strip"
export CFLAGS="--sysroot=$ANDROID_TOOLCHAIN/sysroot -fPIC -mtune=intel -mssse3 -mfpmath=sse -m32 -DANDROID -D__ANDROID_API__=16 -Os"
export CPPFLAGS="$CFLAGS"
export CXXFLAGS="$CFLAGS -fno-exceptions -fno-rtti"
export LDFLAGS=""
;;
x86_64)
export HOST="x86_64-linux-android"
export CC="x86_64-linux-android21-clang"
export CXX="x86_64-linux-android21-clang++"
export AR="x86_64-linux-android-ar"
export AS="x86_64-linux-android-as"
export LD="x86_64-linux-android-ld"
export RANLIB="x86_64-linux-android-ranlib"
export NM="x86_64-linux-android-nm"
export STRIP="x86_64-linux-android-strip"
export CFLAGS="--sysroot=$ANDROID_TOOLCHAIN/sysroot -fPIC -mtune=intel -mssse3 -mfpmath=sse -m64 -DANDROID -D__ANDROID_API__=21 -Os"
export CPPFLAGS="$CFLAGS"
export CXXFLAGS="$CFLAGS -fno-exceptions -fno-rtti"
export LDFLAGS=""
;;
esac
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/install/$ARCH/lib -lharfbuzz"
fi
cd "$ROOT_DIR/$BUILD_DIR_FREETYPE2/output/$ARCH" || exit 1
echo "Configuring: freetype $ARCH"
# --with-sysroot=\"${ANDROID_TOOLCHAIN}/sysroot\" \\
FREETYPE_CONFIGURE_CMD="./configure --host=\"$HOST\" \\
--prefix=$ROOT_DIR/$BUILD_DIR_FREETYPE2/install/$ARCH \\
--enable-static \\
--disable-shared \\
--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 echo "Error installation freetype $ARCH"
echo "Installed: freetype $ARCH"
done
}
build_freetype false
cd "$ROOT_DIR" || exit 1
LOG_FILE="$ROOT_DIR/$BUILD_DIR_HARFBUZZ/build.log"
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 " "
if [ ! -f "$BUILD_DIR_HARFBUZZ/download/harfbuzz-$HARFBUZZ_VERSION.tar.bz2" ]; then
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"
fi
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"
case $ARCH in
armv7)
export HOST="arm-linux-androideabi"
export CC="armv7a-linux-androideabi16-clang"
export CXX="armv7a-linux-androideabi16-clang++"
export AR="arm-linux-androideabi-ar"
export AS="arm-linux-androideabi-as"
export LD="arm-linux-androideabi-ld"
export RANLIB="arm-linux-androideabi-ranlib"
export NM="arm-linux-androideabi-nm"
export STRIP="arm-linux-androideabi-strip"
export CFLAGS="--sysroot=$ANDROID_TOOLCHAIN/sysroot -Wl,--fix-cortex-a8 -fPIC -DANDROID -D__ANDROID_API__=16 -Os"
export CPPFLAGS="$CFLAGS"
export CXXFLAGS="$CFLAGS -fno-exceptions -fno-rtti"
export LDFLAGS="-Wl,--fix-cortex-a8"
;;
arm64)
export HOST="aarch64-linux-android"
export CC="aarch64-linux-android21-clang"
export CXX="aarch64-linux-android21-clang++"
export AR="aarch64-linux-android-ar"
export AS="aarch64-linux-android-as"
export LD="aarch64-linux-android-ld"
export RANLIB="aarch64-linux-android-ranlib"
export NM="aarch64-linux-android-nm"
export STRIP="aarch64-linux-android-strip"
export CFLAGS="--sysroot=$ANDROID_TOOLCHAIN/sysroot -fPIC -DANDROID -D__ANDROID_API__=21 -Os"
export CPPFLAGS="$CFLAGS"
export CXXFLAGS="$CFLAGS -fno-exceptions -fno-rtti"
export LDFLAGS=""
;;
x86)
export HOST="i686-linux-android"
export CC="i686-linux-android16-clang"
export CXX="i686-linux-android16-clang++"
export AR="i686-linux-android-ar"
export AS="i686-linux-android-as"
export LD="i686-linux-android-ld"
export RANLIB="i686-linux-android-ranlib"
export NM="i686-linux-android-nm"
export STRIP="i686-linux-android-strip"
export CFLAGS="--sysroot=$ANDROID_TOOLCHAIN/sysroot -fPIC -mtune=intel -mssse3 -mfpmath=sse -m32 -DANDROID -D__ANDROID_API__=16 -Os"
export CPPFLAGS="$CFLAGS"
export CXXFLAGS="$CFLAGS -fno-exceptions -fno-rtti"
export LDFLAGS=""
;;
x86_64)
export HOST="x86_64-linux-android"
export CC="x86_64-linux-android21-clang"
export CXX="x86_64-linux-android21-clang++"
export AR="x86_64-linux-android-ar"
export AS="x86_64-linux-android-as"
export LD="x86_64-linux-android-ld"
export RANLIB="x86_64-linux-android-ranlib"
export NM="x86_64-linux-android-nm"
export STRIP="x86_64-linux-android-strip"
export CFLAGS="--sysroot=$ANDROID_TOOLCHAIN/sysroot -fPIC -mtune=intel -mssse3 -mfpmath=sse -m64 -DANDROID -D__ANDROID_API__=21 -Os"
export CPPFLAGS="$CFLAGS"
export CXXFLAGS="$CFLAGS -fno-exceptions -fno-rtti"
export LDFLAGS=""
;;
esac
export FREETYPE_CFLAGS="-I$ROOT_DIR/$BUILD_DIR_FREETYPE2/install/$ARCH/include/freetype2"
export FREETYPE_LIBS="-L$ROOT_DIR/$BUILD_DIR_FREETYPE2/install/$ARCH/lib -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
echo "Configuring: harfbuzz $ARCH"
# --with-sysroot="${ANDROID_TOOLCHAIN}/sysroot" \
./configure --host="$HOST" \
--prefix="$ROOT_DIR/$BUILD_DIR_HARFBUZZ/install/$ARCH" \
--enable-static \
--disable-shared \
--disable-dependency-tracking \
--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"
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
build_freetype true
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment