On Tue, 2019-04-09 at 21:41 +0200, Andreas Sturmlechner wrote: > On Sonntag, 24. März 2019 19:41:24 CEST Michał Górny wrote: > > -U9999, please. This is a huge eclass and probably requires more work > > than you're showing us ;-). > > As requested, without any changes to v2 - and if this does not receive > a reply I'll assume silent ack by fonts proj. > > > --- a/eclass/font.eclass 2019-04-04 08:28:12.336171811 +0200 > +++ b/eclass/font.eclass 2019-03-25 20:34:15.306062926 +0100 > @@ -1,254 +1,257 @@ > -# Copyright 1999-2015 Gentoo Foundation > +# Copyright 1999-2019 Gentoo Foundation > # Distributed under the terms of the GNU General Public License v2 > > # @ECLASS: font.eclass > # @MAINTAINER: > # fonts@gentoo.org > # @BLURB: Eclass to make font installation uniform > > case ${EAPI:-0} in > - 0|1|2|3|4|5|6) ;; > - *) die "EAPI ${EAPI} is not supported by font.eclass." ;; > + 0|1|2|3|4|5|6) inherit eutils ;; > + 7) ;; > + *) die "EAPI ${EAPI} is not supported by font.eclass." ;; > esac > > -inherit eutils > - > EXPORT_FUNCTIONS pkg_setup src_install pkg_postinst pkg_postrm > > # @ECLASS-VARIABLE: FONT_SUFFIX > # @DEFAULT_UNSET > # @REQUIRED > # @DESCRIPTION: > # Space delimited list of font suffixes to install. > FONT_SUFFIX=${FONT_SUFFIX:-} > > # @ECLASS-VARIABLE: FONT_S > # @REQUIRED > # @DESCRIPTION: > # Space delimited list of directories containing the fonts. > FONT_S=${FONT_S:-${S}} > > # @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: DOCS > # @DEFAULT_UNSET > # @DESCRIPTION: > # Space delimited list of docs to install. > # We always install these: > # COPYRIGHT README{,.txt} NEWS AUTHORS BUGS ChangeLog FONTLOG.txt > DOCS=${DOCS:-} > > IUSE="X" > > DEPEND="X? ( > || ( >=x11-apps/mkfontscale-1.2.0 x11-apps/mkfontdir ) > media-fonts/encodings > )" > RDEPEND="" > > # @FUNCTION: font_xfont_config > # @DESCRIPTION: > # Generate Xorg font files (mkfontscale/mkfontdir). > font_xfont_config() { > local dir_name > if has X ${IUSE//+} && use X ; then Looks like in_iuse candidate. > dir_name="${1:-${FONT_PN}}" > + rm -f "${ED%/}/${FONTDIR}/${1//${S}/}"/{fonts.{dir,scale},encodings.dir} \ > + || die "failed to prepare ${FONTDIR}/${1//${S}/}" > ebegin "Creating fonts.scale & fonts.dir in ${dir_name##*/}" > - rm -f "${ED}${FONTDIR}/${1//${S}/}"/{fonts.{dir,scale},encodings.dir} > - mkfontscale "${ED}${FONTDIR}/${1//${S}/}" > + 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}/}" > - eend $? > - if [[ -e fonts.alias ]] ; then > - doins fonts.alias > + "${ED%/}/${FONTDIR}/${1//${S}/}" || eerror "failed to create fonts.dir" > + if ! eend $? ; then > + die "failed to run mkfontscale or mkfontdir" ...but this doesn't catch failure from mkfontscale. > fi > + [[ -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" > - find -L "${EROOT}"usr/share/fonts/ -type d -print0 | while read -d $'\0' d; do > + while read d; do read -d $'\0' -r > 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 > for g in ${genfiles}; do Could you use 'has' here? > if [[ ${f##*/} == ${g} ]]; then > # this is a generated file > generated=true > break > fi > done > # 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 > - [[ ${g} != fonts.alias && ( -e ${d}/${g} || -L ${d}/${g} ) ]] \ > - && rm "${d}"/${g} > + 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 -exec rmdir '{}' \; > + find "${d}" -maxdepth 0 -type d -empty -delete || eerror "failed to purge ${d}" > fi > - done > + done < <(find -L "${EROOT%/}"/usr/share/fonts/ -type d -print0) > eend 0 > } > > # @FUNCTION: font_pkg_setup > # @DESCRIPTION: > # The font pkg_setup function. > # Collision protection and Prefix compat for eapi < 3. > font_pkg_setup() { > # Prefix compat > case ${EAPI:-0} in > 0|1|2) > if ! use prefix; then > EPREFIX= > ED=${D} > EROOT=${ROOT} > [[ ${EROOT} = */ ]] || EROOT+="/" > fi > ;; > esac This is really ugly but I guess you can ignore it. > > # make sure we get no collisions > # setup is not the nicest place, but preinst doesn't cut it > - [[ -e "${EROOT}/${FONTDIR}/fonts.cache-1" ]] && rm -f "${EROOT}/${FONTDIR}/fonts.cache-1" > + 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 > > set -- ${FONT_S:-${S}} > if [[ $# -gt 1 ]]; then > # if we have multiple FONT_S elements then we want to recreate the dir > # structure > for dir in ${FONT_S}; do > pushd "${dir}" > /dev/null > insinto "${FONTDIR}/${dir//${S}/}" > for suffix in ${FONT_SUFFIX}; do > doins *.${suffix} Old EAPIs need ||die. > done > font_xfont_config "${dir}" > popd > /dev/null > done > else > pushd "${FONT_S}" > /dev/null > insinto "${FONTDIR}" > for suffix in ${FONT_SUFFIX}; do > doins *.${suffix} Likewise. > done > font_xfont_config > popd > /dev/null > fi > > font_fontconfig > > - [[ -n ${DOCS} ]] && { dodoc ${DOCS} || die "docs installation failed" ; } > + [[ -n ${DOCS} ]] && dodoc ${DOCS} I suppose this kills proper support for old EAPIs. > > # install common docs > for commondoc in COPYRIGHT README{,.txt} NEWS AUTHORS BUGS ChangeLog FONTLOG.txt; do > [[ -s ${commondoc} ]] && dodoc ${commondoc} > done > } > > +# @FUNCTION: _update_fontcache > +# @DESCRIPTION: > +# Updates fontcache if !prefix and media-libs/fontconfig installed > +_update_fontcache() { > + # unreadable font files = fontconfig segfaults > + find "${EROOT%/}"/usr/share/fonts/ -type f '!' -perm 0644 \ > + -exec chmod -v 0644 2>/dev/null {} + || die "failed to fix font files perms" > + > + if [[ -z ${ROOT%/} ]] ; then > + if has_version media-libs/fontconfig ; then > + ebegin "Updating global fontcache" > + fc-cache -fs > + if ! eend $? ; then > + die "failed to update global fontcache" > + fi > + else > + einfo "Skipping fontcache update (media-libs/fontconfig not installed)" > + fi > + else > + einfo "Skipping fontcache update (ROOT != /)" > + fi > +} > + > # @FUNCTION: font_pkg_postinst > # @DESCRIPTION: > # The font pkg_postinst function. > font_pkg_postinst() { > - # unreadable font files = fontconfig segfaults > - find "${EROOT}"usr/share/fonts/ -type f '!' -perm 0644 -print0 \ > - | xargs -0 chmod -v 0644 2>/dev/null > - > if [[ -n ${FONT_CONF[@]} ]]; then > local conffile > - echo > elog "The following fontconfig configuration files have been installed:" > elog > for conffile in "${FONT_CONF[@]}"; do > - if [[ -e ${EROOT}etc/fonts/conf.avail/$(basename ${conffile}) ]]; then > - elog " $(basename ${conffile})" > + if [[ -e "${EROOT%/}"/etc/fonts/conf.avail/${conffile##*/} ]]; then > + elog " ${conffile##*/}" > fi > done > elog > elog "Use \`eselect fontconfig\` to enable/disable them." > - echo > fi > > - if has_version media-libs/fontconfig && [[ ${ROOT} == / ]]; then > - ebegin "Updating global fontcache" > - fc-cache -fs > - eend $? > - else > - einfo "Skipping fontcache update (media-libs/fontconfig is not installed or ROOT != /)" > - fi > + _update_fontcache > } > > # @FUNCTION: font_pkg_postrm > # @DESCRIPTION: > # The font pkg_postrm function. > font_pkg_postrm() { > font_cleanup_dirs > - > - # unreadable font files = fontconfig segfaults > - find "${EROOT}"usr/share/fonts/ -type f '!' -perm 0644 -print0 \ > - | xargs -0 chmod -v 0644 2>/dev/null > - > - if has_version media-libs/fontconfig && [[ ${ROOT} == / ]]; then > - ebegin "Updating global fontcache" > - fc-cache -fs > - eend $? > - else > - einfo "Skipping fontcache update (media-libs/fontconfig is not installed or ROOT != /)" > - fi > + _update_fontcache > } > > > > -- Best regards, Michał Górny