Hack/tools/scripts/install/ttfautohint-build.sh

235 lines
5.3 KiB
Bash

#!/bin/sh
# shellcheck disable=SC2103
# This script builds a stand-alone binary for the command line version of
# ttfautohint, downloading any necessary libraries.
#
# Version 2017-Nov-24.
# The MIT License (MIT)
# Copyright (c) 2018 Werner Lemberg
# Permission is hereby granted, free of charge, to any person obtaining a copy of
# this software and associated documentation files (the "Software"), to deal in
# the Software without restriction, including without limitation the rights to
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
# the Software, and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
# User configuration.
#
# The build directory.
BUILD="$HOME/ttfautohint-build"
# The library versions.
FREETYPE_VERSION="2.8"
HARFBUZZ_VERSION="1.5.0"
TTFAUTOHINT_VERSION="1.7"
# Necessary patches (lists of at most 10 URLs each separated by whitespace,
# to be applied in order).
FREETYPE_PATCHES="\
http://git.savannah.gnu.org/cgit/freetype/freetype2.git/patch/?id=c9a9cf59 \
http://git.savannah.gnu.org/cgit/freetype/freetype2.git/patch/?id=c8829e4b \
"
HARFBUZZ_PATCHES=""
TTFAUTOHINT_PATCHES=""
#
# Nothing to configure below this comment.
#
FREETYPE="freetype-$FREETYPE_VERSION"
HARFBUZZ="harfbuzz-$HARFBUZZ_VERSION"
TTFAUTOHINT="ttfautohint-$TTFAUTOHINT_VERSION"
if test -d "$BUILD" -o -f "$BUILD"; then
echo "Build directory \`$BUILD' must not exist."
exit 1
fi
INST="$BUILD/local"
mkdir "$BUILD"
mkdir "$INST"
cd "$BUILD" || exit 1
echo "#####"
echo "Download all necessary archives and patches."
echo "#####"
curl -L -O "http://download.savannah.gnu.org/releases/freetype/$FREETYPE.tar.gz"
curl -O "https://www.freedesktop.org/software/harfbuzz/release/$HARFBUZZ.tar.bz2"
curl -L -O "http://download.savannah.gnu.org/releases/freetype/$TTFAUTOHINT.tar.gz"
count=0
for i in $FREETYPE_PATCHES
do
curl -o ft-patch-$count.diff "$i"
count=$(($count + 1))
done
count=0
for i in $HARFBUZZ_PATCHES
do
curl -o hb-patch-$count.diff "$i"
count=$(($count + 1))
done
count=0
for i in $TTFAUTOHINT_PATCHES
do
curl -o ta-patch-$count.diff "$i"
count=$(($count + 1))
done
# Our environment variables.
TA_CPPFLAGS="-I$INST/include"
TA_CFLAGS="-g -O2"
TA_CXXFLAGS="-g -O2"
TA_LDFLAGS="-L$INST/lib -L$INST/lib64"
echo "#####"
echo "Extract archives."
echo "#####"
tar -xzvf "$FREETYPE.tar.gz"
tar -xjvf "$HARFBUZZ.tar.bz2"
tar -xzvf "$TTFAUTOHINT.tar.gz"
echo "#####"
echo "Apply patches."
echo "#####"
cd "$FREETYPE" || exit 1
for i in ../ft-patch-*.diff
do
test -f "$i" || continue
patch -p1 -N -r - < "$i"
done
cd ..
cd "$HARFBUZZ" || exit 1
for i in ../hb-patch-*.diff
do
test -f "$i" || continue
patch -p1 -N -r - < "$i"
done
cd ..
cd "$TTFAUTOHINT" || exit 1
for i in ../ta-patch-*.diff
do
test -f "$i" || continue
patch -p1 -N -r - < "$i"
done
cd ..
echo "#####"
echo "$FREETYPE"
echo "#####"
cd "$FREETYPE" || exit 1
# The space in `PKG_CONFIG' ensures that the created `freetype-config' file
# doesn't find a working pkg-config, falling back to the stored strings
# (which is what we want).
./configure \
--without-bzip2 \
--without-png \
--without-zlib \
--without-harfbuzz \
--prefix="$INST" \
--enable-static \
--disable-shared \
PKG_CONFIG=" " \
CFLAGS="$TA_CPPFLAGS $TA_CFLAGS" \
CXXFLAGS="$TA_CPPFLAGS $TA_CXXFLAGS" \
LDFLAGS="$TA_LDFLAGS"
make
make install
cd ..
echo "#####"
echo "$HARFBUZZ"
echo "#####"
cd "$HARFBUZZ" || exit 1
# Value `true' for `PKG_CONFIG' ensures that XXX_CFLAGS and XXX_LIBS
# get actually used.
./configure \
--disable-dependency-tracking \
--disable-gtk-doc-html \
--with-glib=no \
--with-cairo=no \
--with-fontconfig=no \
--with-icu=no \
--prefix="$INST" \
--enable-static \
--disable-shared \
CFLAGS="$TA_CPPFLAGS $TA_CFLAGS" \
CXXFLAGS="$TA_CPPFLAGS $TA_CXXFLAGS" \
LDFLAGS="$TA_LDFLAGS" \
PKG_CONFIG=true \
FREETYPE_CFLAGS="$TA_CPPFLAGS/freetype2" \
FREETYPE_LIBS="$TA_LDFLAGS -lfreetype"
make
make install
cd ..
echo "#####"
echo "$TTFAUTOHINT"
echo "#####"
cd "$TTFAUTOHINT" || exit 1
# Value `true' for `PKG_CONFIG' ensures that XXX_CFLAGS and XXX_LIBS
# get actually used.
./configure \
--disable-dependency-tracking \
--without-qt \
--without-doc \
--prefix="$INST" \
--enable-static \
--disable-shared \
--with-freetype-config="$INST/bin/freetype-config" \
CFLAGS="$TA_CPPFLAGS $TA_CFLAGS" \
CXXFLAGS="$TA_CPPFLAGS $TA_CXXFLAGS" \
LDFLAGS="$TA_LDFLAGS" \
PKG_CONFIG=true \
HARFBUZZ_CFLAGS="$TA_CPPFLAGS/harfbuzz" \
HARFBUZZ_LIBS="$TA_LDFLAGS -lharfbuzz"
make LDFLAGS="$TA_LDFLAGS -all-static"
make install-strip
cd ..
echo "#####"
echo "binary: $INST/bin/ttfautohint"
echo "#####"
# eof