1*4882a593Smuzhiyun# 2*4882a593Smuzhiyun# This class knows how to package up [e]glibc. Its shared since prebuild binary toolchains 3*4882a593Smuzhiyun# may need packaging and its pointless to duplicate this code. 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun# Caller should set GLIBC_INTERNAL_USE_BINARY_LOCALE to one of: 6*4882a593Smuzhiyun# "compile" - Use QEMU to generate the binary locale files 7*4882a593Smuzhiyun# "precompiled" - The binary locale files are pregenerated and already present 8*4882a593Smuzhiyun# "ondevice" - The device will build the locale files upon first boot through the postinst 9*4882a593Smuzhiyun 10*4882a593SmuzhiyunGLIBC_INTERNAL_USE_BINARY_LOCALE ?= "ondevice" 11*4882a593Smuzhiyun 12*4882a593SmuzhiyunGLIBC_SPLIT_LC_PACKAGES ?= "0" 13*4882a593Smuzhiyun 14*4882a593Smuzhiyunpython __anonymous () { 15*4882a593Smuzhiyun enabled = d.getVar("ENABLE_BINARY_LOCALE_GENERATION") 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun pn = d.getVar("PN") 18*4882a593Smuzhiyun if pn.endswith("-initial"): 19*4882a593Smuzhiyun enabled = False 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun if enabled and int(enabled): 22*4882a593Smuzhiyun import re 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun target_arch = d.getVar("TARGET_ARCH") 25*4882a593Smuzhiyun binary_arches = d.getVar("BINARY_LOCALE_ARCHES") or "" 26*4882a593Smuzhiyun use_cross_localedef = d.getVar("LOCALE_GENERATION_WITH_CROSS-LOCALEDEF") or "" 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun for regexp in binary_arches.split(" "): 29*4882a593Smuzhiyun r = re.compile(regexp) 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun if r.match(target_arch): 32*4882a593Smuzhiyun depends = d.getVar("DEPENDS") 33*4882a593Smuzhiyun if use_cross_localedef == "1" : 34*4882a593Smuzhiyun depends = "%s cross-localedef-native" % depends 35*4882a593Smuzhiyun else: 36*4882a593Smuzhiyun depends = "%s qemu-native" % depends 37*4882a593Smuzhiyun d.setVar("DEPENDS", depends) 38*4882a593Smuzhiyun d.setVar("GLIBC_INTERNAL_USE_BINARY_LOCALE", "compile") 39*4882a593Smuzhiyun break 40*4882a593Smuzhiyun} 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun# try to fix disable charsets/locales/locale-code compile fail 43*4882a593SmuzhiyunPACKAGE_NO_GCONV ?= "0" 44*4882a593Smuzhiyun 45*4882a593SmuzhiyunOVERRIDES:append = ":${TARGET_ARCH}-${TARGET_OS}" 46*4882a593Smuzhiyun 47*4882a593Smuzhiyunlocale_base_postinst_ontarget() { 48*4882a593Smuzhiyunmkdir ${libdir}/locale 49*4882a593Smuzhiyunlocaledef --inputfile=${datadir}/i18n/locales/%s --charmap=%s %s 50*4882a593Smuzhiyun} 51*4882a593Smuzhiyun 52*4882a593Smuzhiyunlocale_base_postrm() { 53*4882a593Smuzhiyun#!/bin/sh 54*4882a593Smuzhiyunlocaledef --delete-from-archive --inputfile=${datadir}/locales/%s --charmap=%s %s 55*4882a593Smuzhiyun} 56*4882a593Smuzhiyun 57*4882a593SmuzhiyunLOCALETREESRC ?= "${PKGD}" 58*4882a593Smuzhiyun 59*4882a593Smuzhiyundo_prep_locale_tree() { 60*4882a593Smuzhiyun treedir=${WORKDIR}/locale-tree 61*4882a593Smuzhiyun rm -rf $treedir 62*4882a593Smuzhiyun mkdir -p $treedir/${base_bindir} $treedir/${base_libdir} $treedir/${datadir} $treedir/${localedir} 63*4882a593Smuzhiyun tar -cf - -C ${LOCALETREESRC}${datadir} -p i18n | tar -xf - -C $treedir/${datadir} 64*4882a593Smuzhiyun # unzip to avoid parsing errors 65*4882a593Smuzhiyun for i in $treedir/${datadir}/i18n/charmaps/*gz; do 66*4882a593Smuzhiyun gunzip $i 67*4882a593Smuzhiyun done 68*4882a593Smuzhiyun # The extract pattern "./l*.so*" is carefully selected so that it will 69*4882a593Smuzhiyun # match ld*.so and lib*.so*, but not any files in the gconv directory 70*4882a593Smuzhiyun # (if it exists). This makes sure we only unpack the files we need. 71*4882a593Smuzhiyun # This is important in case usrmerge is set in DISTRO_FEATURES, which 72*4882a593Smuzhiyun # means ${base_libdir} == ${libdir}. 73*4882a593Smuzhiyun tar -cf - -C ${LOCALETREESRC}${base_libdir} -p . | tar -xf - -C $treedir/${base_libdir} --wildcards './l*.so*' 74*4882a593Smuzhiyun if [ -f ${STAGING_LIBDIR_NATIVE}/libgcc_s.* ]; then 75*4882a593Smuzhiyun tar -cf - -C ${STAGING_LIBDIR_NATIVE} -p libgcc_s.* | tar -xf - -C $treedir/${base_libdir} 76*4882a593Smuzhiyun fi 77*4882a593Smuzhiyun install -m 0755 ${LOCALETREESRC}${bindir}/localedef $treedir/${base_bindir} 78*4882a593Smuzhiyun} 79*4882a593Smuzhiyun 80*4882a593Smuzhiyundo_collect_bins_from_locale_tree() { 81*4882a593Smuzhiyun treedir=${WORKDIR}/locale-tree 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun parent=$(dirname ${localedir}) 84*4882a593Smuzhiyun mkdir -p ${PKGD}/$parent 85*4882a593Smuzhiyun tar -cf - -C $treedir/$parent -p $(basename ${localedir}) | tar -xf - -C ${PKGD}$parent 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun # Finalize tree by chaning all duplicate files into hard links 88*4882a593Smuzhiyun cross-localedef-hardlink -c -v ${WORKDIR}/locale-tree 89*4882a593Smuzhiyun} 90*4882a593Smuzhiyun 91*4882a593Smuzhiyuninherit qemu 92*4882a593Smuzhiyun 93*4882a593Smuzhiyunpython package_do_split_gconvs () { 94*4882a593Smuzhiyun import re 95*4882a593Smuzhiyun if (d.getVar('PACKAGE_NO_GCONV') == '1'): 96*4882a593Smuzhiyun bb.note("package requested not splitting gconvs") 97*4882a593Smuzhiyun return 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun if not d.getVar('PACKAGES'): 100*4882a593Smuzhiyun return 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun mlprefix = d.getVar("MLPREFIX") or "" 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun bpn = d.getVar('BPN') 105*4882a593Smuzhiyun libdir = d.getVar('libdir') 106*4882a593Smuzhiyun if not libdir: 107*4882a593Smuzhiyun bb.error("libdir not defined") 108*4882a593Smuzhiyun return 109*4882a593Smuzhiyun datadir = d.getVar('datadir') 110*4882a593Smuzhiyun if not datadir: 111*4882a593Smuzhiyun bb.error("datadir not defined") 112*4882a593Smuzhiyun return 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun gconv_libdir = oe.path.join(libdir, "gconv") 115*4882a593Smuzhiyun charmap_dir = oe.path.join(datadir, "i18n", "charmaps") 116*4882a593Smuzhiyun locales_dir = oe.path.join(datadir, "i18n", "locales") 117*4882a593Smuzhiyun binary_locales_dir = d.getVar('localedir') 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun def calc_gconv_deps(fn, pkg, file_regex, output_pattern, group): 120*4882a593Smuzhiyun deps = [] 121*4882a593Smuzhiyun f = open(fn, "rb") 122*4882a593Smuzhiyun c_re = re.compile(r'^copy "(.*)"') 123*4882a593Smuzhiyun i_re = re.compile(r'^include "(\w+)".*') 124*4882a593Smuzhiyun for l in f.readlines(): 125*4882a593Smuzhiyun l = l.decode("latin-1") 126*4882a593Smuzhiyun m = c_re.match(l) or i_re.match(l) 127*4882a593Smuzhiyun if m: 128*4882a593Smuzhiyun dp = legitimize_package_name('%s%s-gconv-%s' % (mlprefix, bpn, m.group(1))) 129*4882a593Smuzhiyun if not dp in deps: 130*4882a593Smuzhiyun deps.append(dp) 131*4882a593Smuzhiyun f.close() 132*4882a593Smuzhiyun if deps != []: 133*4882a593Smuzhiyun d.setVar('RDEPENDS:%s' % pkg, " ".join(deps)) 134*4882a593Smuzhiyun if bpn != 'glibc': 135*4882a593Smuzhiyun d.setVar('RPROVIDES:%s' % pkg, pkg.replace(bpn, 'glibc')) 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun do_split_packages(d, gconv_libdir, file_regex=r'^(.*)\.so$', output_pattern=bpn+'-gconv-%s', \ 138*4882a593Smuzhiyun description='gconv module for character set %s', hook=calc_gconv_deps, \ 139*4882a593Smuzhiyun extra_depends=bpn+'-gconv') 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun def calc_charmap_deps(fn, pkg, file_regex, output_pattern, group): 142*4882a593Smuzhiyun deps = [] 143*4882a593Smuzhiyun f = open(fn, "rb") 144*4882a593Smuzhiyun c_re = re.compile(r'^copy "(.*)"') 145*4882a593Smuzhiyun i_re = re.compile(r'^include "(\w+)".*') 146*4882a593Smuzhiyun for l in f.readlines(): 147*4882a593Smuzhiyun l = l.decode("latin-1") 148*4882a593Smuzhiyun m = c_re.match(l) or i_re.match(l) 149*4882a593Smuzhiyun if m: 150*4882a593Smuzhiyun dp = legitimize_package_name('%s%s-charmap-%s' % (mlprefix, bpn, m.group(1))) 151*4882a593Smuzhiyun if not dp in deps: 152*4882a593Smuzhiyun deps.append(dp) 153*4882a593Smuzhiyun f.close() 154*4882a593Smuzhiyun if deps != []: 155*4882a593Smuzhiyun d.setVar('RDEPENDS:%s' % pkg, " ".join(deps)) 156*4882a593Smuzhiyun if bpn != 'glibc': 157*4882a593Smuzhiyun d.setVar('RPROVIDES:%s' % pkg, pkg.replace(bpn, 'glibc')) 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun do_split_packages(d, charmap_dir, file_regex=r'^(.*)\.gz$', output_pattern=bpn+'-charmap-%s', \ 160*4882a593Smuzhiyun description='character map for %s encoding', hook=calc_charmap_deps, extra_depends='') 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun def calc_locale_deps(fn, pkg, file_regex, output_pattern, group): 163*4882a593Smuzhiyun deps = [] 164*4882a593Smuzhiyun f = open(fn, "rb") 165*4882a593Smuzhiyun c_re = re.compile(r'^copy "(.*)"') 166*4882a593Smuzhiyun i_re = re.compile(r'^include "(\w+)".*') 167*4882a593Smuzhiyun for l in f.readlines(): 168*4882a593Smuzhiyun l = l.decode("latin-1") 169*4882a593Smuzhiyun m = c_re.match(l) or i_re.match(l) 170*4882a593Smuzhiyun if m: 171*4882a593Smuzhiyun dp = legitimize_package_name(mlprefix+bpn+'-localedata-%s' % m.group(1)) 172*4882a593Smuzhiyun if not dp in deps: 173*4882a593Smuzhiyun deps.append(dp) 174*4882a593Smuzhiyun f.close() 175*4882a593Smuzhiyun if deps != []: 176*4882a593Smuzhiyun d.setVar('RDEPENDS:%s' % pkg, " ".join(deps)) 177*4882a593Smuzhiyun if bpn != 'glibc': 178*4882a593Smuzhiyun d.setVar('RPROVIDES:%s' % pkg, pkg.replace(bpn, 'glibc')) 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun do_split_packages(d, locales_dir, file_regex=r'(.*)', output_pattern=bpn+'-localedata-%s', \ 181*4882a593Smuzhiyun description='locale definition for %s', hook=calc_locale_deps, extra_depends='') 182*4882a593Smuzhiyun d.setVar('PACKAGES', d.getVar('PACKAGES', False) + ' ' + d.getVar('MLPREFIX', False) + bpn + '-gconv') 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun use_bin = d.getVar("GLIBC_INTERNAL_USE_BINARY_LOCALE") 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun dot_re = re.compile(r"(.*)\.(.*)") 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun # Read in supported locales and associated encodings 189*4882a593Smuzhiyun supported = {} 190*4882a593Smuzhiyun with open(oe.path.join(d.getVar('WORKDIR'), "SUPPORTED")) as f: 191*4882a593Smuzhiyun for line in f.readlines(): 192*4882a593Smuzhiyun try: 193*4882a593Smuzhiyun locale, charset = line.rstrip().split() 194*4882a593Smuzhiyun except ValueError: 195*4882a593Smuzhiyun continue 196*4882a593Smuzhiyun supported[locale] = charset 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun # GLIBC_GENERATE_LOCALES var specifies which locales to be generated. empty or "all" means all locales 199*4882a593Smuzhiyun to_generate = d.getVar('GLIBC_GENERATE_LOCALES') 200*4882a593Smuzhiyun if not to_generate or to_generate == 'all': 201*4882a593Smuzhiyun to_generate = sorted(supported.keys()) 202*4882a593Smuzhiyun else: 203*4882a593Smuzhiyun to_generate = to_generate.split() 204*4882a593Smuzhiyun for locale in to_generate: 205*4882a593Smuzhiyun if locale not in supported: 206*4882a593Smuzhiyun if '.' in locale: 207*4882a593Smuzhiyun charset = locale.split('.')[1] 208*4882a593Smuzhiyun else: 209*4882a593Smuzhiyun charset = 'UTF-8' 210*4882a593Smuzhiyun bb.warn("Unsupported locale '%s', assuming encoding '%s'" % (locale, charset)) 211*4882a593Smuzhiyun supported[locale] = charset 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun def output_locale_source(name, pkgname, locale, encoding): 214*4882a593Smuzhiyun d.setVar('RDEPENDS:%s' % pkgname, '%slocaledef %s-localedata-%s %s-charmap-%s' % \ 215*4882a593Smuzhiyun (mlprefix, mlprefix+bpn, legitimize_package_name(locale), mlprefix+bpn, legitimize_package_name(encoding))) 216*4882a593Smuzhiyun d.setVar('pkg_postinst_ontarget:%s' % pkgname, d.getVar('locale_base_postinst_ontarget') \ 217*4882a593Smuzhiyun % (locale, encoding, locale)) 218*4882a593Smuzhiyun d.setVar('pkg_postrm:%s' % pkgname, d.getVar('locale_base_postrm') % \ 219*4882a593Smuzhiyun (locale, encoding, locale)) 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun def output_locale_binary_rdepends(name, pkgname, locale, encoding): 222*4882a593Smuzhiyun dep = legitimize_package_name('%s-binary-localedata-%s' % (bpn, name)) 223*4882a593Smuzhiyun lcsplit = d.getVar('GLIBC_SPLIT_LC_PACKAGES') 224*4882a593Smuzhiyun if lcsplit and int(lcsplit): 225*4882a593Smuzhiyun d.appendVar('PACKAGES', ' ' + dep) 226*4882a593Smuzhiyun d.setVar('ALLOW_EMPTY:%s' % dep, '1') 227*4882a593Smuzhiyun d.setVar('RDEPENDS:%s' % pkgname, mlprefix + dep) 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun commands = {} 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun def output_locale_binary(name, pkgname, locale, encoding): 232*4882a593Smuzhiyun treedir = oe.path.join(d.getVar("WORKDIR"), "locale-tree") 233*4882a593Smuzhiyun ldlibdir = oe.path.join(treedir, d.getVar("base_libdir")) 234*4882a593Smuzhiyun path = d.getVar("PATH") 235*4882a593Smuzhiyun i18npath = oe.path.join(treedir, datadir, "i18n") 236*4882a593Smuzhiyun gconvpath = oe.path.join(treedir, "iconvdata") 237*4882a593Smuzhiyun outputpath = oe.path.join(treedir, binary_locales_dir) 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun use_cross_localedef = d.getVar("LOCALE_GENERATION_WITH_CROSS-LOCALEDEF") or "0" 240*4882a593Smuzhiyun if use_cross_localedef == "1": 241*4882a593Smuzhiyun target_arch = d.getVar('TARGET_ARCH') 242*4882a593Smuzhiyun locale_arch_options = { \ 243*4882a593Smuzhiyun "arc": " --uint32-align=4 --little-endian ", \ 244*4882a593Smuzhiyun "arceb": " --uint32-align=4 --big-endian ", \ 245*4882a593Smuzhiyun "arm": " --uint32-align=4 --little-endian ", \ 246*4882a593Smuzhiyun "armeb": " --uint32-align=4 --big-endian ", \ 247*4882a593Smuzhiyun "aarch64": " --uint32-align=4 --little-endian ", \ 248*4882a593Smuzhiyun "aarch64_be": " --uint32-align=4 --big-endian ", \ 249*4882a593Smuzhiyun "sh4": " --uint32-align=4 --big-endian ", \ 250*4882a593Smuzhiyun "powerpc": " --uint32-align=4 --big-endian ", \ 251*4882a593Smuzhiyun "powerpc64": " --uint32-align=4 --big-endian ", \ 252*4882a593Smuzhiyun "powerpc64le": " --uint32-align=4 --little-endian ", \ 253*4882a593Smuzhiyun "mips": " --uint32-align=4 --big-endian ", \ 254*4882a593Smuzhiyun "mipsisa32r6": " --uint32-align=4 --big-endian ", \ 255*4882a593Smuzhiyun "mips64": " --uint32-align=4 --big-endian ", \ 256*4882a593Smuzhiyun "mipsisa64r6": " --uint32-align=4 --big-endian ", \ 257*4882a593Smuzhiyun "mipsel": " --uint32-align=4 --little-endian ", \ 258*4882a593Smuzhiyun "mipsisa32r6el": " --uint32-align=4 --little-endian ", \ 259*4882a593Smuzhiyun "mips64el":" --uint32-align=4 --little-endian ", \ 260*4882a593Smuzhiyun "mipsisa64r6el":" --uint32-align=4 --little-endian ", \ 261*4882a593Smuzhiyun "riscv64": " --uint32-align=4 --little-endian ", \ 262*4882a593Smuzhiyun "riscv32": " --uint32-align=4 --little-endian ", \ 263*4882a593Smuzhiyun "i586": " --uint32-align=4 --little-endian ", \ 264*4882a593Smuzhiyun "i686": " --uint32-align=4 --little-endian ", \ 265*4882a593Smuzhiyun "x86_64": " --uint32-align=4 --little-endian " } 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun if target_arch in locale_arch_options: 268*4882a593Smuzhiyun localedef_opts = locale_arch_options[target_arch] 269*4882a593Smuzhiyun else: 270*4882a593Smuzhiyun bb.error("locale_arch_options not found for target_arch=" + target_arch) 271*4882a593Smuzhiyun bb.fatal("unknown arch:" + target_arch + " for locale_arch_options") 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun localedef_opts += " --force --no-hard-links --no-archive --prefix=%s \ 274*4882a593Smuzhiyun --inputfile=%s/%s/i18n/locales/%s --charmap=%s %s/%s" \ 275*4882a593Smuzhiyun % (treedir, treedir, datadir, locale, encoding, outputpath, name) 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun cmd = "PATH=\"%s\" I18NPATH=\"%s\" GCONV_PATH=\"%s\" cross-localedef %s" % \ 278*4882a593Smuzhiyun (path, i18npath, gconvpath, localedef_opts) 279*4882a593Smuzhiyun else: # earlier slower qemu way 280*4882a593Smuzhiyun qemu = qemu_target_binary(d) 281*4882a593Smuzhiyun localedef_opts = "--force --no-hard-links --no-archive --prefix=%s \ 282*4882a593Smuzhiyun --inputfile=%s/i18n/locales/%s --charmap=%s %s" \ 283*4882a593Smuzhiyun % (treedir, datadir, locale, encoding, name) 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun qemu_options = d.getVar('QEMU_OPTIONS') 286*4882a593Smuzhiyun 287*4882a593Smuzhiyun cmd = "PSEUDO_RELOADED=YES PATH=\"%s\" I18NPATH=\"%s\" %s -L %s \ 288*4882a593Smuzhiyun -E LD_LIBRARY_PATH=%s %s %s${base_bindir}/localedef %s" % \ 289*4882a593Smuzhiyun (path, i18npath, qemu, treedir, ldlibdir, qemu_options, treedir, localedef_opts) 290*4882a593Smuzhiyun 291*4882a593Smuzhiyun commands["%s/%s" % (outputpath, name)] = cmd 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun bb.note("generating locale %s (%s)" % (locale, encoding)) 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun def output_locale(name, locale, encoding): 296*4882a593Smuzhiyun pkgname = d.getVar('MLPREFIX', False) + 'locale-base-' + legitimize_package_name(name) 297*4882a593Smuzhiyun d.setVar('ALLOW_EMPTY:%s' % pkgname, '1') 298*4882a593Smuzhiyun d.setVar('PACKAGES', '%s %s' % (pkgname, d.getVar('PACKAGES'))) 299*4882a593Smuzhiyun rprovides = ' %svirtual-locale-%s' % (mlprefix, legitimize_package_name(name)) 300*4882a593Smuzhiyun m = re.match(r"(.*)_(.*)", name) 301*4882a593Smuzhiyun if m: 302*4882a593Smuzhiyun rprovides += ' %svirtual-locale-%s' % (mlprefix, m.group(1)) 303*4882a593Smuzhiyun d.setVar('RPROVIDES:%s' % pkgname, rprovides) 304*4882a593Smuzhiyun 305*4882a593Smuzhiyun if use_bin == "compile": 306*4882a593Smuzhiyun output_locale_binary_rdepends(name, pkgname, locale, encoding) 307*4882a593Smuzhiyun output_locale_binary(name, pkgname, locale, encoding) 308*4882a593Smuzhiyun elif use_bin == "precompiled": 309*4882a593Smuzhiyun output_locale_binary_rdepends(name, pkgname, locale, encoding) 310*4882a593Smuzhiyun else: 311*4882a593Smuzhiyun output_locale_source(name, pkgname, locale, encoding) 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun if use_bin == "compile": 314*4882a593Smuzhiyun bb.note("preparing tree for binary locale generation") 315*4882a593Smuzhiyun bb.build.exec_func("do_prep_locale_tree", d) 316*4882a593Smuzhiyun 317*4882a593Smuzhiyun utf8_only = int(d.getVar('LOCALE_UTF8_ONLY') or 0) 318*4882a593Smuzhiyun utf8_is_default = int(d.getVar('LOCALE_UTF8_IS_DEFAULT') or 0) 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun encodings = {} 321*4882a593Smuzhiyun for locale in to_generate: 322*4882a593Smuzhiyun charset = supported[locale] 323*4882a593Smuzhiyun if utf8_only and charset != 'UTF-8': 324*4882a593Smuzhiyun continue 325*4882a593Smuzhiyun 326*4882a593Smuzhiyun m = dot_re.match(locale) 327*4882a593Smuzhiyun if m: 328*4882a593Smuzhiyun base = m.group(1) 329*4882a593Smuzhiyun else: 330*4882a593Smuzhiyun base = locale 331*4882a593Smuzhiyun 332*4882a593Smuzhiyun # Non-precompiled locales may be renamed so that the default 333*4882a593Smuzhiyun # (non-suffixed) encoding is always UTF-8, i.e., instead of en_US and 334*4882a593Smuzhiyun # en_US.UTF-8, we have en_US and en_US.ISO-8859-1. This implicitly 335*4882a593Smuzhiyun # contradicts SUPPORTED. 336*4882a593Smuzhiyun if use_bin == "precompiled" or not utf8_is_default: 337*4882a593Smuzhiyun output_locale(locale, base, charset) 338*4882a593Smuzhiyun else: 339*4882a593Smuzhiyun if charset == 'UTF-8': 340*4882a593Smuzhiyun output_locale(base, base, charset) 341*4882a593Smuzhiyun else: 342*4882a593Smuzhiyun output_locale('%s.%s' % (base, charset), base, charset) 343*4882a593Smuzhiyun 344*4882a593Smuzhiyun def metapkg_hook(file, pkg, pattern, format, basename): 345*4882a593Smuzhiyun name = basename.split('/', 1)[0] 346*4882a593Smuzhiyun metapkg = legitimize_package_name('%s-binary-localedata-%s' % (mlprefix+bpn, name)) 347*4882a593Smuzhiyun d.appendVar('RDEPENDS:%s' % metapkg, ' ' + pkg) 348*4882a593Smuzhiyun 349*4882a593Smuzhiyun if use_bin == "compile": 350*4882a593Smuzhiyun makefile = oe.path.join(d.getVar("WORKDIR"), "locale-tree", "Makefile") 351*4882a593Smuzhiyun with open(makefile, "w") as m: 352*4882a593Smuzhiyun m.write("all: %s\n\n" % " ".join(commands.keys())) 353*4882a593Smuzhiyun total = len(commands) 354*4882a593Smuzhiyun for i, (maketarget, makerecipe) in enumerate(commands.items()): 355*4882a593Smuzhiyun m.write(maketarget + ":\n") 356*4882a593Smuzhiyun m.write("\t@echo 'Progress %d/%d'\n" % (i, total)) 357*4882a593Smuzhiyun m.write("\t" + makerecipe + "\n\n") 358*4882a593Smuzhiyun d.setVar("EXTRA_OEMAKE", "-C %s ${PARALLEL_MAKE}" % (os.path.dirname(makefile))) 359*4882a593Smuzhiyun d.setVarFlag("oe_runmake", "progress", r"outof:Progress\s(\d+)/(\d+)") 360*4882a593Smuzhiyun bb.note("Executing binary locale generation makefile") 361*4882a593Smuzhiyun bb.build.exec_func("oe_runmake", d) 362*4882a593Smuzhiyun bb.note("collecting binary locales from locale tree") 363*4882a593Smuzhiyun bb.build.exec_func("do_collect_bins_from_locale_tree", d) 364*4882a593Smuzhiyun 365*4882a593Smuzhiyun if use_bin in ('compile', 'precompiled'): 366*4882a593Smuzhiyun lcsplit = d.getVar('GLIBC_SPLIT_LC_PACKAGES') 367*4882a593Smuzhiyun if lcsplit and int(lcsplit): 368*4882a593Smuzhiyun do_split_packages(d, binary_locales_dir, file_regex=r'^(.*/LC_\w+)', \ 369*4882a593Smuzhiyun output_pattern=bpn+'-binary-localedata-%s', \ 370*4882a593Smuzhiyun description='binary locale definition for %s', recursive=True, 371*4882a593Smuzhiyun hook=metapkg_hook, extra_depends='', allow_dirs=True, match_path=True) 372*4882a593Smuzhiyun else: 373*4882a593Smuzhiyun do_split_packages(d, binary_locales_dir, file_regex=r'(.*)', \ 374*4882a593Smuzhiyun output_pattern=bpn+'-binary-localedata-%s', \ 375*4882a593Smuzhiyun description='binary locale definition for %s', extra_depends='', allow_dirs=True) 376*4882a593Smuzhiyun else: 377*4882a593Smuzhiyun bb.note("generation of binary locales disabled. this may break i18n!") 378*4882a593Smuzhiyun 379*4882a593Smuzhiyun} 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun# We want to do this indirection so that we can safely 'return' 382*4882a593Smuzhiyun# from the called function even though we're prepending 383*4882a593Smuzhiyunpython populate_packages:prepend () { 384*4882a593Smuzhiyun bb.build.exec_func('package_do_split_gconvs', d) 385*4882a593Smuzhiyun} 386