#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#

#
# This class will generate the proper postinst/postrm scriptlets for font
# packages.
#

PACKAGE_WRITE_DEPS += "qemuwrapper-cross"

FONT_PACKAGES ??= "${PN}"
FONT_PACKAGES:class-native = ""
FONT_EXTRA_RDEPENDS ?= "${MLPREFIX}fontconfig-utils"
FONTCONFIG_CACHE_DIR ?= "${localstatedir}/cache/fontconfig"
FONTCONFIG_CACHE_PARAMS ?= "-v"
# You can change this to e.g. FC_DEBUG=16 to debug fc-cache issues,
# something has to be set, because qemuwrapper is using this variable after -E
# multiple variables aren't allowed because for qemu they are separated
# by comma and in -n "$D" case they should be separated by space
FONTCONFIG_CACHE_ENV ?= "FC_DEBUG=1"
fontcache_common() {
if [ -n "$D" ] ; then
	$INTERCEPT_DIR/postinst_intercept update_font_cache ${PKG} mlprefix=${MLPREFIX} binprefix=${MLPREFIX} \
		'bindir="${bindir}"' \
		'libdir="${libdir}"' \
		'libexecdir="${libexecdir}"' \
		'base_libdir="${base_libdir}"' \
		'fontconfigcachedir="${FONTCONFIG_CACHE_DIR}"' \
		'fontconfigcacheparams="${FONTCONFIG_CACHE_PARAMS}"' \
		'fontconfigcacheenv="${FONTCONFIG_CACHE_ENV}"'
else
	${FONTCONFIG_CACHE_ENV} fc-cache ${FONTCONFIG_CACHE_PARAMS}
fi
}

python () {
    font_pkgs = d.getVar('FONT_PACKAGES').split()
    deps = d.getVar("FONT_EXTRA_RDEPENDS")

    for pkg in font_pkgs:
        if deps: d.appendVar('RDEPENDS:' + pkg, ' '+deps)
}

python add_fontcache_postinsts() {
    for pkg in d.getVar('FONT_PACKAGES').split():
        bb.note("adding fonts postinst and postrm scripts to %s" % pkg)
        postinst = d.getVar('pkg_postinst:%s' % pkg) or d.getVar('pkg_postinst')
        if not postinst:
            postinst = '#!/bin/sh\n'
        postinst += d.getVar('fontcache_common')
        d.setVar('pkg_postinst:%s' % pkg, postinst)

        postrm = d.getVar('pkg_postrm:%s' % pkg) or d.getVar('pkg_postrm')
        if not postrm:
            postrm = '#!/bin/sh\n'
        postrm += d.getVar('fontcache_common')
        d.setVar('pkg_postrm:%s' % pkg, postrm)
}

PACKAGEFUNCS =+ "add_fontcache_postinsts"
