Hi,

Currently locales are broken when you have:

$ grep LOCALE .config
UCLIBC_HAS_LOCALE=y
UCLIBC_PREGENERATED_LOCALE_DATA=y (or =n)
UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA=y (or =n)
UCLIBC_HAS_XLOCALE=y (doesn't matter)

A couple of headers are not found, most notably uClibc_ctype.h, and
extra/locale/* falls apart in various funny ways.

In an attempt to cure this, i'm proposing something like the
attached patchlet (which is untested).

So i'm asking anybody who uses locale to try the attached patch and to
let me know if it builds fine now (with -j1; I'm pretty sure that -j
will not work yet, we can fix that later).

TIA,
Bernhard
Index: Makefile.in
===================================================================
--- Makefile.in	(revision 23624)
+++ Makefile.in	(working copy)
@@ -153,8 +153,7 @@ headers-y += $(target-headers-sysdep)
 
 headers: include/bits/uClibc_config.h
 
-pregen: include/bits/sysnum.h headers
-	$(Q)$(if $(UCLIBC_HAS_LOCALE),$(MAKE) -C extra/locale locale_headers)
+pregen: include/bits/sysnum.h headers $(if $(UCLIBC_HAS_LOCALE),locale_headers)
 
 include/bits/sysnum.h: $(top_srcdir)extra/scripts/gen_bits_syscall_h.sh
 	$(Q)$(INSTALL) -d $(@D)
Index: extra/locale/Makefile.in
===================================================================
--- extra/locale/Makefile.in	(revision 23624)
+++ extra/locale/Makefile.in	(working copy)
@@ -5,6 +5,9 @@
 # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
 #
 
+locale_DIR := $(top_srcdir)extra/locale
+locale_OUT := $(top_builddir)extra/locale
+
 # command used to download source code
 WGET := wget --passive-ftp
 
@@ -12,7 +15,8 @@ LOCALE_DATA_FILENAME := uClibc-locale-03
 
 BUILD_CFLAGS-locale-common := \
 	-D__UCLIBC_GEN_LOCALE \
-	-DUCLIBC_CTYPE_HEADER='"$(top_builddir)include/bits/uClibc_ctype.h"'
+	-I$(top_builddir) \
+	-DUCLIBC_CTYPE_HEADER='"include/bits/uClibc_ctype.h"'
 
 BUILD_CFLAGS-gen_wc8bit := $(BUILD_CFLAGS-locale-common) -DCTYPE_PACKED=1
 
@@ -24,16 +28,13 @@ BUILD_CFLAGS-gen_wc8bit += -DDO_WIDE_CHA
 BUILD_CFLAGS-gen_ldc += -D__WCHAR_ENABLED=1
 endif
 
-BUILD_CFLAGS-gen_locale := -D_GNU_SOURCE
+BUILD_CFLAGS-gen_locale := -D_GNU_SOURCE -I$(locale_OUT)
 BUILD_CFLAGS-gen_collate := -D_GNU_SOURCE
 
 DEPH-locale := $(top_builddir)include/bits/sysnum.h
 DEPH-gen_locale := c8tables.h
 DEPH-gen_ldc := c8tables.h wctables.h locale_tables.h locale_collate.h
 
-locale_DIR := $(top_srcdir)extra/locale
-locale_OUT := $(top_builddir)extra/locale
-
 #locale_HOBJ := gen_collate gen_ldc gen_locale gen_wc8bit gen_wctype
 locale_HOBJ := gen_collate gen_wc8bit gen_wctype
 locale_HOBJ := $(patsubst %,$(locale_OUT)/%,$(locale_HOBJ))
@@ -62,7 +63,7 @@ $(locale_OUT)/codesets.txt:
 	    echo " "; \
 	    echo "You do not have a codesets.txt file.  Please create this "; \
 	    echo "file in the $(locale_OUT) directory by running something like: "; \
-	    echo -e "  find $(locale_DIR)/charmaps -name \"*.pairs\" > \\"; \
+	    echo -e "  cd $(locale_DIR) && find ./charmaps -name \"*.pairs\" > \\"; \
 	    echo -e "        $@"; \
 	    echo "and then edit that file to disable/enable the codesets you wish to support. "; \
 	    echo " "; \
@@ -88,10 +89,10 @@ else
 
 $(locale_OUT)/codesets.txt:
 ifeq ($(UCLIBC_BUILD_MINIMAL_LOCALE),y)
-	echo "$(locale_DIR)/charmaps/ASCII.pairs" > $@ ; \
-	echo "$(locale_DIR)/charmaps/ISO-8859-1.pairs" >> $@
+	echo "charmaps/ASCII.pairs" > $@ ; \
+	echo "charmaps/ISO-8859-1.pairs" >> $@
 else
-	find $(locale_DIR)/charmaps -name '*.pairs' | sort > $@
+	(cd $(locale_DIR)/ && find charmaps/ -name '*.pairs' | sort ) > $@
 endif
 
 # the lines beginning w/ '#-' are mandatory
@@ -123,15 +124,16 @@ $(locale_OUT)/gen_ldc : $(locale_DIR)/ge
 # code needs to be modified to support top_builddir in almost all apps that write directly to a file
 # grep fopen *.c
 $(locale_OUT)/c8tables.h: $(locale_OUT)/gen_wc8bit $(locale_OUT)/codesets.txt
-	$< `cat $(word 2,$^)`
+	(cd $(@D) && ./$(<F) `cat $(word 2,$(^F))`)
 
 # Warning! Beware tr_TR toupper/tolower exceptions!
 $(locale_OUT)/wctables.h: $(locale_OUT)/gen_wctype
-	$< en_US || $< en_US.UTF-8 || $< en_US.iso8859-1 \
-	|| $< en_GB || $< en_GB.UTF-8
+	(cd $(<D) ; ./$(<F) en_US || ./$(<F) en_US.UTF-8 \
+	|| ./$(<F) en_US.iso8859-1 \
+	|| ./$(<F) en_GB || ./$(<F) en_GB.UTF-8)
 
 $(locale_OUT)/locale_tables.h: $(locale_OUT)/gen_locale $(locale_OUT)/locales.txt
-	$< $(word 2,$^)
+	$< $(word 2,$^) $@
 
 $(locale_OUT)/lt_defines.h: $(locale_OUT)/locale_tables.h $(locale_OUT)/locale_collate.h
 	grep "^#define" $< > $@
@@ -139,7 +141,7 @@ $(locale_OUT)/lt_defines.h: $(locale_OUT
 
 $(locale_OUT)/locale_collate.h: $(locale_OUT)/gen_collate $(locale_OUT)/locale_tables.h
 	grep COL_IDX_ $(word 2,$^) | $(SED) -e "s/^.*COL_IDX_\([^, ]*\).*$$/\1/" | \
-		sort | uniq | xargs $<
+		sort | uniq | (cd $(dir $(<)) && xargs ./$(notdir $(<)))
 
 $(locale_OUT)/$(LOCALE_DATA_FILENAME):
 ifeq ($(UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA),y)
@@ -161,7 +163,7 @@ $(locale_OUT)/uClibc_locale_data.h: $(lo
 else
 
 $(locale_SRC): $(locale_OUT)/gen_ldc $(locale_OUT)/lt_defines.h
-	$<
+	$< $@
 
 $(locale_OUT)/uClibc_locale_data.h: $(locale_OUT)/lt_defines.h $(locale_OUT)/c8tables.h $(locale_OUT)/wctables.h $(locale_DIR)/locale_mmap.h | $(locale_SRC)
 	grep -v "define __LC" $< > $@
Index: extra/locale/gen_locale.c
===================================================================
--- extra/locale/gen_locale.c	(revision 23624)
+++ extra/locale/gen_locale.c	(working copy)
@@ -554,7 +554,8 @@ static int le_cmp(const void *a, const v
 
 int main(int argc, char **argv)
 {
-	if ((argc != 2) || (!(fp = fopen(*++argv, "r")))) {
+	char *output_file = "locale_tables.h";
+	if ((argc < 2 || argc > 3) || (!(fp = fopen(*++argv, "r")))) {
 		printf("error: missing filename or file!\n");
 		return EXIT_FAILURE;
 	}
@@ -580,9 +581,11 @@ int main(int argc, char **argv)
 			   );
 	}
 #endif
-
-	if (!(ofp = fopen("locale_tables.h", "w"))) {
-		printf("error: can not open locale_tables.h for writing!\n");
+	if (argc == 3)
+		output_file = *++argv;
+	if (output_file == NULL || !(ofp = fopen(output_file, "w"))) {
+		printf("error: can not open outputfile '%s' for writing!\n",
+			output_file);
 		return EXIT_FAILURE;
 	}
 
Index: extra/locale/gen_ldc.c
===================================================================
--- extra/locale/gen_ldc.c	(revision 23624)
+++ extra/locale/gen_ldc.c	(working copy)
@@ -148,8 +148,9 @@ void out_size_t(FILE *f, const size_t *p
 }
 
 
-int main(void)
+int main(int argc, char **argv)
 {
+	char *output_file = "locale_data.c";
 	FILE *lso;					/* static object */
 	int i;
 #ifdef __LOCALE_DATA_MAGIC_SIZE
@@ -158,8 +159,10 @@ int main(void)
 	memset(magic, 0, __LOCALE_DATA_MAGIC_SIZE);
 #endif /* __LOCALE_DATA_MAGIC_SIZE */
 
-	if (!(lso = fopen("locale_data.c", "w"))) {
-		printf("can't open locale_data.c!\n");
+	if (argc == 2)
+		output_file = argv[1];
+	if (!(lso = fopen(output_file, "w"))) {
+		printf("can't open output file '%s'!\n", output_file);
 		return EXIT_FAILURE;
 	}
 
_______________________________________________
uClibc mailing list
[email protected]
http://busybox.net/cgi-bin/mailman/listinfo/uclibc

Reply via email to