diff --git a/Makefile b/Makefile index 74c238cb20..d3c67c20d4 100644 --- a/Makefile +++ b/Makefile @@ -663,32 +663,17 @@ endef TARGET_FINALIZE_HOOKS += TOOLCHAIN_ECLIPSE_REGISTER endif -# Generate locale data. Basically, we call the localedef program -# (built by the host-localedef package) for each locale. The input -# data comes preferably from the toolchain, or if the toolchain does -# not have them (Linaro toolchains), we use the ones available on the -# host machine. +# Generate locale data. ifeq ($(BR2_TOOLCHAIN_USES_GLIBC),y) GLIBC_GENERATE_LOCALES = $(call qstrip,$(BR2_GENERATE_LOCALE)) ifneq ($(GLIBC_GENERATE_LOCALES),) PACKAGES += host-localedef define GENERATE_GLIBC_LOCALES - $(Q)mkdir -p $(TARGET_DIR)/usr/lib/locale/ - $(Q)for locale in $(GLIBC_GENERATE_LOCALES) ; do \ - inputfile=`echo $${locale} | cut -f1 -d'.'` ; \ - charmap=`echo $${locale} | cut -f2 -d'.' -s` ; \ - if test -z "$${charmap}" ; then \ - charmap="UTF-8" ; \ - fi ; \ - echo "Generating locale $${inputfile}.$${charmap}" ; \ - I18NPATH=$(STAGING_DIR)/usr/share/i18n:/usr/share/i18n \ - $(HOST_DIR)/bin/localedef \ - --prefix=$(TARGET_DIR) \ - --$(call LOWERCASE,$(BR2_ENDIAN))-endian \ - -i $${inputfile} -f $${charmap} \ - $${locale} ; \ - done + $(MAKE) -f support/misc/gen-glibc-locales.mk \ + ENDIAN=$(call LOWERCASE,$(BR2_ENDIAN)) \ + LOCALES="$(GLIBC_GENERATE_LOCALES)" \ + Q=$(Q) endef TARGET_FINALIZE_HOOKS += GENERATE_GLIBC_LOCALES endif diff --git a/support/misc/gen-glibc-locales.mk b/support/misc/gen-glibc-locales.mk new file mode 100644 index 0000000000..3db1e0dc11 --- /dev/null +++ b/support/misc/gen-glibc-locales.mk @@ -0,0 +1,41 @@ +# Generates glibc locale data for target. + +inputfile = $(firstword $(subst ., ,$(1))) +charmap = $(or $(word 2,$(subst ., ,$(1))),UTF-8) + +# Packages all the generated locale data into the final archive. +# +# We sort the file names to produce consistent output regardless of +# the `find` outputs order. +$(TARGET_DIR)/usr/lib/locale/locale-archive: $(LOCALES) + $(Q)rm -f $(@) + $(Q)find $(TARGET_DIR)/usr/lib/locale/ -maxdepth 1 -mindepth 1 -type d -print0 \ + | sort -z \ + | xargs -0 \ + $(HOST_DIR)/bin/localedef \ + --prefix=$(TARGET_DIR) \ + --$(ENDIAN)-endian \ + --add-to-archive + +# Generates locale data for each locale. +# +# The input data comes preferably from the toolchain, or if the toolchain +# does not have them (Linaro toolchains), we use the ones available on the +# host machine. +# +# Uses `localedef`, which is built by the `host-localedef` package. +$(LOCALES): | $(TARGET_DIR)/usr/lib/locale/ + $(Q)echo "Generating locale $(@)" + $(Q)I18NPATH=$(STAGING_DIR)/usr/share/i18n:/usr/share/i18n \ + $(HOST_DIR)/bin/localedef \ + --prefix=$(TARGET_DIR) \ + --$(ENDIAN)-endian \ + --no-archive \ + -i $(call inputfile,$(@)) \ + -f $(call charmap,$(@)) \ + $(@) + +.PHONY: $(LOCALES) + +$(TARGET_DIR)/usr/lib/locale/: + $(Q)mkdir -p $(TARGET_DIR)/usr/lib/locale/