# Copyright 1999-2023 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 # @ECLASS: mozlinguas-v2.eclass # @MAINTAINER: # mozilla@gentoo.org # @AUTHOR: # Nirbheek Chauhan # Ian Stakenvicius # @SUPPORTED_EAPIS: 8 # @BLURB: Handle language packs for mozilla products # @DESCRIPTION: # Sets IUSE according to MOZ_LANGS (language packs available). Also exports # src_unpack, src_compile and src_install for use in ebuilds, and provides # supporting functions for langpack generation and installation. case ${EAPI} in 8) ;; *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;; esac if [[ ! ${_MOZLINGUAS_V2_ECLASS} ]]; then _MOZLINGUAS_V2_ECLASS=1 inherit mozextension # @ECLASS_VARIABLE: MOZ_LANGS # @DEFAULT_UNSET # @DESCRIPTION: # Array containing the list of language pack xpis available for # this release. The list can be updated with scripts/get_langs.sh from the # mozilla overlay. : "${MOZ_LANGS:=()}" # @ECLASS_VARIABLE: MOZ_PV # @DEFAULT_UNSET # @DESCRIPTION: # Ebuild package version converted to equivalent upstream version. # Defaults to ${PV}, and should be overridden for alphas, betas, and RCs : "${MOZ_PV:="${PV}"}" # @ECLASS_VARIABLE: MOZ_PN # @DEFAULT_UNSET # @DESCRIPTION: # Ebuild package name converted to equivalent upstream name. # Defaults to ${PN}, and should be overridden for binary ebuilds. : "${MOZ_PN:="${PN}"}" # @ECLASS_VARIABLE: MOZ_P # @DEFAULT_UNSET # @DESCRIPTION: # Ebuild package name + version converted to upstream equivalent. # Defaults to ${MOZ_PN}-${MOZ_PV} : "${MOZ_P:="${MOZ_PN}-${MOZ_PV}"}" # @ECLASS_VARIABLE: MOZ_FTP_URI # @DEFAULT_UNSET # @DESCRIPTION: # The ftp URI prefix for the release tarballs and language packs. : "${MOZ_FTP_URI:=""}" # @ECLASS_VARIABLE: MOZ_HTTP_URI # @PRE_INHERIT # @DESCRIPTION: # The http URI prefix for the release tarballs and language packs. : "${MOZ_HTTP_URI:=""}" # @ECLASS_VARIABLE: MOZ_LANGPACK_HTTP_URI # @PRE_INHERIT # @DESCRIPTION: # An alternative http URI if it differs from official mozilla URI. # Defaults to whatever MOZ_HTTP_URI was set to. : "${MOZ_LANGPACK_HTTP_URI:=${MOZ_HTTP_URI}}" # @ECLASS_VARIABLE: MOZ_LANGPACK_PREFIX # @DESCRIPTION: # The relative path till the lang code in the langpack file URI. # Defaults to ${MOZ_PV}/linux-i686/xpi/ : "${MOZ_LANGPACK_PREFIX:="${MOZ_PV}/linux-i686/xpi/"}" # @ECLASS_VARIABLE: MOZ_LANGPACK_SUFFIX # @DESCRIPTION: # The suffix after the lang code in the langpack file URI. # Defaults to '.xpi' : "${MOZ_LANGPACK_SUFFIX:=".xpi"}" # @ECLASS_VARIABLE: MOZ_LANGPACK_UNOFFICIAL # @DESCRIPTION: # The status of the langpack, used to differentiate within # Manifests and on Gentoo mirrors as to when the langpacks are # generated officially by Mozilla or if they were generated # unofficially by others (ie the Gentoo mozilla team). When # this var is set, the distfile will have a .unofficial.xpi # suffix. : "${MOZ_LANGPACK_UNOFFICIAL:=""}" # @ECLASS_VARIABLE: MOZ_GENERATE_LANGPACKS # @PRE_INHERIT # @DEFAULT_UNSET # @DESCRIPTION: # This flag specifies whether or not the langpacks should be # generated directly during the build process, rather than # being downloaded and installed from upstream pre-built # extensions. Primarily it supports pre-release builds. # Defaults to empty. : "${MOZ_GENERATE_LANGPACKS:=""}" # @ECLASS_VARIABLE: MOZ_L10N_SOURCEDIR # @DESCRIPTION: # The path that l10n sources can be found at, once unpacked. # Defaults to ${WORKDIR}/l10n-sources : "${MOZ_L10N_SOURCEDIR:="${WORKDIR}/l10n-sources"}" # @ECLASS_VARIABLE: MOZ_L10N_URI_PREFIX # @PRE_INHERIT # @DEFAULT_UNSET # @DESCRIPTION: # The full URI prefix of the distfile for each l10n locale. The # AB_CD and MOZ_L10N_URI_SUFFIX will be appended to this to complete the # SRC_URI when MOZ_GENERATE_LANGPACKS is set. If empty, nothing will # be added to SRC_URI. # Defaults to empty. : "${MOZ_L10N_URI_PREFIX:=""}" # @ECLASS_VARIABLE: MOZ_L10N_URI_SUFFIX # @DEFAULT_UNSET # @DESCRIPTION: # The suffix of l10n source distfiles. # Defaults to '.tar.xz' : "${MOZ_L10N_URI_SUFFIX:=".tar.xz"}" # @ECLASS_VARIABLE: MOZ_FORCE_UPSTREAM_L10N # @DEFAULT_UNSET # @DESCRIPTION: # Set this to use upstream langpaks even if the package normally # shouldn't (ie it is an alpha or beta package) : "${MOZ_FORCE_UPSTREAM_L10N:=""}" # @ECLASS_VARIABLE: MOZ_TOO_REGIONALIZED_FOR_L10N # @INTERNAL # @DESCRIPTION: # Upstream identifiers that should not contain region subtags in L10N MOZ_TOO_REGIONALIZED_FOR_L10N=( fy-NL ga-IE gu-IN hi-IN hy-AM nb-NO nn-NO pa-IN sv-SE ) # @ECLASS_VARIABLE: MOZ_INSTALL_L10N_XPIFILE # @DESCRIPTION: # Install langpacks as .xpi file instead of unpacked directory. # Leave unset to install unpacked : "${MOZ_INSTALL_L10N_XPIFILE:=""}" # Add l10n_* to IUSE according to available language packs # No language packs for alphas and betas if ! [[ -n ${MOZ_GENERATE_LANGPACKS} ]] ; then if ! [[ ${PV} =~ alpha|beta ]] || { [[ ${PN} == seamonkey ]] && ! [[ ${PV} =~ alpha ]] ; } || [[ -n ${MOZ_FORCE_UPSTREAM_L10N} ]] ; then [[ -z ${MOZ_FTP_URI} ]] && [[ -z ${MOZ_LANGPACK_HTTP_URI} ]] && die "No URI set to download langpacks, please set one of MOZ_{FTP,HTTP_LANGPACK}_URI" for x in "${MOZ_LANGS[@]}" ; do # en and en_US are handled internally if [[ ${x} == en ]] || [[ ${x} == en-US ]]; then continue fi # strip region subtag if $x is in the list if has ${x} "${MOZ_TOO_REGIONALIZED_FOR_L10N[@]}" ; then xflag=${x%%-*} else xflag=${x} fi SRC_URI+=" l10n_${xflag/[_@]/-}? (" [[ -n ${MOZ_FTP_URI} ]] && SRC_URI+=" ${MOZ_FTP_URI}/${MOZ_LANGPACK_PREFIX}${x}${MOZ_LANGPACK_SUFFIX} -> ${MOZ_P}-${x}${MOZ_LANGPACK_UNOFFICIAL:+.unofficial}.xpi" [[ -n ${MOZ_LANGPACK_HTTP_URI} ]] && SRC_URI+=" ${MOZ_LANGPACK_HTTP_URI}/${MOZ_LANGPACK_PREFIX}${x}${MOZ_LANGPACK_SUFFIX} -> ${MOZ_P}-${x}${MOZ_LANGPACK_UNOFFICIAL:+.unofficial}.xpi" SRC_URI+=" )" IUSE+=" l10n_${xflag/[_@]/-}" # We used to do some magic if specific/generic locales were missing, but # we stopped doing that due to bug 325195. done fi else for x in "${MOZ_LANGS[@]}" ; do # en and en_US are handled internally if [[ ${x} == en ]] || [[ ${x} == en-US ]]; then continue fi # strip region subtag if $x is in the list if has ${x} "${MOZ_TOO_REGIONALIZED_FOR_L10N[@]}" ; then xflag=${x%%-*} else xflag=${x} fi # Do NOT grab l10n sources from hg tip at this time, since it is a moving target # if [[ ${PV} =~ alpha ]]; then # # Please note that this URI is not deterministic - digest breakage could occur # SRC_URI+=" l10n_${xflag/[_@]/-}? ( http://hg.mozilla.org/releases/l10n/mozilla-aurora/ach/archive/tip.tar.bz2 -> ${MOZ_P}-l10n-${x}.tar.bz2 )" # elif [[ ${PV} =~ beta ]] && ! [[ ${PN} == seamonkey ]]; then # # Please note that this URI is not deterministic - digest breakage could occur # SRC_URI+=" l10n_${xflag/[_@]/-}? ( http://hg.mozilla.org/releases/l10n/mozilla-beta/ach/archive/tip.tar.bz2 -> ${MOZ_P}-l10n-${x}.tar.bz2 )" # elif [[ -n ${MOZ_L10N_URI_PREFIX} ]]; then if [[ -n ${MOZ_L10N_URI_PREFIX} ]]; then SRC_URI+=" l10n_${xflag/[_@]/-}? ( ${MOZ_L10N_URI_PREFIX}${x}${MOZ_L10N_URI_SUFFIX} )" fi IUSE+=" l10n_${xflag/[_@]/-}" done fi unset x xflag # @FUNCTION: mozlinguas_export # @INTERNAL # @DESCRIPTION: # Generate the list of language packs called "mozlinguas" # This list is used to unpack and install the xpi language packs mozlinguas_export() { if [[ ${PN} == seamonkey ]] ; then [[ ${PV} =~ alpha ]] && ! [[ -n ${MOZ_GENERATE_LANGPACKS} ]] && return else [[ ${PV} =~ alpha|beta ]] && ! [[ -n ${MOZ_GENERATE_LANGPACKS} ]] && return fi local lingua lflag mozlinguas=() # Set mozlinguas based on the enabled l10n_* USE flags. for lingua in "${MOZ_LANGS[@]}"; do # strip region subtag if $x is in the list if has ${lingua} en en-US; then # For mozilla products, en and en_US are handled internally continue elif has ${lingua} "${MOZ_TOO_REGIONALIZED_FOR_L10N[@]}" ; then lflag=${lingua%%-*} else lflag=${lingua} fi use l10n_${lflag/[_@]/-} && mozlinguas+=( ${lingua} ) done # Compatibility code - Check LINGUAS and warn if anything set there isn't enabled via l10n for lingua in ${LINGUAS}; do if has ${lingua//[_@]/-} en en-US; then # For mozilla products, en and en_US are handled internally continue # If this language is supported by ${P}, elif has ${lingua} "${MOZ_LANGS[@]//-/_}"; then # Warn the language is missing, if it isn't already there has ${lingua//[_@]/-} "${mozlinguas[@]//[_@]/-}" || \ ewarn "LINGUAS value ${lingua} is not enabled using L10N use flags" continue # For each short lingua that isn't in MOZ_LANGS, # We used to add *all* long MOZ_LANGS to the mozlinguas list, # but we stopped doing that due to bug 325195. else : fi einfo "Sorry, but ${P} does not support the ${lingua} locale in LINGUAS" done } # @FUNCTION: mozlinguas_src_unpack # @DESCRIPTION: # Unpack xpi language packs according to the user's LINGUAS settings mozlinguas_src_unpack() { local x if ! [[ -n ${MOZ_GENERATE_LANGPACKS} ]]; then mozlinguas_export for x in "${mozlinguas[@]}"; do # FIXME: Add support for unpacking xpis to portage xpi_unpack "${MOZ_P}-${x}${MOZ_LANGPACK_UNOFFICIAL:+.unofficial}.xpi" done if [[ "${mozlinguas[*]}" != "" && "${mozlinguas[*]}" != "en" ]]; then einfo "Selected language packs (first will be default): ${mozlinguas[*]}" fi fi } # For the phase function export mozlinguas-v2_src_unpack() { mozlinguas_src_unpack } # @FUNCTION: mozlinguas_mozconfig # @DESCRIPTION: # if applicable, add the necessary flag to .mozconfig to support # the generation of locales. Note that this function requires # mozconfig_annontate to already be declared via an inherit of # mozconfig or mozcoreconf. mozlinguas_mozconfig() { if [[ -n ${MOZ_GENERATE_LANGPACKS} ]]; then if declare -f mozconfig_annotate >/dev/null ; then mozconfig_annotate 'for building locales' --with-l10n-base=${MOZ_L10N_SOURCEDIR} else die "Could not configure l10n-base, mozconfig_annotate not declared -- missing inherit?" fi fi } # @FUNCTION: mozlinguas_src_compile # @DESCRIPTION: # if applicable, build the selected locales. mozlinguas_src_compile() { if [[ -n ${MOZ_GENERATE_LANGPACKS} ]]; then # leverage BUILD_OBJ_DIR if set otherwise assume PWD. local x y targets=( "langpack" ) localedir="${BUILD_OBJ_DIR:-.}" case ${PN} in *firefox|waterfox*) localedir+="/browser/locales" ;; seamonkey) if [[ "$(ver_cut 2)" -gt 53 ]] || { [[ "$(ver_cut 2)" -eq 53 ]] && [[ "$(ver_cut 3)" -ge 6 ]] ; } ; then localedir+="/comm" fi localedir+="/suite/locales" ;; *thunderbird) localedir+="/mail/locales" targets+=( "calendar-langpack" ) ;; *) die "Building locales for ${PN} is not supported." esac pushd "${localedir}" > /dev/null || die mozlinguas_export for x in "${mozlinguas[@]}"; do for y in "${targets[@]}"; do emake ${y}-${x} LOCALE_MERGEDIR="./${y}-${x}" done; done popd > /dev/null || die fi } # For the phase function export mozlinguas-v2_src_compile() { mozlinguas_src_compile } # @FUNCTION: mozlinguas_xpistage_langpacks # @DESCRIPTION: # Add extra langpacks to the xpi-stage dir for prebuilt plugins # # First argument is the path to the extension # Second argument is the prefix of the source (same as first if unspecified) # Remaining arguments are the modules in the extension that are localized # (basename of first if unspecified) # # Example - installing extra langpacks for lightning: # src_install() { # ... # general installation steps # mozlinguas_xpistage_langpacks \ # "${BUILD_OBJ_DIR}"/dist/xpi-stage/lightning \ # "${WORKDIR}"/lightning \ # lightning calendar # ... # proceed with installation from the xpi-stage dir # } mozlinguas_xpistage_langpacks() { local l c modpath="${1}" srcprefix="${1}" modules=( "${1##*/}" ) shift if [[ -n ${1} ]] ; then srcprefix="${1}" ; shift ; fi if [[ -n ${1} ]] ; then modules=( $@ ) ; fi mozlinguas_export mkdir -p "${modpath}/chrome" || die for l in "${mozlinguas[@]}"; do for c in "${modules[@]}" ; do if [[ -e "${srcprefix}-${l}/chrome/${c}-${l}" ]]; then cp -RLp -t "${modpath}/chrome" "${srcprefix}-${l}/chrome/${c}-${l}" || die grep "locale ${c} ${l} chrome/" "${srcprefix}-${l}/chrome.manifest" \ >>"${modpath}/chrome.manifest" || die elif [[ -e "${srcprefix}/chrome/${c}-${l}" ]]; then cp -RLp -t "${modpath}/chrome" "${srcprefix}/chrome/${c}-${l}" || die grep "locale ${c} ${l} chrome/" "${srcprefix}/chrome.manifest" \ >>"${modpath}/chrome.manifest" || die else ewarn "Locale ${l} was not found for ${c}, skipping." fi done; done } # @FUNCTION: mozlinguas-v2_src_install # @DESCRIPTION: # Install xpi language packs according to the user's L10N settings # NOTE - uses ${BUILD_OBJ_DIR} or PWD if unset, for source-generated langpacks mozlinguas_src_install() { local x mozlinguas_export if [[ -n ${MOZ_GENERATE_LANGPACKS} ]] && [[ -n ${mozlinguas[*]} ]]; then local repopath="${WORKDIR}/${PN}-generated-langpacks" mkdir -p "${repopath}" || die pushd "${BUILD_OBJ_DIR:-.}"/dist/*/xpi > /dev/null || die for x in "${mozlinguas[@]}"; do cp "${MOZ_P}.${x}.langpack.xpi" \ "${repopath}/${MOZ_P}-${x}${MOZ_LANGPACK_UNOFFICIAL:+.unofficial}.xpi" || die xpi_unpack "${repopath}/${MOZ_P}-${x}${MOZ_LANGPACK_UNOFFICIAL:+.unofficial}.xpi" done popd > /dev/null || die fi for x in "${mozlinguas[@]}"; do if [[ -n ${MOZ_INSTALL_L10N_XPIFILE} ]]; then xpi_copy "${WORKDIR}/${MOZ_P}-${x}${MOZ_LANGPACK_UNOFFICIAL:+.unofficial}" else xpi_install "${WORKDIR}/${MOZ_P}-${x}${MOZ_LANGPACK_UNOFFICIAL:+.unofficial}" fi done } # For the phase function export mozlinguas-v2_src_install() { mozlinguas_src_install } fi EXPORT_FUNCTIONS src_unpack src_compile src_install