| # Copyright 1999-2023 Gentoo Authors |
| # Distributed under the terms of the GNU General Public License v2 |
| # |
| # Chromium note: the Gentoo version of this eclass performs additional fc-cache |
| # logic in pkg_postinst()/pkg_postrm(), to generate/clean cache files |
| # respectively. We don't want to leave these cache files un-owned by packages, |
| # and instead generate those caches in the chromeos-base/chromeos-fonts ebuild. |
| # See also b/187790181. |
| |
| # @ECLASS: font.eclass |
| # @MAINTAINER: |
| # fonts@gentoo.org |
| # @SUPPORTED_EAPIS: 7 8 |
| # @BLURB: Eclass to make font installation uniform |
| |
| case ${EAPI} in |
| 7|8) ;; |
| *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;; |
| esac |
| |
| if [[ -z ${_FONT_ECLASS} ]]; then |
| _FONT_ECLASS=1 |
| |
| # @ECLASS_VARIABLE: FONT_SUFFIX |
| # @DEFAULT_UNSET |
| # @REQUIRED |
| # @DESCRIPTION: |
| # Space delimited list of font suffixes to install. |
| FONT_SUFFIX=${FONT_SUFFIX:-} |
| |
| # @ECLASS_VARIABLE: FONT_S |
| # @DEFAULT_UNSET |
| # @DESCRIPTION: |
| # Directory containing the fonts. If unset, ${S} is used instead. |
| # Can also be an array of several directories. |
| |
| # @ECLASS_VARIABLE: FONT_PN |
| # @DESCRIPTION: |
| # Font name (ie. last part of FONTDIR). |
| FONT_PN=${FONT_PN:-${PN}} |
| |
| # @ECLASS_VARIABLE: FONTDIR |
| # @DESCRIPTION: |
| # Full path to installation directory. |
| FONTDIR=${FONTDIR:-/usr/share/fonts/${FONT_PN}} |
| |
| # @ECLASS_VARIABLE: FONT_CONF |
| # @DEFAULT_UNSET |
| # @DESCRIPTION: |
| # Array containing fontconfig conf files to install. |
| FONT_CONF=( "" ) |
| |
| # @ECLASS_VARIABLE: FONT_OPENTYPE_COMPAT |
| # @DEFAULT_UNSET |
| # @DESCRIPTION: |
| # Determines whether detected BDF and PCF font files should be converted |
| # to an SFNT wrapper, for use with newer Pango. |
| |
| if [[ ${CATEGORY}/${PN} != media-fonts/encodings ]]; then |
| IUSE="X" |
| BDEPEND="X? ( |
| >=x11-apps/mkfontscale-1.2.0 |
| media-fonts/encodings |
| )" |
| fi |
| |
| if [[ -n ${FONT_OPENTYPE_COMPAT} ]] ; then |
| IUSE+=" +opentype-compat" |
| BDEPEND+=" opentype-compat? ( x11-apps/fonttosfnt )" |
| fi |
| |
| # @FUNCTION: font_wrap_opentype_compat |
| # @DESCRIPTION: |
| # Converts .bdf and .pcf fonts detected within ${ED} to the OTB wrapper format |
| # using x11-apps/fonttosfnt. Handles optional .gz extension. |
| font_wrap_opentype_compat() { |
| local file tmpfile |
| |
| while IFS= read -rd '' file; do |
| if [[ ${file} == *.gz ]] ; then |
| tmpfile=${file%.*} |
| |
| gzip -cd -- "${file}" > "${tmpfile}" \ |
| && fonttosfnt -v -o "${file%.*}.otb" -- "${tmpfile}" \ |
| && rm -- "${tmpfile}" |
| else |
| fonttosfnt -v -o "${file%.*}.otb" -- "${file}" |
| fi || ! break |
| done < <(find "${ED}" \( -name '*.bdf' -o -name '*.bdf.gz' -o -name '*.pcf' -o -name '*.pcf.gz' \) -type f ! -type l -print0) || die |
| } |
| |
| # @FUNCTION: font_xfont_config |
| # @DESCRIPTION: |
| # Generate Xorg font files (mkfontscale/mkfontdir). |
| font_xfont_config() { |
| local dir_name |
| if in_iuse X && use X ; then |
| dir_name="${1:-${FONT_PN}}" |
| rm -f "${ED}${FONTDIR}/${1//${S}/}"/{fonts.{dir,scale},encodings.dir} \ |
| || die "failed to prepare ${FONTDIR}/${1//${S}/}" |
| einfo "Creating fonts.scale & fonts.dir in ${dir_name##*/}" |
| mkfontscale "${ED}${FONTDIR}/${1//${S}/}" || eerror "failed to create fonts.scale" |
| mkfontdir \ |
| -e "${EPREFIX}"/usr/share/fonts/encodings \ |
| -e "${EPREFIX}"/usr/share/fonts/encodings/large \ |
| "${ED}${FONTDIR}/${1//${S}/}" || eerror "failed to create fonts.dir" |
| [[ -e fonts.alias ]] && doins fonts.alias |
| fi |
| } |
| |
| # @FUNCTION: font_fontconfig |
| # @DESCRIPTION: |
| # Install fontconfig conf files given in FONT_CONF. |
| font_fontconfig() { |
| local conffile |
| if [[ -n ${FONT_CONF[@]} ]]; then |
| insinto /etc/fonts/conf.avail/ |
| for conffile in "${FONT_CONF[@]}"; do |
| [[ -e ${conffile} ]] && doins "${conffile}" |
| done |
| fi |
| } |
| |
| # @FUNCTION: font_cleanup_dirs |
| # @DESCRIPTION: |
| # Remove font directories containing only generated files. |
| font_cleanup_dirs() { |
| local genfiles="encodings.dir fonts.alias fonts.cache-1 fonts.dir fonts.scale" |
| # fonts.alias isn't generated but it's a special case (see below). |
| local d f g generated candidate otherfile |
| |
| ebegin "Cleaning up font directories" |
| while read -d $'\0' -r; do |
| candidate=false |
| otherfile=false |
| for f in "${d}"/*; do |
| generated=false |
| # make sure this is a file and not a subdir |
| [[ -e ${f} || -L ${f} ]] || continue |
| if has ${f##*/} ${genfiles}; then |
| # this is a generated file |
| generated=true |
| break |
| fi |
| # if the file is a generated file then we know this is a font dir (as |
| # opposed to something like encodings or util) and a candidate for |
| # removal. if it's not generated then it's an "otherfile". |
| ${generated} && candidate=true || otherfile=true |
| # if the directory is both a candidate for removal and contains at |
| # least one "otherfile" then don't remove it. |
| [[ ${candidate} == ${otherfile} ]] && break |
| done |
| # if in the end we only have generated files, purge the directory. |
| if [[ ${candidate} == true && ${otherfile} == false ]]; then |
| # we don't want to remove fonts.alias files that were installed by |
| # media-fonts/font-alias. any other fonts.alias files will have |
| # already been unmerged with their packages. |
| for g in ${genfiles}; do |
| if [[ ${g} != fonts.alias && ( -e ${d}/${g} || -L ${d}/${g} ) ]] ; then |
| rm "${d}"/${g} || eerror "failed to remove ${d}/${g}" |
| fi |
| done |
| # if there's nothing left remove the directory |
| find "${d}" -maxdepth 0 -type d -empty -delete || eerror "failed to purge ${d}" |
| fi |
| done < <(find -L "${EROOT}"/usr/share/fonts/ -type d -print0) |
| eend 0 |
| } |
| |
| # @FUNCTION: font_pkg_setup |
| # @DESCRIPTION: |
| # The font pkg_setup function. |
| # Collision protection |
| font_pkg_setup() { |
| # make sure we get no collisions |
| # setup is not the nicest place, but preinst doesn't cut it |
| if [[ -e "${EROOT}${FONTDIR}/fonts.cache-1" ]] ; then |
| rm "${EROOT}${FONTDIR}/fonts.cache-1" || die "failed to remove fonts.cache-1" |
| fi |
| } |
| |
| # @FUNCTION: font_src_install |
| # @DESCRIPTION: |
| # The font src_install function. |
| font_src_install() { |
| local dir suffix commondoc |
| |
| if [[ -n ${FONT_OPENTYPE_COMPAT} ]] && in_iuse opentype-compat && use opentype-compat ; then |
| font_wrap_opentype_compat |
| fi |
| |
| if [[ $(declare -p FONT_S 2>/dev/null) == "declare -a"* ]]; then |
| # recreate the directory structure if FONT_S is an array |
| for dir in "${FONT_S[@]}"; do |
| pushd "${dir}" > /dev/null || die "pushd ${dir} failed" |
| insinto "${FONTDIR}/${dir#"${S}"}" |
| for suffix in ${FONT_SUFFIX}; do |
| doins *.${suffix} |
| done |
| font_xfont_config "${dir}" |
| popd > /dev/null || die |
| done |
| else |
| pushd "${FONT_S:-${S}}" > /dev/null \ |
| || die "pushd ${FONT_S:-${S}} failed" |
| insinto "${FONTDIR}" |
| for suffix in ${FONT_SUFFIX}; do |
| doins *.${suffix} |
| done |
| font_xfont_config |
| popd > /dev/null || die |
| fi |
| |
| font_fontconfig |
| |
| einstalldocs |
| |
| # install common docs |
| for commondoc in COPYRIGHT FONTLOG.txt; do |
| [[ -s ${commondoc} ]] && dodoc ${commondoc} |
| done |
| } |
| |
| # @FUNCTION: font_pkg_postinst |
| # @DESCRIPTION: |
| # The font pkg_postinst function. |
| # We've stubbed this out (see Chromium notes above) but leave its identifier, |
| # so portage-stable ebuilds can still refer to it. |
| font_pkg_postinst() { |
| : |
| } |
| |
| # @FUNCTION: font_pkg_postrm |
| # @DESCRIPTION: |
| # The font pkg_postrm function. |
| font_pkg_postrm() { |
| font_cleanup_dirs |
| } |
| |
| fi |
| |
| EXPORT_FUNCTIONS pkg_setup src_install pkg_postinst pkg_postrm |