| # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| EAPI=6 |
| |
| 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} |
| |
| # Don't 'die' in here, because our callers want to catch errors. |
| 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 ) |
| ;; |
| *) |
| eerror "Unable to determine QEMU from ARCH." |
| return 1 |
| 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 |
| |
| local chroot_dir="${WORKDIR#${SYSROOT}}" |
| if ! cp "/usr/bin/${qemu[0]}" "${WORKDIR}"; then |
| eerror "Failed to copy /usr/bin/${qemu[0]} -> ${WORKDIR}" |
| return 1 |
| fi |
| if ! sudo chroot "${SYSROOT}" "${chroot_dir}/${qemu[0]}" "${qemu[@]:1}" "$@"; then |
| eerror "Failed to run QEMU (args $*)" |
| return 1 |
| fi |
| if ! rm "${WORKDIR}/${qemu[0]}"; then |
| eerror "Failed to clean up QEMU" |
| return 1 |
| fi |
| } |
| |
| 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" |
| if grep -q "${SYSROOT%/}/usr/share/cache/fontconfig" /proc/mounts; then |
| sudo umount "${SYSROOT}/usr/share/cache/fontconfig" || die |
| fi |
| sudo mount --bind "${WORKDIR}/out" "${SYSROOT}/usr/share/cache/fontconfig" || die |
| |
| # If we're running directly on the target (e.g. gmerge), we don't need |
| # to chroot or use qemu. Don't 'die' on errors so we can clean up the |
| # bind mount even if fc-cache fails. |
| if [[ "${SYSROOT:-/}" == "/" ]]; then |
| sudo /usr/bin/fc-cache -f -v |
| 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 |
| local retval=$? |
| |
| sudo umount "${SYSROOT}/usr/share/cache/fontconfig" || die |
| [[ ${retval} == 0 ]] || die "fc-cache failed" |
| } |
| |
| # 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 |
| } |