diff options
author | Nitin A Kamble <nitin.a.kamble@intel.com> | 2010-10-04 13:31:23 -0700 |
---|---|---|
committer | Richard Purdie <rpurdie@linux.intel.com> | 2010-10-07 22:53:28 +0100 |
commit | 2f19e2a1e6fe519f77b1d9611beadbfd2c74a22a (patch) | |
tree | 65dda95a7dd3471162678eaa63a9443d45e7385d /meta/classes/libc-package.bbclass | |
parent | 2e040618978b93d0add0e7e115c17545685c9dfc (diff) | |
download | poky-2f19e2a1e6fe519f77b1d9611beadbfd2c74a22a.tar.gz |
libc-package.bbclass, eglibc, glibc: enable locales generation using cross-localedef
Along with qemu this provides another option to generate locales for
[e]glibc. The new method is to use cross-localedef with appropriate arch
specific parameters.
The cross-localedef method is found to be 15 times faster than qemu's
emnualted method.
LOCALE_GENERATION_WITH_CROSS-LOCALEDEF : This is new config variable
introduced to selet qemu or cross-localedef method for locale generation.
Thanks to Mark Hatle from Windriver for providing the rich
information for cross locale generation.
Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com>
Diffstat (limited to 'meta/classes/libc-package.bbclass')
-rw-r--r-- | meta/classes/libc-package.bbclass | 73 |
1 files changed, 61 insertions, 12 deletions
diff --git a/meta/classes/libc-package.bbclass b/meta/classes/libc-package.bbclass index 1c034e09be..4709b33c0e 100644 --- a/meta/classes/libc-package.bbclass +++ b/meta/classes/libc-package.bbclass | |||
@@ -9,7 +9,29 @@ | |||
9 | 9 | ||
10 | GLIBC_INTERNAL_USE_BINARY_LOCALE ?= "ondevice" | 10 | GLIBC_INTERNAL_USE_BINARY_LOCALE ?= "ondevice" |
11 | 11 | ||
12 | inherit qemu | 12 | python __anonymous () { |
13 | enabled = bb.data.getVar("ENABLE_BINARY_LOCALE_GENERATION", d, 1) | ||
14 | |||
15 | if enabled and int(enabled): | ||
16 | import re | ||
17 | |||
18 | target_arch = bb.data.getVar("TARGET_ARCH", d, 1) | ||
19 | binary_arches = bb.data.getVar("BINARY_LOCALE_ARCHES", d, 1) or "" | ||
20 | use_cross_localedef = bb.data.getVar("LOCALE_GENERATION_WITH_CROSS-LOCALEDEF", d, 1) or "" | ||
21 | |||
22 | for regexp in binary_arches.split(" "): | ||
23 | r = re.compile(regexp) | ||
24 | |||
25 | if r.match(target_arch): | ||
26 | depends = bb.data.getVar("DEPENDS", d, 1) | ||
27 | if use_cross_localedef == "1" : | ||
28 | depends = "%s cross-localedef-native" % depends | ||
29 | else: | ||
30 | depends = "%s qemu-native" % depends | ||
31 | bb.data.setVar("DEPENDS", depends, d) | ||
32 | bb.data.setVar("GLIBC_INTERNAL_USE_BINARY_LOCALE", "compile", d) | ||
33 | break | ||
34 | } | ||
13 | 35 | ||
14 | def get_libc_fpu_setting(bb, d): | 36 | def get_libc_fpu_setting(bb, d): |
15 | if bb.data.getVar('TARGET_FPU', d, 1) in [ 'soft' ]: | 37 | if bb.data.getVar('TARGET_FPU', d, 1) in [ 'soft' ]: |
@@ -105,6 +127,8 @@ do_collect_bins_from_locale_tree() { | |||
105 | cp -pPR $treedir/${libdir}/locale ${PKGD}${libdir} | 127 | cp -pPR $treedir/${libdir}/locale ${PKGD}${libdir} |
106 | } | 128 | } |
107 | 129 | ||
130 | inherit qemu | ||
131 | |||
108 | python package_do_split_gconvs () { | 132 | python package_do_split_gconvs () { |
109 | import os, re | 133 | import os, re |
110 | if (bb.data.getVar('PACKAGE_NO_GCONV', d, 1) == '1'): | 134 | if (bb.data.getVar('PACKAGE_NO_GCONV', d, 1) == '1'): |
@@ -251,24 +275,49 @@ python package_do_split_gconvs () { | |||
251 | bb.data.setVar('RPROVIDES_%s' % pkgname, " ".join(rprovides), d) | 275 | bb.data.setVar('RPROVIDES_%s' % pkgname, " ".join(rprovides), d) |
252 | 276 | ||
253 | def output_locale_binary(name, pkgname, locale, encoding): | 277 | def output_locale_binary(name, pkgname, locale, encoding): |
254 | qemu = qemu_target_binary(d) | ||
255 | |||
256 | treedir = base_path_join(bb.data.getVar("WORKDIR", d, 1), "locale-tree") | 278 | treedir = base_path_join(bb.data.getVar("WORKDIR", d, 1), "locale-tree") |
257 | ldlibdir = "%s/lib" % treedir | 279 | ldlibdir = "%s/lib" % treedir |
258 | path = bb.data.getVar("PATH", d, 1) | 280 | path = bb.data.getVar("PATH", d, 1) |
259 | i18npath = base_path_join(treedir, datadir, "i18n") | 281 | i18npath = base_path_join(treedir, datadir, "i18n") |
282 | gconvpath = base_path_join(treedir, "iconvdata") | ||
283 | |||
284 | use_cross_localedef = bb.data.getVar("LOCALE_GENERATION_WITH_CROSS-LOCALEDEF", d, 1) or "0" | ||
285 | if use_cross_localedef == "1": | ||
286 | target_arch = bb.data.getVar('TARGET_ARCH', d, True) | ||
287 | locale_arch_options = { \ | ||
288 | "arm": " --uint32-align=4 --little-endian ", \ | ||
289 | "powerpc": " --uint32-align=4 --big-endian ", \ | ||
290 | "mips": " --uint32-align=4 --big-endian ", \ | ||
291 | "mipsel": " --uint32-align=4 --little-endian ", \ | ||
292 | "i586": " --uint32-align=4 --little-endian ", \ | ||
293 | "x86_64": " --uint32-align=4 --little-endian " } | ||
294 | |||
295 | if target_arch in locale_arch_options: | ||
296 | localedef_opts = locale_arch_options[target_arch] | ||
297 | else: | ||
298 | bb.error("locale_arch_options not found for target_arch=" + target_arch) | ||
299 | raise bb.build.FuncFailed("unknown arch:" + target_arch + " for locale_arch_options") | ||
300 | |||
301 | localedef_opts += " --force --old-style --no-archive --prefix=%s \ | ||
302 | --inputfile=%s/%s/i18n/locales/%s --charmap=%s %s/usr/lib/locale/%s" \ | ||
303 | % (treedir, treedir, datadir, locale, encoding, treedir, name) | ||
304 | |||
305 | cmd = "PATH=\"%s\" I18NPATH=\"%s\" GCONV_PATH=\"%s\" cross-localedef %s" % \ | ||
306 | (path, i18npath, gconvpath, localedef_opts) | ||
307 | else: # earlier slower qemu way | ||
308 | qemu = qemu_target_binary(d) | ||
309 | localedef_opts = "--force --old-style --no-archive --prefix=%s \ | ||
310 | --inputfile=%s/i18n/locales/%s --charmap=%s %s" \ | ||
311 | % (treedir, datadir, locale, encoding, name) | ||
260 | 312 | ||
261 | localedef_opts = "--force --old-style --no-archive --prefix=%s \ | 313 | qemu_options = bb.data.getVar("QEMU_OPTIONS_%s" % bb.data.getVar('PACKAGE_ARCH', d, 1), d, 1) |
262 | --inputfile=%s/i18n/locales/%s --charmap=%s %s" \ | 314 | if not qemu_options: |
263 | % (treedir, datadir, locale, encoding, name) | 315 | qemu_options = bb.data.getVar('QEMU_OPTIONS', d, 1) |
264 | 316 | ||
265 | qemu_options = bb.data.getVar("QEMU_OPTIONS_%s" % bb.data.getVar('PACKAGE_ARCH', d, 1), d, 1) | 317 | cmd = "PSEUDO_RELOADED=YES PATH=\"%s\" I18NPATH=\"%s\" %s -L %s \ |
266 | if not qemu_options: | 318 | -E LD_LIBRARY_PATH=%s %s %s/bin/localedef %s" % \ |
267 | qemu_options = bb.data.getVar('QEMU_OPTIONS', d, 1) | 319 | (path, i18npath, qemu, treedir, ldlibdir, qemu_options, treedir, localedef_opts) |
268 | 320 | ||
269 | cmd = "PSEUDO_RELOADED=YES PATH=\"%s\" I18NPATH=\"%s\" %s -L %s \ | ||
270 | -E LD_LIBRARY_PATH=%s %s %s/bin/localedef %s" % \ | ||
271 | (path, i18npath, qemu, treedir, ldlibdir, qemu_options, treedir, localedef_opts) | ||
272 | bb.note("generating locale %s (%s)" % (locale, encoding)) | 321 | bb.note("generating locale %s (%s)" % (locale, encoding)) |
273 | import subprocess | 322 | import subprocess |
274 | process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) | 323 | process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) |