blob: fe4d1695946fd65de04550327aec195c8a7e1ce5 [file] [log] [blame]
# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Distributed under the terms of the GNU General Public License v2
EAPI=5
DESCRIPTION="Chrome OS Fonts (meta package)"
HOMEPAGE="http://src.chromium.org"
LICENSE="GPL-2"
SLOT="0"
KEYWORDS="*"
IUSE="cros_host internal"
# List of font packages used in Chromium OS. This list is separate
# so that it can be shared between the host in
# chromeos-base/hard-host-depends and the target in
# chromeos-base/chromeos.
#
# The glibc requirement is a bit funky. For target boards, we make sure it is
# installed before any other package (by way of setup_board), but for the sdk
# board, we don't have that toolchain-specific tweak. So we end up installing
# these in parallel and the chroot logic for font generation fails. We can
# drop this when we stop executing the helper in the $ROOT via `chroot` and/or
# `qemu` (e.g. when we do `ROOT=/build/amd64-host/ emerge chromeos-fonts`).
#
# The gcc-libs requirement is a similar situation. Ultimately this comes down
# to fixing http://crbug.com/205424.
DEPEND="
internal? (
chromeos-base/monotype-fonts
chromeos-base/google-sans-fonts
)
media-fonts/croscorefonts
media-fonts/crosextrafonts
media-fonts/crosextrafonts-carlito
media-fonts/noto-cjk
media-fonts/notofonts
media-fonts/ko-nanumfonts
media-fonts/lohitfonts-cros
media-fonts/robotofonts
media-fonts/tibt-jomolhari
media-libs/fontconfig
!cros_host? ( sys-libs/gcc-libs )
cros_host? ( sys-libs/glibc )
"
RDEPEND="${DEPEND}"
S=${WORKDIR}
qemu_run() {
# Run the emulator to execute command. It needs to be copied
# temporarily into the sysroot because we chroot to it.
local qemu=()
case "${ARCH}" in
amd64)
# Note that qemu is not actually run below in this case.
qemu=( qemu-x86_64 -cpu max )
;;
arm)
qemu=( qemu-arm )
;;
arm64)
qemu=( qemu-aarch64 )
;;
mips)
qemu=( qemu-mipsel )
;;
x86)
qemu=( qemu-i386 -cpu max )
;;
*)
die "Unable to determine QEMU from ARCH."
esac
# The following code uses sudo to generate the font-cache. It is almost
# always not a good idea to use sudo in your ebuild. This ebuild is an
# exception for the following reasons:
#
# - fc-cache was designed with the generic linux distribution use case
# in mind where package maintainers have no idea what fonts are actually
# installed on the system. As a result fc-cache operates directly on
# the target file system and needs permission to modify its cache
# directory (/usr/share/cache/fontconfig), which is owned by root.
# - When cross-compiling, the generated font caches need to be compatible
# with the architecture on which they will be used. To properly do
# this, we need to run the architecture appropriate copy of fc-cache,
# which may link against other arch-specific libraries, which means
# we need to chroot it in the board sysroot and chrooting requires
# root permissions.
#
# By themselves the above two reasons are not sufficient to justify
# using sudo in the ebuild. What makes this OK is that fc-cache takes
# a really long time when run under qemu for ARM (4 - 7 minutes), which
# is a very large percentage of the overall time spent in build_image.
# It doesn't make sense to force each developer to spend a bunch of time
# generating the exact same font cache on their machine every time they
# want to build an image. And even then, we can only do this because
# chromeos-fonts is a specialized ebuild for chrome os only.
#
# All of which is to say: don't use sudo in your ebuild. You have been
# warned. -- chirantan
cp "/usr/bin/${qemu[0]}" "${ROOT}/tmp" || die
sudo chroot "${ROOT}" "/tmp/${qemu[0]}" "${qemu[@]:1}" "$@" || die
rm "${ROOT}/tmp/${qemu[0]}" || die
}
generate_font_cache() {
# Bind mount over the cache directory so that we don't scribble over the
# $SYSROOT. Same warning as above applies: don't use sudo in your ebuild.
mkdir -p "${WORKDIR}/out"
sudo mount --bind "${WORKDIR}/out" "${ROOT}/usr/share/cache/fontconfig"
# If we're running directly on the target (e.g. gmerge), we don't need to
# chroot or use qemu.
if [[ "${ROOT:-/}" == "/" ]]; then
sudo /usr/bin/fc-cache -f -v || die
elif [[ "${ARCH}" == "amd64" ]]; then
# Uses the host's fc-cache binary to build the font cache on the target
sudo /usr/bin/fc-cache --sysroot="${SYSROOT}" -f -v
else
qemu_run /usr/bin/fc-cache -f -v
fi
sudo umount "${ROOT}/usr/share/cache/fontconfig"
}
# TODO(cjmcdonald): crbug/913317 These .uuid files need to exist when fc-cache
# is run otherwise fontconfig tries to write them to the font
# directories and generates portage sandbox violations.
# Additionally, the .uuid files need to be installed as part
# of this package so that they exist when this package is
# installed as a binpkg. Remove this section once fontconfig
# no longer uses these .uuid files.
pkg_setup() {
local fontdir fontdirs=( $(cd "${SYSROOT}"/usr/share/fonts; echo */) )
for fontdir in "${fontdirs[@]}"; do
uuidgen --sha1 -n @dns -N "$(usev cros_host)${fontdir}" > \
"${SYSROOT}"/usr/share/fonts/"${fontdir}"/.uuid
done
}
src_compile() {
generate_font_cache
}
src_install() {
insinto /usr/share/cache/fontconfig
doins "${WORKDIR}"/out/*
local fontdir fontdirs=( $(cd "${SYSROOT}"/usr/share/fonts; echo */) )
for fontdir in "${fontdirs[@]}"; do
insinto "/usr/share/fonts/${fontdir}"
uuidgen --sha1 -n @dns -N "$(usev cros_host)${fontdir}" | newins - .uuid
done
}