diff options
| -rw-r--r-- | Makefile | 61 | ||||
| -rw-r--r-- | make/binutils-uclibc.mk | 105 | ||||
| -rw-r--r-- | make/binutils.mk | 4 | ||||
| -rw-r--r-- | make/gcc-2.95.mk | 2 | ||||
| -rw-r--r-- | make/gcc-3.3.mk | 6 | ||||
| -rw-r--r-- | make/gcc-uclibc-2.95.mk | 270 | ||||
| -rw-r--r-- | make/gcc-uclibc-3.3.mk | 235 | ||||
| -rw-r--r-- | make/uclibc.mk | 82 | ||||
| -rw-r--r-- | sources/STLport-4.5.3.patch | 106 | ||||
| -rw-r--r-- | sources/binutils-uclibc-001-debian.patch | 185 | ||||
| -rw-r--r-- | sources/binutils-uclibc-100-conf.patch | 646 | ||||
| -rw-r--r-- | sources/binutils-uclibc-200-build_modules.patch | 31 | ||||
| -rw-r--r-- | sources/gcc-uclibc-3.3-100-conf.patch | 1850 | ||||
| -rw-r--r-- | sources/gcc-uclibc-3.3-110-conf.patch | 63 | ||||
| -rw-r--r-- | sources/gcc-uclibc-3.3-200-code.patch | 3021 | ||||
| -rw-r--r-- | sources/gcc2.95-uclibc-conf.patch | 291 | ||||
| -rw-r--r-- | sources/uClibc.config | 13 | ||||
| -rw-r--r-- | sources/uClibc.config-locale | 19 | 
18 files changed, 6886 insertions, 104 deletions
| @@ -46,17 +46,26 @@ ARCH:=i386  #ARCH:=sparc  #ARCH:=whatever +# Enable this if you want to use an <arch>-linux-uclibc-* toolchain. +# Note that, to avoid configure problems with apps that don't support +# this tupple, we also put <arch>-linux-* symlinks in staging_dir/bin. +# WARNING -- This does not yet support soft-float builds. +USE_LINUX_UCLIBC:=true +#USE_LINUX_UCLIBC:=false +  # If you are building a native gcc toolchain, do you want to  # build the old gcc-2.95 based toolchain, or would you prefer  # a nice and shiny new gcc-3.3.2 toolchain? -# WARNING -- 2.95 currently does not build. +# WARNING -- 2.95 currently does not build unless USE_LINUX_UCLIBC:=true. +# WARNING -- 2.95 currently only builds for i386, arm, mips*, and powerpc. +# WARNING -- 2.95 does not currently build natively for the target. +#GCC_2_95_TOOLCHAIN:=true  GCC_2_95_TOOLCHAIN:=false -# WARNING -- 2.95 currently does not build.  # Enable this to use the uClibc daily snapshot instead of a released  # version.  Daily snapshots may contain new features and bugfixes. Or  # they may not even compile at all, depending on what Erik is doing... -USE_UCLIBC_SNAPSHOT:=false +USE_UCLIBC_SNAPSHOT:=true  # Enable this to use the busybox daily snapshot instead of a released  # version.  Daily snapshots may contain new features and bugfixes. Or @@ -70,12 +79,15 @@ BUILD_WITH_LARGEFILE:=true  WGET:=wget --passive-ftp  # Optimize toolchain for which type of CPU? +ifeq ($(USE_LINUX_UCLIBC),true) +OPTIMIZE_FOR_CPU=$(ARCH) +#OPTIMIZE_FOR_CPU=i686 +#OPTIMIZE_FOR_CPU=whatever +else  # WARNING!!!  CURRENTLY BROKEN!!! LEAVE IT AS $(ARCH)!!!  OPTIMIZE_FOR_CPU=$(ARCH)  # WARNING!!!  CURRENTLY BROKEN!!! LEAVE IT AS $(ARCH)!!! -#OPTIMIZE_FOR_CPU=i486 -#OPTIMIZE_FOR_CPU=strongarm -#OPTIMIZE_FOR_CPU=whatever +endif  # Soft floating point options.  # Notes: @@ -200,6 +212,11 @@ TARGETS+=ext2root  #  ############################################################# +# The new stuff doesn't support soft float yet. +ifeq ($(USE_LINUX_UCLIBC),true) +SOFT_FLOAT:=false +endif +  ifeq ($(SOFT_FLOAT),true)  SOFT_FLOAT_CONFIG_OPTION:=--without-float  TARGET_SOFT_FLOAT:=-msoft-float @@ -210,9 +227,13 @@ TARGET_SOFT_FLOAT:=  ARCH_FPU_SUFFIX:=  endif +# The new stuff auto-detects approrpriate locale support. +# So only set this for the old 'hacked' toolchain. +ifneq ($(USE_LINUX_UCLIBC),true)  ifeq ($(ENABLE_LOCALE),true)  EXTRA_GCC_CONFIG_OPTIONS += --enable-clocale=gnu  endif +endif  # WARNING -- uClibc currently disables large file support on cris.  ifeq ("$(strip $(ARCH))","cris") @@ -234,15 +255,24 @@ TARGET_DIR:=$(BUILD_DIR)/root  STAGING_DIR=$(BUILD_DIR)/staging_dir  TOOL_BUILD_DIR=$(BASE_DIR)/toolchain_build_$(ARCH)$(ARCH_FPU_SUFFIX)  TARGET_PATH=$(STAGING_DIR)/bin:/bin:/sbin:/usr/bin:/usr/sbin -#TARGET_CROSS=$(STAGING_DIR)/bin/$(ARCH)-uclibc- -TARGET_CROSS=$(STAGING_DIR)/bin/$(ARCH)-linux- -TARGET_CC=$(TARGET_CROSS)gcc$(TARGET_SOFT_FLOAT) -STRIP=$(TARGET_CROSS)strip --remove-section=.comment --remove-section=.note -#STRIP:=/bin/true  IMAGE:=$(BASE_DIR)/root_fs_$(ARCH)$(ARCH_FPU_SUFFIX) + +ifeq ($(USE_LINUX_UCLIBC),true) +REAL_GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux-uclibc +GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux +KERNEL_CROSS=$(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc- +TARGET_CROSS=$(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc- +else +REAL_GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux  GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux -#KERNEL_CROSS=$(STAGING_DIR)/bin/$(ARCH)-uclibc- -KERNEL_CROSS=$(STAGING_DIR)/bin/$(ARCH)-linux- +KERNEL_CROSS=$(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux- +TARGET_CROSS=$(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux- +endif + +TARGET_CC=$(TARGET_CROSS)gcc$(TARGET_SOFT_FLOAT) +STRIP=$(TARGET_CROSS)strip --remove-section=.comment --remove-section=.note + +  HOST_ARCH:=$(shell $(HOSTCC) -dumpmachine | sed -e s'/-.*//' \  	-e 's/sparc.*/sparc/' \  	-e 's/arm.*/arm/g' \ @@ -301,7 +331,12 @@ $(STAGING_DIR):  	rm -rf $(STAGING_DIR)  	mkdir -p $(STAGING_DIR)/lib  	mkdir -p $(STAGING_DIR)/usr +ifneq ($(GCC_2_95_TOOLCHAIN),true)  	mkdir -p $(STAGING_DIR)/include +else +	mkdir -p $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include +	(cd $(STAGING_DIR); ln -fs $(REAL_GNU_TARGET_NAME)/include) +endif  	ln -fs ../lib $(STAGING_DIR)/usr/lib  $(TARGET_DIR): diff --git a/make/binutils-uclibc.mk b/make/binutils-uclibc.mk new file mode 100644 index 000000000..2a790bde5 --- /dev/null +++ b/make/binutils-uclibc.mk @@ -0,0 +1,105 @@ +ifeq ($(USE_LINUX_UCLIBC),true) +############################################################# +# +# build binutils for use on the host system +# +############################################################# +BINUTILS_SITE:=http://ftp.kernel.org/pub/linux/devel/binutils +BINUTILS_SOURCE:=binutils-2.14.90.0.6.tar.bz2 +BINUTILS_DIR:=$(TOOL_BUILD_DIR)/binutils-2.14.90.0.6 +BINUTILS_CAT:=bzcat + +BINUTILS_DIR1:=$(TOOL_BUILD_DIR)/binutils-build + +$(DL_DIR)/$(BINUTILS_SOURCE): +	$(WGET) -P $(DL_DIR) $(BINUTILS_SITE)/$(BINUTILS_SOURCE) + +$(BINUTILS_DIR)/.unpacked: $(STAGING_DIR) $(DL_DIR)/$(BINUTILS_SOURCE) +	mkdir -p $(TOOL_BUILD_DIR) +	mkdir -p $(DL_DIR) +	$(BINUTILS_CAT) $(DL_DIR)/$(BINUTILS_SOURCE) | tar -C $(TOOL_BUILD_DIR) -xvf - +	touch $(BINUTILS_DIR)/.unpacked + +$(BINUTILS_DIR)/.patched: $(BINUTILS_DIR)/.unpacked +	# Apply any files named binutils-*.patch from the source directory to binutils +	$(SOURCE_DIR)/patch-kernel.sh $(BINUTILS_DIR) $(SOURCE_DIR) binutils-uclibc*.patch +	touch $(BINUTILS_DIR)/.patched + +$(BINUTILS_DIR1)/.configured: $(BINUTILS_DIR)/.patched +	mkdir -p $(BINUTILS_DIR1) +	(cd $(BINUTILS_DIR1); \ +		$(BINUTILS_DIR)/configure \ +		--prefix=$(STAGING_DIR) \ +		--build=$(GNU_HOST_NAME) \ +		--host=$(GNU_HOST_NAME) \ +		--target=$(REAL_GNU_TARGET_NAME) \ +		$(MULTILIB) \ +		$(SOFT_FLOAT_CONFIG_OPTION) ); +	touch $(BINUTILS_DIR1)/.configured + +$(BINUTILS_DIR1)/binutils/objdump: $(BINUTILS_DIR1)/.configured +	$(MAKE) $(JLEVEL) -C $(BINUTILS_DIR1) all + +# Make install will put gettext data in staging_dir/share/locale. +# Unfortunatey, it isn't configureable. +$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/bin/ld: $(BINUTILS_DIR1)/binutils/objdump  +	$(MAKE) $(JLEVEL) -C $(BINUTILS_DIR1) install + +binutils: $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/bin/ld + +binutils-source: $(DL_DIR)/$(BINUTILS_SOURCE) + +binutils-clean: +	rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* +	-$(MAKE) -C $(BINUTILS_DIR1) clean + +binutils-dirclean: +	rm -rf $(BINUTILS_DIR1) + + + +############################################################# +# +# build binutils for use on the target system +# +############################################################# +BINUTILS_DIR2:=$(BUILD_DIR)/binutils-target +$(BINUTILS_DIR2)/.configured: $(BINUTILS_DIR)/.patched +	mkdir -p $(BINUTILS_DIR2) +	(cd $(BINUTILS_DIR2); \ +		PATH=$(TARGET_PATH) \ +		CFLAGS="$(TARGET_CFLAGS)" \ +		$(BINUTILS_DIR)/configure \ +		--prefix=/usr \ +		--exec-prefix=/usr \ +		--build=$(GNU_HOST_NAME) \ +		--host=$(REAL_GNU_TARGET_NAME) \ +		--target=$(REAL_GNU_TARGET_NAME) \ +		$(MULTILIB) \ +		$(SOFT_FLOAT_CONFIG_OPTION) ); +	touch $(BINUTILS_DIR2)/.configured + +$(BINUTILS_DIR2)/binutils/objdump: $(BINUTILS_DIR2)/.configured +	PATH=$(TARGET_PATH) \ +	$(MAKE) $(JLEVEL) -C $(BINUTILS_DIR2) all + +$(TARGET_DIR)/usr/bin/ld: $(BINUTILS_DIR2)/binutils/objdump  +	PATH=$(TARGET_PATH) \ +	$(MAKE) $(JLEVEL) DESTDIR=$(TARGET_DIR) \ +		tooldir=/usr build_tooldir=/usr \ +		-C $(BINUTILS_DIR2) install +	#rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ +	#	$(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc +	-$(STRIP) $(TARGET_DIR)/usr/$(REAL_GNU_TARGET_NAME)/bin/* > /dev/null 2>&1 +	-$(STRIP) $(TARGET_DIR)/usr/bin/* > /dev/null 2>&1  + +binutils_target: $(GCC_DEPENDANCY) $(TARGET_DIR)/usr/bin/ld + +binutils_target-clean: +	rm -f $(TARGET_DIR)/bin/$(REAL_GNU_TARGET_NAME)* +	-$(MAKE) -C $(BINUTILS_DIR2) clean + +binutils_target-dirclean: +	rm -rf $(BINUTILS_DIR2) + +endif	#ifeq ($(USE_LINUX_UCLIBC),true) diff --git a/make/binutils.mk b/make/binutils.mk index 291ee62ce..c66a3d38f 100644 --- a/make/binutils.mk +++ b/make/binutils.mk @@ -1,3 +1,4 @@ +ifneq ($(USE_LINUX_UCLIBC),true)  #############################################################  #  # build binutils for use on the host system @@ -28,7 +29,7 @@ $(BINUTILS_DIR)/.unpacked: $(DL_DIR)/$(BINUTILS_SOURCE)  $(BINUTILS_DIR)/.patched: $(BINUTILS_DIR)/.unpacked  	# Apply any files named binutils-*.patch from the source directory to binutils -	$(SOURCE_DIR)/patch-kernel.sh $(BINUTILS_DIR) $(SOURCE_DIR) binutils-*.patch +	$(SOURCE_DIR)/patch-kernel.sh $(BINUTILS_DIR) $(SOURCE_DIR) binutils-[0-9]*.patch  	touch $(BINUTILS_DIR)/.patched  $(BINUTILS_DIR1)/.configured: $(BINUTILS_DIR)/.patched @@ -207,3 +208,4 @@ binutils_target-clean:  binutils_target-dirclean:  	rm -rf $(BINUTILS_DIR2) +endif	#ifneq ($(USE_LINUX_UCLIBC),true) diff --git a/make/gcc-2.95.mk b/make/gcc-2.95.mk index 2d2ae8e93..dbb8558c6 100644 --- a/make/gcc-2.95.mk +++ b/make/gcc-2.95.mk @@ -16,6 +16,7 @@  # along with this program; if not, write to the Free Software  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +ifneq ($(USE_LINUX_UCLIBC),true)  ifeq ($(GCC_2_95_TOOLCHAIN),true)  GCC_SITE:=http://www.uclibc.org/downloads/toolchain @@ -294,3 +295,4 @@ gcc2_95-dirclean:  	rm -rf $(GCC_BUILD_DIR2)  endif +endif	#ifneq ($(USE_LINUX_UCLIBC),true) diff --git a/make/gcc-3.3.mk b/make/gcc-3.3.mk index a12b59aff..243c20c91 100644 --- a/make/gcc-3.3.mk +++ b/make/gcc-3.3.mk @@ -16,6 +16,7 @@  # along with this program; if not, write to the Free Software  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +ifneq ($(USE_LINUX_UCLIBC),true)  ifneq ($(GCC_2_95_TOOLCHAIN),true)  # Older stuff... @@ -67,7 +68,7 @@ $(GCC_DIR)/.unpacked: $(DL_DIR)/$(GCC_SOURCE)  $(GCC_DIR)/.patched: $(GCC_DIR)/.unpacked  	# Apply any files named gcc-*.patch from the source directory to gcc -	$(SOURCE_DIR)/patch-kernel.sh $(GCC_DIR) $(SOURCE_DIR) gcc-*.patch +	$(SOURCE_DIR)/patch-kernel.sh $(GCC_DIR) $(SOURCE_DIR) gcc-[0-9]*.patch  ifeq ($(SOFT_FLOAT),true)  ifeq ("$(strip $(ARCH))","i386")  	$(SOURCE_DIR)/patch-kernel.sh $(GCC_DIR) $(SOURCE_DIR) i386-gcc-soft-float.patch @@ -360,7 +361,7 @@ $(GCC_BUILD_DIR3)/.unpacked: $(DL_DIR)/$(GCC_SOURCE)  $(GCC_BUILD_DIR3)/.patched: $(GCC_BUILD_DIR3)/.unpacked  	# Apply any files named gcc-*.patch from the source directory to gcc -	$(SOURCE_DIR)/patch-kernel.sh $(GCC_BUILD_DIR3) $(SOURCE_DIR) gcc-*.patch +	$(SOURCE_DIR)/patch-kernel.sh $(GCC_BUILD_DIR3) $(SOURCE_DIR) gcc-[0-9]**.patch  ifeq ("$(strip $(ARCH))","i386")  	$(SOURCE_DIR)/patch-kernel.sh $(GCC_BUILD_DIR3) $(SOURCE_DIR) i386-gcc-*.patch  endif @@ -451,3 +452,4 @@ gcc3_3_target-dirclean:  	rm -rf $(GCC_BUILD_DIR3)  endif +endif	#ifneq ($(USE_LINUX_UCLIBC),true) diff --git a/make/gcc-uclibc-2.95.mk b/make/gcc-uclibc-2.95.mk new file mode 100644 index 000000000..1feb98bf3 --- /dev/null +++ b/make/gcc-uclibc-2.95.mk @@ -0,0 +1,270 @@ +# Makefile for to build a gcc/uClibc toolchain +# +# Copyright (C) 2002-2003 Erik Andersen <andersen@uclibc.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +ifeq ($(USE_LINUX_UCLIBC),true) +ifeq ($(GCC_2_95_TOOLCHAIN),true) + +GCC_SITE:=http://www.uclibc.org/downloads/toolchain +GCC_SOURCE:=gcc-20011006.tar.bz2 +GCC_DIR:=$(TOOL_BUILD_DIR)/gcc-20011006 +GCC_CAT:=bzcat + +STLPORT_SITE=http://www.stlport.org/archive +STLPORT_SOURCE=STLport-4.5.3.tar.gz +STLPORT_DIR=$(TOOL_BUILD_DIR)/STLport-4.5.3 + +############################################################# +# +# Setup some initial stuff +# +############################################################# + +ifeq ($(INSTALL_LIBSTDCPP),true) +TARGET_LANGUAGES:=c,c++ +STLPORT_TARGET=stlport +else +TARGET_LANGUAGES:=c +STLPORT_TARGET= +endif + +############################################################# +# +# build the first pass gcc compiler +# +############################################################# +GCC_BUILD_DIR1:=$(TOOL_BUILD_DIR)/gcc2_95-initial + +$(DL_DIR)/$(GCC_SOURCE): +	$(WGET) -P $(DL_DIR) $(GCC_SITE)/$(GCC_SOURCE) + +$(GCC_DIR)/.unpacked: $(DL_DIR)/$(GCC_SOURCE) +	$(GCC_CAT) $(DL_DIR)/$(GCC_SOURCE) | tar -C $(TOOL_BUILD_DIR) -xvf - +	touch $(GCC_DIR)/.unpacked + +$(GCC_DIR)/.patched: $(GCC_DIR)/.unpacked +	# Apply any files named gcc-*.patch from the source directory to gcc +	$(SOURCE_DIR)/patch-kernel.sh $(GCC_DIR) $(SOURCE_DIR) gcc2.95-mega.patch.bz2 +	$(SOURCE_DIR)/patch-kernel.sh $(GCC_DIR) $(SOURCE_DIR) gcc2.95-uclibc-conf.patch +	#$(SOURCE_DIR)/patch-kernel.sh $(GCC_DIR) $(SOURCE_DIR) gcc-uclibc2_95*.patch +	# +	# We do not wish to build the libstdc++ library provided with gcc, +	# since it doesn't seem to work at all with uClibc plus gcc 2.95... +	# +	mv $(GCC_DIR)/libstdc++ $(GCC_DIR)/libstdc++.orig +	mv $(GCC_DIR)/libio $(GCC_DIR)/libio.orig +	# +	touch $(GCC_DIR)/.patched + +# The --without-headers option stopped working with gcc 3.0 and has never been +# # fixed, so we need to actually have working C library header files prior to +# # the step or libgcc will not build... +$(GCC_BUILD_DIR1)/.configured: $(GCC_DIR)/.patched +	mkdir -p $(GCC_BUILD_DIR1) +	(cd $(GCC_BUILD_DIR1); PATH=$(TARGET_PATH) \ +		$(GCC_DIR)/configure \ +		--prefix=$(STAGING_DIR) \ +		--build=$(GNU_HOST_NAME) \ +		--host=$(GNU_HOST_NAME) \ +		--target=$(REAL_GNU_TARGET_NAME) \ +		--enable-languages=c \ +		--disable-shared \ +		--includedir=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include \ +		--disable-__cxa_atexit \ +		--enable-target-optspace \ +		--with-gnu-ld \ +		$(DISABLE_NLS) \ +		$(MULTILIB) \ +		$(SOFT_FLOAT_CONFIG_OPTION) \ +		$(EXTRA_GCC_CONFIG_OPTIONS)); +	touch $(GCC_BUILD_DIR1)/.configured + +$(GCC_BUILD_DIR1)/.compiled: $(GCC_BUILD_DIR1)/.configured +	PATH=$(TARGET_PATH) $(MAKE) $(JLEVEL) -C $(GCC_BUILD_DIR1) all-gcc +	touch $(GCC_BUILD_DIR1)/.compiled + +$(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc: $(GCC_BUILD_DIR1)/.compiled +	PATH=$(TARGET_PATH) $(MAKE) $(JLEVEL) -C $(GCC_BUILD_DIR1) install-gcc +	#rm -f $(STAGING_DIR)/bin/gccbug $(STAGING_DIR)/bin/gcov +	#rm -rf $(STAGING_DIR)/info $(STAGING_DIR)/man $(STAGING_DIR)/share/doc $(STAGING_DIR)/share/locale + +gcc2_95_initial: uclibc-configured binutils $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc + +gcc2_95_initial-clean: +	rm -rf $(GCC_BUILD_DIR1) +	rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc2_95_initial-dirclean: +	rm -rf $(GCC_BUILD_DIR1) + +############################################################# +# +# STLport -- an alternative C++ library +# +############################################################# +STLPORT_PATCH=$(SOURCE_DIR)/STLport-4.5.3.patch + +$(DL_DIR)/$(STLPORT_SOURCE): +	$(WGET) -P $(DL_DIR) $(STLPORT_SITE)/$(STLPORT_SOURCE) + +$(STLPORT_DIR)/Makefile: $(DL_DIR)/$(STLPORT_SOURCE) $(STLPORT_PATCH) +	zcat $(DL_DIR)/$(STLPORT_SOURCE) | tar -C $(TOOL_BUILD_DIR) -xvf -  +	cat $(STLPORT_PATCH) | patch -d $(STLPORT_DIR) -p1 + +$(STLPORT_DIR)/lib/libstdc++.a: $(STLPORT_DIR)/Makefile +	$(MAKE) ARCH=$(OPTIMIZE_FOR_CPU) PREFIX=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME) -C $(STLPORT_DIR) + +$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libstdc++.a: $(STLPORT_DIR)/lib/libstdc++.a +	$(MAKE) ARCH=$(OPTIMIZE_FOR_CPU) PREFIX=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME) -C $(STLPORT_DIR) install + +stlport: $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libstdc++.a + +stlport-source: $(DL_DIR)/$(STLPORT_SOURCE) + +stlport-clean: +	rm -f $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libstdc++* +	rm -f $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include/c++* +	-$(MAKE) -C $(STLPORT_DIR) clean + +stlport-dirclean: +	rm -f $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libstdc++* +	rm -f $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include/g++-v3* +	rm -rf $(STLPORT_DIR) + +############################################################# +# +# second pass compiler build.  Build the compiler targeting  +# the newly built shared uClibc library. +# +############################################################# +GCC_BUILD_DIR2:=$(TOOL_BUILD_DIR)/gcc2_95-final + +$(GCC_BUILD_DIR2)/.configured: $(GCC_DIR)/.patched $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libc.a +	mkdir -p $(GCC_BUILD_DIR2) +	(cd $(GCC_BUILD_DIR2); PATH=$(TARGET_PATH) \ +		$(GCC_DIR)/configure \ +		--prefix=$(STAGING_DIR) \ +		--build=$(GNU_HOST_NAME) \ +		--host=$(GNU_HOST_NAME) \ +		--target=$(REAL_GNU_TARGET_NAME) \ +		--enable-languages=$(TARGET_LANGUAGES) \ +		--enable-shared \ +		--with-gxx-include-dir=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include/c++ \ +		--disable-__cxa_atexit \ +		--enable-target-optspace \ +		--with-gnu-ld \ +		$(DISABLE_NLS) \ +		$(MULTILIB) \ +		$(SOFT_FLOAT_CONFIG_OPTION) \ +		$(EXTRA_GCC_CONFIG_OPTIONS)); +	touch $(GCC_BUILD_DIR2)/.configured + +$(GCC_BUILD_DIR2)/.compiled: $(GCC_BUILD_DIR2)/.configured +	PATH=$(TARGET_PATH) $(MAKE) $(JLEVEL) -C $(GCC_BUILD_DIR2) all +	touch $(GCC_BUILD_DIR2)/.compiled + +$(GCC_BUILD_DIR2)/.installed: $(GCC_BUILD_DIR2)/.compiled +	PATH=$(TARGET_PATH) $(MAKE) $(JLEVEL) -C $(GCC_BUILD_DIR2) install +	# Strip the host binaries +	-strip --strip-all -R .note -R .comment $(STAGING_DIR)/bin/* +	# Set up the symlinks to enable lying about target name. +	set -e; \ +	(cd $(STAGING_DIR); \ +		ln -s $(REAL_GNU_TARGET_NAME) $(GNU_TARGET_NAME); \ +		cd bin; \ +		for app in $(REAL_GNU_TARGET_NAME)-* ; do \ +			ln -s $${app} \ +		   	$(GNU_TARGET_NAME)$${app##$(REAL_GNU_TARGET_NAME)}; \ +		done; \ +	); +	touch $(GCC_BUILD_DIR2)/.installed + +gcc2_95: uclibc-configured binutils gcc2_95_initial $(LIBFLOAT_TARGET) uclibc \ +	$(GCC_BUILD_DIR2)/.installed $(GCC_TARGETS) $(STLPORT_TARGET) + +gcc2_95-source: $(DL_DIR)/$(GCC_SOURCE) + +gcc2_95-clean: +	rm -rf $(GCC_BUILD_DIR2) +	rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc2_95-dirclean: +	rm -rf $(GCC_BUILD_DIR2) + +############################################################# +# +# Next build target gcc compiler +# +############################################################# +GCC_BUILD_DIR3:=$(BUILD_DIR)/gcc2_95-target + +$(GCC_BUILD_DIR3)/.configured: $(GCC_BUILD_DIR2)/.installed +	mkdir -p $(GCC_BUILD_DIR3) +	(cd $(GCC_BUILD_DIR3); PATH=$(TARGET_PATH) \ +		$(GCC_DIR)/configure \ +		--prefix=/usr \ +		--build=$(GNU_HOST_NAME) \ +		--host=$(REAL_GNU_TARGET_NAME) \ +		--target=$(REAL_GNU_TARGET_NAME) \ +		--enable-languages=$(TARGET_LANGUAGES) \ +		--enable-shared \ +		--with-gxx-include-dir=/usr/include/c++ \ +		--disable-__cxa_atexit \ +		--enable-target-optspace \ +		--with-gnu-ld \ +		$(DISABLE_NLS) \ +		$(MULTILIB) \ +		$(SOFT_FLOAT_CONFIG_OPTION) \ +		$(EXTRA_GCC_CONFIG_OPTIONS)); +	touch $(GCC_BUILD_DIR3)/.configured + +$(GCC_BUILD_DIR3)/.compiled: $(GCC_BUILD_DIR3)/.configured +	PATH=$(TARGET_PATH) \ +	$(MAKE) $(JLEVEL) $(TARGET_GCC_ARGS) -C $(GCC_BUILD_DIR3) all +	touch $(GCC_BUILD_DIR3)/.compiled + +$(TARGET_DIR)/usr/bin/gcc: $(GCC_BUILD_DIR3)/.compiled +	PATH=$(TARGET_PATH) \ +	$(MAKE) $(JLEVEL) DESTDIR=$(TARGET_DIR) -C $(GCC_BUILD_DIR3) install +	# Remove broken specs file (cross compile flag is set). +	rm -f $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs +	-(cd $(TARGET_DIR)/bin; find -type f | xargs $(STRIP) > /dev/null 2>&1) +	-(cd $(TARGET_DIR)/usr/bin; find -type f | xargs $(STRIP) > /dev/null 2>&1) +	-(cd $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION); $(STRIP) cc1 cc1plus collect2 > /dev/null 2>&1) +	-(cd $(TARGET_DIR)/usr/lib; $(STRIP) libstdc++.so.*.*.* > /dev/null 2>&1) +	-(cd $(TARGET_DIR)/lib; $(STRIP) libgcc_s.so.*.*.* > /dev/null 2>&1) +	# +	#rm -f $(TARGET_DIR)/usr/lib/*.la* +	#rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ +	#	$(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc +	# Work around problem of missing syslimits.h +	cp -f $(STAGING_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/include/syslimits.h $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/include/ +	# These are in /lib, so... +	#rm -rf $(TARGET_DIR)/usr/lib/libgcc_s.so* +	#touch -c $(TARGET_DIR)/usr/bin/gcc + +gcc2_95_target: uclibc_target binutils_target $(TARGET_DIR)/usr/bin/gcc + +gcc2_95_target-clean: +	rm -rf $(GCC_BUILD_DIR3) +	rm -f $(TARGET_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc2_95_target-dirclean: +	rm -rf $(GCC_BUILD_DIR3) + +endif +endif	#ifeq ($(USE_LINUX_UCLIBC),true) diff --git a/make/gcc-uclibc-3.3.mk b/make/gcc-uclibc-3.3.mk new file mode 100644 index 000000000..1946a6376 --- /dev/null +++ b/make/gcc-uclibc-3.3.mk @@ -0,0 +1,235 @@ +# Makefile for to build a gcc/uClibc toolchain +# +# Copyright (C) 2002-2003 Erik Andersen <andersen@uclibc.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +ifeq ($(USE_LINUX_UCLIBC),true) +ifneq ($(GCC_2_95_TOOLCHAIN),true) + +# Shiny new stuff... +GCC_VERSION:=3.3.2 +#GCC_SITE:=ftp://ftp.gnu.org/gnu/gcc/gcc-$(GCC_VERSION) +#GCC_SITE:=http://www.binarycode.org/gcc/releases/gcc-$(GCC_VERSION) +GCC_SITE:=http://gcc.get-software.com/releases/gcc-$(GCC_VERSION) + +# +# snapshots.... +#GCC_VERSION:=3.3-20031013 +#GCC_SITE:=http://gcc.get-software.com/snapshots/$(GCC_VERSION) +# +GCC_SOURCE:=gcc-$(GCC_VERSION).tar.bz2 +GCC_DIR:=$(TOOL_BUILD_DIR)/gcc-$(GCC_VERSION) +GCC_CAT:=bzcat + +############################################################# +# +# Setup some initial stuff +# +############################################################# + +ifeq ($(INSTALL_LIBSTDCPP),true) +TARGET_LANGUAGES:=c,c++ +else +TARGET_LANGUAGES:=c +endif + +############################################################# +# +# build the first pass gcc compiler +# +############################################################# +GCC_BUILD_DIR1:=$(TOOL_BUILD_DIR)/gcc-3.3-initial + +$(DL_DIR)/$(GCC_SOURCE): +	$(WGET) -P $(DL_DIR) $(GCC_SITE)/$(GCC_SOURCE) + +$(GCC_DIR)/.unpacked: $(DL_DIR)/$(GCC_SOURCE) +	$(GCC_CAT) $(DL_DIR)/$(GCC_SOURCE) | tar -C $(TOOL_BUILD_DIR) -xvf - +	touch $(GCC_DIR)/.unpacked + +$(GCC_DIR)/.patched: $(GCC_DIR)/.unpacked +	# Apply any files named gcc-*.patch from the source directory to gcc +	$(SOURCE_DIR)/patch-kernel.sh $(GCC_DIR) $(SOURCE_DIR) gcc-uclibc-3.3*.patch +ifeq ($(SOFT_FLOAT),true) +ifeq ("$(strip $(ARCH))","i386") +	$(SOURCE_DIR)/patch-kernel.sh $(GCC_DIR) $(SOURCE_DIR) i386-gcc-soft-float.patch +endif +endif +	touch $(GCC_DIR)/.patched + +# The --without-headers option stopped working with gcc 3.0 and has never been +# # fixed, so we need to actually have working C library header files prior to +# # the step or libgcc will not build... +$(GCC_BUILD_DIR1)/.configured: $(GCC_DIR)/.patched +	mkdir -p $(GCC_BUILD_DIR1) +	(cd $(GCC_BUILD_DIR1); PATH=$(TARGET_PATH) \ +		$(GCC_DIR)/configure \ +		--prefix=$(STAGING_DIR) \ +		--build=$(GNU_HOST_NAME) \ +		--host=$(GNU_HOST_NAME) \ +		--target=$(REAL_GNU_TARGET_NAME) \ +		--enable-languages=c \ +		--disable-shared \ +		--includedir=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include \ +		--disable-__cxa_atexit \ +		--enable-target-optspace \ +		--with-gnu-ld \ +		$(DISABLE_NLS) \ +		$(MULTILIB) \ +		$(SOFT_FLOAT_CONFIG_OPTION) \ +		$(EXTRA_GCC_CONFIG_OPTIONS)); +	touch $(GCC_BUILD_DIR1)/.configured + +$(GCC_BUILD_DIR1)/.compiled: $(GCC_BUILD_DIR1)/.configured +	PATH=$(TARGET_PATH) $(MAKE) $(JLEVEL) -C $(GCC_BUILD_DIR1) all-gcc +	touch $(GCC_BUILD_DIR1)/.compiled + +$(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc: $(GCC_BUILD_DIR1)/.compiled +	PATH=$(TARGET_PATH) $(MAKE) $(JLEVEL) -C $(GCC_BUILD_DIR1) install-gcc +	#rm -f $(STAGING_DIR)/bin/gccbug $(STAGING_DIR)/bin/gcov +	#rm -rf $(STAGING_DIR)/info $(STAGING_DIR)/man $(STAGING_DIR)/share/doc $(STAGING_DIR)/share/locale + +gcc3_3_initial: uclibc-configured binutils $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc + +gcc3_3_initial-clean: +	rm -rf $(GCC_BUILD_DIR1) +	rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc3_3_initial-dirclean: +	rm -rf $(GCC_BUILD_DIR1) + +############################################################# +# +# second pass compiler build.  Build the compiler targeting  +# the newly built shared uClibc library. +# +############################################################# +GCC_BUILD_DIR2:=$(TOOL_BUILD_DIR)/gcc-3.3-final +$(GCC_BUILD_DIR2)/.configured: $(GCC_DIR)/.patched $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libc.a +	mkdir -p $(GCC_BUILD_DIR2) +	(cd $(GCC_BUILD_DIR2); PATH=$(TARGET_PATH) \ +		$(GCC_DIR)/configure \ +		--prefix=$(STAGING_DIR) \ +		--build=$(GNU_HOST_NAME) \ +		--host=$(GNU_HOST_NAME) \ +		--target=$(REAL_GNU_TARGET_NAME) \ +		--enable-languages=$(TARGET_LANGUAGES) \ +		--enable-shared \ +		--with-gxx-include-dir=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include/c++ \ +		--disable-__cxa_atexit \ +		--enable-target-optspace \ +		--with-gnu-ld \ +		$(DISABLE_NLS) \ +		$(MULTILIB) \ +		$(SOFT_FLOAT_CONFIG_OPTION) \ +		$(EXTRA_GCC_CONFIG_OPTIONS)); +	touch $(GCC_BUILD_DIR2)/.configured + +$(GCC_BUILD_DIR2)/.compiled: $(GCC_BUILD_DIR2)/.configured +	PATH=$(TARGET_PATH) $(MAKE) $(JLEVEL) -C $(GCC_BUILD_DIR2) all +	touch $(GCC_BUILD_DIR2)/.compiled + +$(GCC_BUILD_DIR2)/.installed: $(GCC_BUILD_DIR2)/.compiled +	PATH=$(TARGET_PATH) $(MAKE) $(JLEVEL) -C $(GCC_BUILD_DIR2) install +	# Strip the host binaries +	-strip --strip-all -R .note -R .comment $(STAGING_DIR)/bin/* +	# Set up the symlinks to enable lying about target name. +	set -e; \ +	(cd $(STAGING_DIR); \ +		ln -s $(REAL_GNU_TARGET_NAME) $(GNU_TARGET_NAME); \ +		cd bin; \ +		for app in $(REAL_GNU_TARGET_NAME)-* ; do \ +			ln -s $${app} \ +		   	$(GNU_TARGET_NAME)$${app##$(REAL_GNU_TARGET_NAME)}; \ +		done; \ +	); +	touch $(GCC_BUILD_DIR2)/.installed + +gcc3_3: uclibc-configured binutils gcc3_3_initial $(LIBFLOAT_TARGET) uclibc \ +	$(GCC_BUILD_DIR2)/.installed $(GCC_TARGETS) + +gcc3_3-source: $(DL_DIR)/$(GCC_SOURCE) + +gcc3_3-clean: +	rm -rf $(GCC_BUILD_DIR2) +	rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc3_3-dirclean: +	rm -rf $(GCC_BUILD_DIR2) + +############################################################# +# +# Next build target gcc compiler +# +############################################################# +GCC_BUILD_DIR3:=$(BUILD_DIR)/gcc-3.3-target + +$(GCC_BUILD_DIR3)/.configured: $(GCC_BUILD_DIR2)/.installed +	mkdir -p $(GCC_BUILD_DIR3) +	(cd $(GCC_BUILD_DIR3); PATH=$(TARGET_PATH) \ +		$(GCC_DIR)/configure \ +		--prefix=/usr \ +		--build=$(GNU_HOST_NAME) \ +		--host=$(REAL_GNU_TARGET_NAME) \ +		--target=$(REAL_GNU_TARGET_NAME) \ +		--enable-languages=$(TARGET_LANGUAGES) \ +		--enable-shared \ +		--with-gxx-include-dir=/usr/include/c++ \ +		--disable-__cxa_atexit \ +		--enable-target-optspace \ +		--with-gnu-ld \ +		$(DISABLE_NLS) \ +		$(MULTILIB) \ +		$(SOFT_FLOAT_CONFIG_OPTION) \ +		$(EXTRA_GCC_CONFIG_OPTIONS)); +	touch $(GCC_BUILD_DIR3)/.configured + +$(GCC_BUILD_DIR3)/.compiled: $(GCC_BUILD_DIR3)/.configured +	PATH=$(TARGET_PATH) \ +	$(MAKE) $(JLEVEL) $(TARGET_GCC_ARGS) -C $(GCC_BUILD_DIR3) all +	touch $(GCC_BUILD_DIR3)/.compiled + +$(TARGET_DIR)/usr/bin/gcc: $(GCC_BUILD_DIR3)/.compiled +	PATH=$(TARGET_PATH) \ +	$(MAKE) $(JLEVEL) DESTDIR=$(TARGET_DIR) -C $(GCC_BUILD_DIR3) install +	# Remove broken specs file (cross compile flag is set). +	rm -f $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs +	-(cd $(TARGET_DIR)/bin; find -type f | xargs $(STRIP) > /dev/null 2>&1) +	-(cd $(TARGET_DIR)/usr/bin; find -type f | xargs $(STRIP) > /dev/null 2>&1) +	-(cd $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION); $(STRIP) cc1 cc1plus collect2 > /dev/null 2>&1) +	-(cd $(TARGET_DIR)/usr/lib; $(STRIP) libstdc++.so.*.*.* > /dev/null 2>&1) +	-(cd $(TARGET_DIR)/lib; $(STRIP) libgcc_s.so.*.*.* > /dev/null 2>&1) +	# +	#rm -f $(TARGET_DIR)/usr/lib/*.la* +	#rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ +	#	$(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc +	# Work around problem of missing syslimits.h +	cp -f $(STAGING_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/include/syslimits.h $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/include/ +	# These are in /lib, so... +	#rm -rf $(TARGET_DIR)/usr/lib/libgcc_s.so* +	#touch -c $(TARGET_DIR)/usr/bin/gcc + +gcc3_3_target: uclibc_target binutils_target $(TARGET_DIR)/usr/bin/gcc + +gcc3_3_target-clean: +	rm -rf $(GCC_BUILD_DIR3) +	rm -f $(TARGET_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc3_3_target-dirclean: +	rm -rf $(GCC_BUILD_DIR3) + +endif +endif	#ifeq ($(USE_LINUX_UCLIBC),true) diff --git a/make/uclibc.mk b/make/uclibc.mk index f51eff20d..b5059c364 100644 --- a/make/uclibc.mk +++ b/make/uclibc.mk @@ -34,6 +34,9 @@ $(DL_DIR)/$(UCLIBC_SOURCE):  $(UCLIBC_DIR)/.unpacked: $(DL_DIR)/$(UCLIBC_SOURCE)  	bzcat $(DL_DIR)/$(UCLIBC_SOURCE) | tar -C $(BUILD_DIR) -xvf - +	#(cd $(BUILD_DIR) ; ln -s $(DL_DIR)/uClibc) +	#-mkdir $(UCLIBC_DIR) +	#(cd $(DL_DIR)/uClibc && tar cf - .) | (cd $(UCLIBC_DIR) && tar xvfp - )  	touch $(UCLIBC_DIR)/.unpacked  $(UCLIBC_DIR)/.configured: $(UCLIBC_DIR)/.unpacked $(LINUX_DIR)/.configured @@ -64,39 +67,44 @@ endif  		$(SED) 's,.*HAS_FPU.*,HAS_FPU=n\nUCLIBC_HAS_FLOATS=y\nUCLIBC_HAS_SOFT_FLOAT=y,g' \  			$(UCLIBC_DIR)/.config; \  	fi -	$(MAKE) -C $(UCLIBC_DIR) PREFIX=$(STAGING_DIR) headers install_dev; -	rm -rf $(STAGING_DIR)/include -	ln -s usr/include $(STAGING_DIR)/include +	$(MAKE) -C $(UCLIBC_DIR) \ +		PREFIX=$(STAGING_DIR)/ \ +		DEVEL_PREFIX=$(REAL_GNU_TARGET_NAME)/ \ +		RUNTIME_PREFIX=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/ \ +		pregen install_dev;  	touch $(UCLIBC_DIR)/.configured  $(UCLIBC_DIR)/lib/libc.a: $(UCLIBC_DIR)/.configured $(LIBFLOAT_TARGET) -	$(MAKE) -C $(UCLIBC_DIR) oldconfig -	$(MAKE) -C $(UCLIBC_DIR) headers -ifeq ($(ENABLE_LOCALE),true) -	-$(MAKE) -C $(UCLIBC_DIR) pregen -endif -	$(MAKE) -C $(UCLIBC_DIR) - -$(STAGING_DIR)/lib/libc.a: $(UCLIBC_DIR)/lib/libc.a -	$(MAKE) -C $(UCLIBC_DIR) PREFIX=$(STAGING_DIR) install_dev install_runtime -	$(MAKE) -C $(UCLIBC_DIR) PREFIX=$(STAGING_DIR) utils install_utils +	$(MAKE) -C $(UCLIBC_DIR) \ +		PREFIX= \ +		DEVEL_PREFIX=$(REAL_GNU_TARGET_NAME)/ \ +		RUNTIME_PREFIX=/ \ +		all + +$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libc.a: $(UCLIBC_DIR)/lib/libc.a +	$(MAKE) -C $(UCLIBC_DIR) \ +		PREFIX=$(STAGING_DIR)/ \ +		DEVEL_PREFIX=$(REAL_GNU_TARGET_NAME)/ \ +		RUNTIME_PREFIX=$(REAL_GNU_TARGET_NAME)/ \ +		install_runtime +	$(MAKE) -C $(UCLIBC_DIR) \ +		PREFIX=$(STAGING_DIR)/ \ +		DEVEL_PREFIX=$(REAL_GNU_TARGET_NAME)/ \ +		RUNTIME_PREFIX=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/ \ +		install_dev +	$(MAKE) -C $(UCLIBC_DIR) \ +		PREFIX=$(STAGING_DIR) \ +		utils install_utils  	# Clean up the host compiled utils...  	$(MAKE) -C $(UCLIBC_DIR)/utils clean -	(cd $(STAGING_DIR)/lib; \ -		ln -fs libc.so.0 libc.so; \ -		ln -fs libdl.so.0 libdl.so; \ -		ln -fs libcrypt.so.0 libcrypt.so; \ -		ln -fs libresolv.so.0 libresolv.so; \ -		ln -fs libutil.so.0 libutil.so; \ -		ln -fs libm.so.0 libm.so; \ -		ln -fs libpthread.so.0 libpthread.so; \ -		ln -fs libnsl.so.0 libnsl.so; \ -		ln -fs libthread_db.so.1 libthread_db.so; \ -	)  ifneq ($(TARGET_DIR),) -$(TARGET_DIR)/lib/libc.so.0: $(STAGING_DIR)/lib/libc.a -	$(MAKE) -C $(UCLIBC_DIR) PREFIX=$(TARGET_DIR) install_runtime +$(TARGET_DIR)/lib/libc.so.0: $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libc.a +	$(MAKE) -C $(UCLIBC_DIR) \ +		PREFIX=$(TARGET_DIR) \ +		DEVEL_PREFIX=/usr/ \ +		RUNTIME_PREFIX=/ \ +		install_runtime  $(TARGET_DIR)/usr/bin/ldd: $(TARGET_DIR)/lib/libc.so.0  	$(MAKE) -C $(UCLIBC_DIR) $(TARGET_CONFIGURE_OPTS) \ @@ -107,7 +115,7 @@ endif  uclibc-configured: $(UCLIBC_DIR)/.configured -uclibc: $(STAGING_DIR)/bin/$(ARCH)-linux-gcc $(STAGING_DIR)/lib/libc.a \ +uclibc: $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libc.a \  	$(UCLIBC_TARGETS)  uclibc-source: $(DL_DIR)/$(UCLIBC_SOURCE) @@ -131,20 +139,12 @@ uclibc-dirclean:  #  ############################################################# -$(TARGET_DIR)/usr/lib/libc.a: $(STAGING_DIR)/lib/libc.a -	$(MAKE) -C $(UCLIBC_DIR) $(TARGET_CONFIGURE_OPTS) \ -		PREFIX=$(TARGET_DIR) install_dev -	(cd $(TARGET_DIR)/usr/lib; \ -		ln -fs /lib/libc.so.0 libc.so; \ -		ln -fs /lib/libdl.so.0 libdl.so; \ -		ln -fs /lib/libcrypt.so.0 libcrypt.so; \ -		ln -fs /lib/libresolv.so.0 libresolv.so; \ -		ln -fs /lib/libutil.so.0 libutil.so; \ -		ln -fs /lib/libm.so.0 libm.so; \ -		ln -fs /lib/libpthread.so.0 libpthread.so; \ -		ln -fs /lib/libnsl.so.0 libnsl.so; \ -		ln -fs /lib/libthread_db.so.1 libthread_db.so; \ -	) +$(TARGET_DIR)/usr/lib/libc.a: $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libc.a +	$(MAKE) -C $(UCLIBC_DIR) \ +		PREFIX=$(TARGET_DIR) \ +		DEVEL_PREFIX=/usr/ \ +		RUNTIME_PREFIX=/ \ +		install_dev  ifeq ($(GCC_2_95_TOOLCHAIN),true)  uclibc_target: gcc2_95 uclibc $(TARGET_DIR)/usr/lib/libc.a diff --git a/sources/STLport-4.5.3.patch b/sources/STLport-4.5.3.patch index 3f8328267..fee65f920 100644 --- a/sources/STLport-4.5.3.patch +++ b/sources/STLport-4.5.3.patch @@ -22,7 +22,7 @@ diff -urN STLport-4.5.3/Makefile STLport-4.5.3-devel/Makefile  +  +ARCH:=i386  +PREFIX:=/usr/$(ARCH)-linux-uclibc -+CROSS:= $(PREFIX)/bin/$(ARCH)-uclibc- ++CROSS:= $(PREFIX)/../bin/$(ARCH)-linux-uclibc-  +CC=$(CROSS)gcc  +CXX=$(CROSS)g++  +AR = $(CROSS)ar @@ -267,12 +267,65 @@ diff -urN STLport-4.5.3/stlport/stl/_config.h STLport-4.5.3-devel/stlport/stl/_c  diff -urN STLport-4.5.3/stlport/stl/_stdio_file.h STLport-4.5.3-devel/stlport/stl/_stdio_file.h  --- STLport-4.5.3/stlport/stl/_stdio_file.h	Fri Jan 18 15:07:00 2002  +++ STLport-4.5.3-devel/stlport/stl/_stdio_file.h	Tue Jan  7 15:28:08 2003 -@@ -634,6 +634,57 @@ +@@ -634,6 +634,112 @@   }   # define _STLP_FILE_I_O_IDENTICAL  +#elif defined(_STLP_USE_UCLIBC)  + ++#if defined(__MASK_READING) ++ ++inline int   _FILE_fd(const FILE *__f) { return __f->__filedes; } ++ ++//       Returns a pointer to the beginning of the buffer. ++inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->__bufstart; } ++ ++//       Returns the current read/write position within the buffer. ++inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->__bufpos; } ++ ++//       Returns a pointer immediately past the end of the buffer. ++inline char* _FILE_I_end(const FILE *__f) { return (char*)__f->__bufend; } ++ ++//       Returns the number of characters remaining in the buffer, i.e. ++//       _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f). ++inline ptrdiff_t _FILE_I_avail(const FILE *__f)  ++  { return __f->__bufgetc_u - __f->__bufpos; } ++ ++//       Increments the current read/write position by 1, returning the  ++//       character at the old position. ++inline char& _FILE_I_preincr(FILE *__f)  { return *(char*)(++__f->__bufpos); } ++ ++//       Increments the current read/write position by 1, returning the  ++//       character at the old position. ++inline char& _FILE_I_postincr(FILE *__f)  { return *(char*)(__f->__bufpos++); } ++ ++//       Decrements the current read/write position by 1, returning the  ++//       character at the old position. ++inline char& _FILE_I_predecr(FILE *__f)  { return *(char*)(--__f->__bufpos); } ++ ++//       Decrements the current read/write position by 1, returning the  ++//       character at the old position. ++inline char& _FILE_I_postdecr(FILE *__f)  { return *(char*)(__f->__bufpos--); } ++ ++//       Increments the current read/write position by __n. ++inline void  _FILE_I_bump(FILE *__f, int __n) { __f->__bufpos += __n; } ++ ++//       Sets the beginning of the bufer to __begin, the current read/write ++//       position to __next, and the buffer's past-the-end pointer to __end. ++//       If any of those pointers is null, then all of them must be null. ++inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) ++{ ++	__f->__bufstart = (unsigned char*)__begin; ++	__f->__bufpos  =  (unsigned char*)__next; ++	__f->__bufend  =  (unsigned char*)__end; ++	__f->__bufgetc_u = (unsigned char*)__begin; ++	__f->__bufputc_u = (unsigned char*)__end; ++} ++ ++# define _STLP_FILE_I_O_IDENTICAL ++ ++#else    // Support old stdio for a little while. ++  +inline int   _FILE_fd(const FILE *__f) { return __f->filedes; }  +  +//       Returns a pointer to the beginning of the buffer. @@ -316,52 +369,37 @@ diff -urN STLport-4.5.3/stlport/stl/_stdio_file.h STLport-4.5.3-devel/stlport/st  +	__f->bufstart = (unsigned char*)__begin;  +	__f->bufpos  =  (unsigned char*)__next;  +	__f->bufend  =  (unsigned char*)__end; -+	__f->bufgetc  = (unsigned char*)__begin; ++	__f->bufgetc = (unsigned char*)__begin;  +	__f->bufputc = (unsigned char*)__end;  +}  +  +# define _STLP_FILE_I_O_IDENTICAL  + ++#endif ++   #else  /* A C library that we don't have an implementation for. */   # error The C++ I/O library is not configured for this compiler  diff -urN STLport-4.5.3/stlport/stl/c_locale.h STLport-4.5.3-devel/stlport/stl/c_locale.h  --- STLport-4.5.3/stlport/stl/c_locale.h	Fri Jan 18 15:07:00 2002  +++ STLport-4.5.3-devel/stlport/stl/c_locale.h	Wed Jan  8 10:58:10 2003 -@@ -326,6 +326,29 @@ - # define _Locale_PRINT _R - # define _Locale_ALPHA _A -  -+# elif defined (_STLP_USE_UCLIBC) -+  -+//# include <linux/ctype.h> -+ -+#define _U      0x01    /* upper */ -+#define _L      0x02    /* lower */ -+#define _D      0x04    /* digit */ -+#define _C      0x08    /* cntrl */ -+#define _P      0x10    /* punct */ -+#define _S      0x20    /* white space (space/lf/tab) */ -+#define _X      0x40    /* hex digit */ -+#define _SP     0x80    /* hard space (0x20) */ -+ -+# define _Locale_CNTRL _C -+# define _Locale_UPPER _U -+# define _Locale_LOWER _L -+# define _Locale_DIGIT _D -+# define _Locale_XDIGIT _X -+# define _Locale_PUNCT _P -+# define _Locale_SPACE _S -+# define _Locale_PRINT (_P|_U|_L|_D|_SP) -+# define _Locale_ALPHA (_U|_L) -+ - # elif defined (__hpux) || defined (__osf__) -   - #   if defined(__HP_aCC) && !defined(_INCLUDE_HPUX_SOURCE) -@@ -401,6 +424,8 @@ +@@ -401,6 +401,21 @@   #  define _Locale_SPACE _S   #  define _Locale_PRINT (_P | _U | _L | _N | _B)   #  define _Locale_ALPHA (_U | _L) ++ ++# elif defined(_STLP_USE_UCLIBC) /* linux, using the gnu compiler */ ++ ++#  define _Locale_CNTRL  _IScntrl ++#  define _Locale_UPPER  _ISupper ++#  define _Locale_LOWER  _ISlower ++#  define _Locale_DIGIT  _ISdigit ++#  define _Locale_XDIGIT _ISxdigit ++#  define _Locale_PUNCT  _ISpunct ++#  define _Locale_SPACE  _ISspace ++#  define _Locale_PRINT  _ISprint ++#  define _Locale_ALPHA  _ISalpha ++  +#else  +#  error Unknown Locale   #endif diff --git a/sources/binutils-uclibc-001-debian.patch b/sources/binutils-uclibc-001-debian.patch new file mode 100644 index 000000000..97b8e7fde --- /dev/null +++ b/sources/binutils-uclibc-001-debian.patch @@ -0,0 +1,185 @@ +--- binutils-2.11.90.0.19.orig/ld/Makefile.am ++++ binutils-2.11.90.0.19/ld/Makefile.am +@@ -19,7 +19,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) +  + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +--- binutils-2.11.90.0.19.orig/ld/Makefile.in ++++ binutils-2.11.90.0.19/ld/Makefile.in +@@ -123,7 +123,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) +  + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +diff -urN binutils-2.11.90.0.27/gprof/gprof.texi binutils-2.11.90.0.27.new/gprof/gprof.texi +--- binutils-2.11.90.0.27/gprof/gprof.texi	Tue Jun 19 14:57:58 2001 ++++ binutils-2.11.90.0.27.new/gprof/gprof.texi	Mon Aug 27 10:27:23 2001 +@@ -137,6 +137,10 @@ + If more than one profile file is specified, the @code{gprof} + output shows the sum of the profile information in the given profile files. +  ++If you use gcc 2.95.x or 3.0 to compile your binaries, you may need ++to add the @samp{-fprofile-arcs} to the compile command line in order ++for the call graphs to be properly stored in gmon.out. ++ + @code{Gprof} calculates the amount of time spent in each routine. + Next, these times are propagated along the edges of the call graph. + Cycles are discovered, and calls into a cycle are made to share the time +@@ -266,6 +270,11 @@ + to do the linking, simply specify @samp{-pg} in addition to your usual + options.  The same option, @samp{-pg}, alters either compilation or linking + to do what is necessary for profiling.  Here are examples: ++ ++If you use gcc 2.95.x or 3.0.x, you may need to add the ++@samp{-fprofile-arcs} option to the compile line along with @samp{-pg} ++in order to allow the call-graphs to be properly included in the gmon.out ++file. +  + @example + cc -g -c myprog.c utils.c -pg +diff -urN binutils-2.11.92.0.5/bfd/opncls.c binutils-2.11.92.0.5.new/bfd/opncls.c +--- binutils-2.11.92.0.5/bfd/opncls.c	Mon Oct  1 18:25:21 2001 ++++ binutils-2.11.92.0.5.new/bfd/opncls.c	Sat Oct 13 11:26:59 2001 +@@ -127,6 +127,13 @@ + { +   bfd *nbfd; +   const bfd_target *target_vec; ++  struct stat s; ++ ++  if (stat (filename, &s) == 0) ++    if (S_ISDIR(s.st_mode)) { ++      bfd_set_error (bfd_error_file_not_recognized); ++      return NULL; ++    } +  +   nbfd = _bfd_new_bfd (); +   if (nbfd == NULL) +diff -urN binutils-2.11.92.0.12.3/opcodes/i386-dis.c binutils-2.11.92.0.12.3.new/opcodes/i386-dis.c +--- binutils-2.11.92.0.12.3/opcodes/i386-dis.c	Fri Nov 16 17:05:55 2001 ++++ binutils-2.11.92.0.12.3.new/opcodes/i386-dis.c	Mon Dec 31 15:55:04 2001 +@@ -1830,7 +1830,7 @@ +  * The function returns the length of this instruction in bytes. +  */ +  +-static char intel_syntax; ++static signed char intel_syntax; + static char open_char; + static char close_char; + static char separator_char; +diff -urN binutils-2.12.90.0.12/ld/emultempl/elf32.em binutils-2.12.90.0.12.new/ld/emultempl/elf32.em +--- binutils-2.12.90.0.12/ld/emultempl/elf32.em	Wed Jun 19 00:41:59 2002 ++++ binutils-2.12.90.0.12.new/ld/emultempl/elf32.em	Wed Jun 26 10:00:26 2002 +@@ -672,6 +672,8 @@ + 	      && command_line.rpath == NULL) + 	    { + 	      lib_path = (const char *) getenv ("LD_RUN_PATH"); ++	      if ((lib_path) && (strlen (lib_path) == 0)) ++		  lib_path = NULL; + 	      if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, + 						      force)) + 		break; +@@ -867,6 +869,8 @@ +   rpath = command_line.rpath; +   if (rpath == NULL) +     rpath = (const char *) getenv ("LD_RUN_PATH"); ++  if ((rpath) && (strlen (rpath) == 0)) ++      rpath = NULL; +   if (! (bfd_elf${ELFSIZE}_size_dynamic_sections +          (output_bfd, command_line.soname, rpath, + 	  command_line.filter_shlib, +diff -urN binutils-2.13.90.0.18/gprof/gprof.texi binutils-2.13.90.0.18.new/gprof/gprof.texi +--- binutils-2.13.90.0.18/gprof/gprof.texi	2003-02-02 18:29:09.000000000 -0500 ++++ binutils-2.13.90.0.18.new/gprof/gprof.texi	2003-02-02 18:28:37.000000000 -0500 +@@ -185,7 +185,7 @@ + @c man end +  + @c man begin SEEALSO +-monitor(3), profil(2), cc(1), prof(1), and the Info entry for @file{gprof}. ++profil(2), cc(1), prof(1), and the Info entry for @file{gprof}. +  + ``An Execution Profiler for Modular Programs'', + by S. Graham, P. Kessler, M. McKusick; +diff -urN binutils-2.13.90.0.10/opcodes/alpha-opc.c binutils-2.13.90.0.10.new/opcodes/alpha-opc.c +--- binutils-2.13.90.0.10/opcodes/alpha-opc.c	2002-03-07 14:52:40.000000000 -0500 ++++ binutils-2.13.90.0.10.new/opcodes/alpha-opc.c	2002-10-12 20:16:08.000000000 -0400 +@@ -1101,7 +1101,8 @@ +   { "wmb",		MFC(0x18,0x4400), BASE, ARG_NONE }, +   { "fetch",		MFC(0x18,0x8000), BASE, { ZA, PRB } }, +   { "fetch_m",		MFC(0x18,0xA000), BASE, { ZA, PRB } }, +-  { "rpcc",		MFC(0x18,0xC000), BASE, { RA } }, ++  { "rpcc",		MFC(0x18,0xC000), BASE, { RA, ZB } }, ++  { "rpcc",		MFC(0x18,0xC000), BASE, { RA, RB } },	/* ev6 una */ +   { "rc",		MFC(0x18,0xE000), BASE, { RA } }, +   { "ecb",		MFC(0x18,0xE800), BASE, { ZA, PRB } },	/* ev56 una */ +   { "rs",		MFC(0x18,0xF000), BASE, { RA } }, +--- binutils-2.13.90.0.18/bfd/elf64-alpha.c	2003-01-21 19:21:32.000000000 +0100 ++++ binutils-2.13.90.0.18-modif/bfd/elf64-alpha.c	2003-04-11 01:24:26.000000000 +0200 +@@ -4184,9 +4184,12 @@ +  +   loc = srel->contents; +   loc += srel->reloc_count++ * sizeof (Elf64_External_Rela); +-  bfd_elf64_swap_reloca_out (abfd, &outrel, loc); +-  BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count +-	      <= srel->_cooked_size); ++  if (loc) ++    { ++      bfd_elf64_swap_reloca_out (abfd, &outrel, loc); ++      BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count ++		  <= srel->_cooked_size); ++    } + } +  + /* Relocate an Alpha ELF section for a relocatable link. +2003-05-23  H.J. Lu <hongjiu.lu@intel.com> + +	* ltmain.sh: Make symlink for shared library if needed. + +opcodes/ + +2003-07-14  H.J. Lu <hongjiu.lu@intel.com> + +	* Makefile.in: Regenerated. + +2003-06-11  H.J. Lu <hongjiu.lu@intel.com> + +	* Makefile.in: Regenerated. + +2003-05-23  H.J. Lu <hongjiu.lu@intel.com> + +	* Makefile.am (libopcodes_la_LIBADD): Use "-L../bfd -lbfd" +	instead of "../bfd/libbfd.la". +	* Makefile.in: Regenerated. + +--- binutils/ltmain.sh.dso	2002-03-22 00:16:20.000000000 -0800 ++++ binutils/ltmain.sh	2003-07-14 12:50:17.000000000 -0700 +@@ -4413,6 +4413,10 @@ relink_command=\"$relink_command\"" +       # LD_LIBRARY_PATH before the program is installed. +       $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" +       $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? ++      if test -n "$linkname"; then ++        $show "(cd $output_objdir && $rm ../$linkname && $LN_S $output_objdir/$linkname ../$linkname)" ++        $run eval '(cd $output_objdir && $rm ../$linkname && $LN_S $output_objdir/$linkname ../$linkname)' || exit $? ++      fi +       ;; +     esac +     exit 0 +--- binutils/opcodes/Makefile.am.dso	2003-06-11 07:18:04.000000000 -0700 ++++ binutils/opcodes/Makefile.am	2003-07-14 12:50:18.000000000 -0700 +@@ -283,7 +283,7 @@ disassemble.lo: disassemble.c $(INCDIR)/ +  + libopcodes_la_SOURCES =  dis-buf.c disassemble.c + libopcodes_la_DEPENDENCIES = $(OFILES) ../bfd/libbfd.la +-libopcodes_la_LIBADD = $(OFILES) @WIN32LIBADD@ ../bfd/libbfd.la ++libopcodes_la_LIBADD = $(OFILES) @WIN32LIBADD@ -L../bfd -lbfd + libopcodes_la_LDFLAGS = -release $(VERSION) @WIN32LDFLAGS@ +  + # libtool will build .libs/libopcodes.a.  We create libopcodes.a in diff --git a/sources/binutils-uclibc-100-conf.patch b/sources/binutils-uclibc-100-conf.patch new file mode 100644 index 000000000..d7458696c --- /dev/null +++ b/sources/binutils-uclibc-100-conf.patch @@ -0,0 +1,646 @@ +diff -urN binutils-2.14.90.0.6/bfd/config.bfd binutils-2.14.90.0.6-uClibc/bfd/config.bfd +--- binutils-2.14.90.0.6/bfd/config.bfd	2003-08-21 10:28:47.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/bfd/config.bfd	2004-01-06 23:20:32.000000000 -0600 +@@ -121,7 +121,7 @@ +     targ_defvec=ecoffalpha_little_vec +     targ_selvecs=bfd_elf64_alpha_vec +     ;; +-  alpha*-*-linux-gnu* | alpha*-*-elf*) ++  alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) +     targ_defvec=bfd_elf64_alpha_vec +     targ_selvecs=ecoffalpha_little_vec +     ;; +@@ -131,7 +131,8 @@ +   alpha*-*-*) +     targ_defvec=ecoffalpha_little_vec +     ;; +-  ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf*) ++  ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | \ ++  ia64*-*-linux-uclibc* | ia64*-*-elf*) +     targ_defvec=bfd_elf64_ia64_little_vec +     targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" +     ;; +@@ -214,7 +215,7 @@ +     targ_defvec=bfd_elf32_littlearm_vec +     targ_selvecs=bfd_elf32_bigarm_vec +     ;; +-  armeb-*-elf | arm*b-*-linux-gnu*) ++  armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) +     targ_defvec=bfd_elf32_bigarm_vec +     targ_selvecs=bfd_elf32_littlearm_vec +     ;; +@@ -222,7 +223,8 @@ +     targ_defvec=bfd_elf32_littlearm_vec +     targ_selvecs=bfd_elf32_bigarm_vec +     ;; +-  arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | arm*-*-uclinux*) ++  arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | \ ++  arm*-*-conix* | arm*-*-uclinux*) +     targ_defvec=bfd_elf32_littlearm_vec +     targ_selvecs=bfd_elf32_bigarm_vec +     ;; +@@ -355,7 +357,7 @@ +     ;; +  + #ifdef BFD64 +-  hppa*64*-*-linux-gnu*) ++  hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) +     targ_defvec=bfd_elf64_hppa_linux_vec +     targ_selvecs=bfd_elf64_hppa_vec +     ;; +@@ -366,7 +368,7 @@ +     ;; + #endif +  +-  hppa*-*-linux-gnu*) ++  hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) +     targ_defvec=bfd_elf32_hppa_linux_vec +     targ_selvecs=bfd_elf32_hppa_vec +     ;; +@@ -488,7 +490,7 @@ +     targ_selvecs=bfd_elf32_i386_vec +     targ_underscore=yes +     ;; +-  i[3-7]86-*-linux-gnu*) ++  i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) +     targ_defvec=bfd_elf32_i386_vec +     targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" +     targ64_selvecs=bfd_elf64_x86_64_vec +@@ -502,7 +504,7 @@ +     targ_defvec=bfd_elf64_x86_64_vec +     targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" +     ;; +-  x86_64-*-linux-gnu*) ++  x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) +     targ_defvec=bfd_elf64_x86_64_vec +     targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" +     ;; +@@ -662,7 +664,7 @@ +     targ_selvecs=bfd_elf32_m68k_vec +     targ_underscore=yes +     ;; +-  m68*-*-linux-gnu*) ++  m68*-*-linux-gnu* | m68*-*-linux-uclibc*) +     targ_defvec=bfd_elf32_m68k_vec +     targ_selvecs=m68klinux_vec +     ;; +@@ -929,7 +931,8 @@ +     ;; + #endif +   powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +-  powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++  powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++  powerpc-*-rtems* | \ +   powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) +     targ_defvec=bfd_elf32_powerpc_vec +     targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -961,8 +964,8 @@ +     targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" +     ;; +   powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +-  powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +-  powerpcle-*-rtems*) ++  powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++  powerpcle-*-vxworks* | powerpcle-*-rtems*) +     targ_defvec=bfd_elf32_powerpcle_vec +     targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" +     targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1110,7 +1113,7 @@ +     targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" +     targ_underscore=yes +     ;; +-  sparc-*-linux-gnu*) ++  sparc-*-linux-gnu* | sparc-*-linux-uclibc*) +     targ_defvec=bfd_elf32_sparc_vec +     targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" +     ;; +@@ -1157,7 +1160,7 @@ +     targ_defvec=sunos_big_vec +     targ_underscore=yes +     ;; +-  sparc64-*-linux-gnu*) ++  sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) +     targ_defvec=bfd_elf64_sparc_vec +     targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" +     ;; +diff -urN binutils-2.14.90.0.6/bfd/configure binutils-2.14.90.0.6-uClibc/bfd/configure +--- binutils-2.14.90.0.6/bfd/configure	2003-08-21 10:28:47.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/bfd/configure	2004-01-06 20:26:51.000000000 -0600 +@@ -1698,6 +1698,11 @@ +   lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` +   ;; +  ++linux-uclibc*) ++  lt_cv_deplibs_check_method=pass_all ++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++  ;; ++ + netbsd*) +   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then +     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5102,7 +5107,7 @@ +   alpha*-*-freebsd*) + 	COREFILE='' + 	;; +-  alpha*-*-linux-gnu*) ++  alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + 	COREFILE=trad-core.lo + 	TRAD_HEADER='"hosts/alphalinux.h"' + 	;; +@@ -5161,7 +5166,7 @@ + 	COREFILE=trad-core.lo + 	TRAD_HEADER='"hosts/i386mach3.h"' + 	;; +-  i[3-7]86-*-linux-gnu*) ++  i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + 	COREFILE=trad-core.lo + 	TRAD_HEADER='"hosts/i386linux.h"' + 	;; +@@ -5211,7 +5216,7 @@ + 	COREFILE=trad-core.lo + 	TRAD_HEADER='"hosts/hp300bsd.h"' + 	;; +-  m68*-*-linux-gnu*) ++  m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + 	COREFILE=trad-core.lo + 	TRAD_HEADER='"hosts/m68klinux.h"' + 	;; +diff -urN binutils-2.14.90.0.6/bfd/configure.in binutils-2.14.90.0.6-uClibc/bfd/configure.in +--- binutils-2.14.90.0.6/bfd/configure.in	2003-08-21 10:28:47.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/bfd/configure.in	2004-01-06 20:33:02.000000000 -0600 +@@ -153,7 +153,7 @@ +   alpha*-*-freebsd*) + 	COREFILE='' + 	;; +-  alpha*-*-linux-gnu*) ++  alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + 	COREFILE=trad-core.lo + 	TRAD_HEADER='"hosts/alphalinux.h"' + 	;; +@@ -233,7 +233,7 @@ + 	TRAD_HEADER='"hosts/i386mach3.h"' + 	;; + changequote(,)dnl +-  i[3-7]86-*-linux-gnu*) ++  i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + 	COREFILE=trad-core.lo + 	TRAD_HEADER='"hosts/i386linux.h"' +@@ -286,7 +286,7 @@ + 	COREFILE=trad-core.lo + 	TRAD_HEADER='"hosts/hp300bsd.h"' + 	;; +-  m68*-*-linux-gnu*) ++  m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + 	COREFILE=trad-core.lo + 	TRAD_HEADER='"hosts/m68klinux.h"' + 	;; +diff -urN binutils-2.14.90.0.6/config.sub binutils-2.14.90.0.6-uClibc/config.sub +--- binutils-2.14.90.0.6/config.sub	2003-08-21 10:28:47.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/config.sub	2004-01-06 22:56:56.000000000 -0600 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +-  nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) ++  nto-qnx* | linux-gnu* | linux-uclibc* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) +     os=-$maybe_os +     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` +     ;; +@@ -1131,7 +1131,8 @@ + 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + 	      | -chorusos* | -chorusrdb* \ + 	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +-	      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++	      | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++	      | -uxpv* | -beos* | -mpeix* | -udk* \ + 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN binutils-2.14.90.0.6/configure binutils-2.14.90.0.6-uClibc/configure +--- binutils-2.14.90.0.6/configure	2003-08-21 10:29:32.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/configure	2004-01-07 05:43:40.000000000 -0600 +@@ -1257,6 +1262,18 @@ +   i[3456789]86-*-freebsd*) +     noconfigdirs="$noconfigdirs target-newlib target-libgloss" +     ;; ++  i[3456789]86-*-linux-uclibc) ++    # This section makes it possible to build newlib natively on linux. ++    # If we are using a cross compiler then don't configure newlib. ++    if test x${is_cross_compiler} != xno ; then ++      noconfigdirs="$noconfigdirs target-newlib" ++    fi ++    noconfigdirs="$noconfigdirs target-libgloss" ++    # If we are not using a cross compiler, do configure newlib. ++    # Note however, that newlib will only be configured in this situation ++    # if the --with-newlib option has been given, because otherwise ++    # 'target-newlib' will appear in skipdirs. ++    ;; +   i[3456789]86-*-linux*) +     # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's +     # not build java stuff by default. +diff -urN binutils-2.14.90.0.6/configure.in binutils-2.14.90.0.6-uClibc/configure.in +--- binutils-2.14.90.0.6/configure.in	2003-08-21 10:29:30.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/configure.in	2004-01-07 05:44:02.000000000 -0600 +@@ -508,6 +513,19 @@ +   i[[3456789]]86-*-freebsd*) +     noconfigdirs="$noconfigdirs target-newlib target-libgloss" +     ;; ++  i[3456789]86-*-linux-uclibc) ++    # This section makes it possible to build newlib natively on linux. ++    # If we are using a cross compiler then don't configure newlib. ++    if test x${is_cross_compiler} != xno ; then ++      noconfigdirs="$noconfigdirs target-newlib" ++    fi ++    noconfigdirs="$noconfigdirs target-libgloss" ++    build_modules= ++    # If we are not using a cross compiler, do configure newlib. ++    # Note however, that newlib will only be configured in this situation ++    # if the --with-newlib option has been given, because otherwise ++    # 'target-newlib' will appear in skipdirs. ++    ;; +   i[[3456789]]86-*-linux*) +     # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's +     # not build java stuff by default. +diff -urN binutils-2.14.90.0.6/demangler/configure binutils-2.14.90.0.6-uClibc/demangler/configure +--- binutils-2.14.90.0.6/demangler/configure	2003-08-21 10:29:31.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/demangler/configure	2004-01-06 21:45:51.000000000 -0600 +@@ -1363,6 +1363,11 @@ +   lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` +   ;; +  ++linux-uclibc*) ++  lt_cv_deplibs_check_method=pass_all ++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++  ;; ++ + netbsd*) +   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then +     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.14.90.0.6/gas/configure binutils-2.14.90.0.6-uClibc/gas/configure +--- binutils-2.14.90.0.6/gas/configure	2003-07-23 10:08:10.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/gas/configure	2004-01-06 21:57:25.000000000 -0600 +@@ -1576,6 +1576,11 @@ +   lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` +   ;; +  ++linux-uclibc*) ++  lt_cv_deplibs_check_method=pass_all ++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++  ;; ++ + netbsd*) +   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then +     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -2370,6 +2375,7 @@ +       alpha*-*-osf*)			fmt=ecoff ;; +       alpha*-*-linuxecoff*)		fmt=ecoff ;; +       alpha*-*-linux-gnu*)		fmt=elf em=linux ;; ++      alpha*-*-linux-uclibc*)		fmt=elf em=linux ;; +       alpha*-*-netbsd*)			fmt=elf em=nbsd ;; +       alpha*-*-openbsd*)		fmt=elf em=obsd ;; +  +@@ -2386,6 +2392,7 @@ +       arm*-*-conix*)			fmt=elf ;; +       arm-*-linux*aout*)		fmt=aout em=linux ;; +       arm*-*-linux-gnu*)		fmt=elf  em=linux ;; ++      arm*-*-linux-uclibc*)		fmt=elf  em=linux ;; +       arm*-*-uclinux*)			fmt=elf  em=linux ;; +       arm-*-netbsdelf*)                 fmt=elf  em=nbsd ;; +       arm-*-*n*bsd*)			fmt=aout em=nbsd ;; +@@ -2400,6 +2407,7 @@ +       avr-*-*)				fmt=elf ;; +  +       cris-*-linux-gnu*)		fmt=multi bfd_gas=yes em=linux ;; ++      cris-*-linux-uclibc*)		fmt=multi bfd_gas=yes em=linux ;; +       cris-*-*)				fmt=multi bfd_gas=yes ;; +  +       d10v-*-*)				fmt=elf ;; +@@ -2455,7 +2463,9 @@ +       i386-*-linux*oldld)		fmt=aout em=linux ;; +       i386-*-linux*coff*)		fmt=coff em=linux ;; +       i386-*-linux-gnu*)		fmt=elf em=linux ;; ++      i386-*-linux-uclibc*)		fmt=elf em=linux ;; +       x86_64-*-linux-gnu*)		fmt=elf em=linux ;; ++      x86_64-*-linux-uclibc*)		fmt=elf em=linux ;; +       i386-*-lynxos*)			fmt=coff em=lynx ;; +       i386-*-sysv[45]*)			fmt=elf ;; +       i386-*-solaris*)			fmt=elf ;; +@@ -2512,6 +2522,7 @@ +       ia64-*-elf*)			fmt=elf ;; +       ia64-*-aix*)			fmt=elf em=ia64aix ;; +       ia64-*-linux-gnu*)		fmt=elf em=linux ;; ++      ia64-*-linux-uclibc*)		fmt=elf em=linux ;; +       ia64-*-hpux*)			fmt=elf em=hpux ;; +       ia64-*-netbsd*)			fmt=elf em=nbsd ;; +  +@@ -2538,6 +2549,7 @@ +       m68k-*-hpux*)			fmt=hp300 em=hp300 ;; +       m68k-*-linux*aout*)		fmt=aout em=linux ;; +       m68k-*-linux-gnu*)		fmt=elf em=linux ;; ++      m68k-*-linux-uclibc*)		fmt=elf em=linux ;; +       m68k-*-gnu*)			fmt=elf ;; +       m68k-*-lynxos*)			fmt=coff em=lynx ;; +       m68k-*-netbsdelf*)		fmt=elf em=nbsd ;; +@@ -2592,6 +2604,7 @@ +       ppc-*-beos*)			fmt=coff ;; +       ppc-*-*n*bsd* | ppc-*-elf*)	fmt=elf ;; +       ppc-*-eabi* | ppc-*-sysv4*)	fmt=elf ;; ++      ppc-*-linux-uclibc* | \ +       ppc-*-linux-gnu*)			fmt=elf + 	    case "$endian" in + 		big)  ;; +@@ -2616,7 +2629,9 @@ +       ppc-*-kaos*)			fmt=elf ;; +  +       s390x-*-linux-gnu*)		fmt=elf em=linux ;; ++      s390x-*-linux-uclibc*)		fmt=elf em=linux ;; +       s390-*-linux-gnu*)		fmt=elf em=linux ;; ++      s390-*-linux-uclibc*)		fmt=elf em=linux ;; +  +       sh*-*-linux*)			fmt=elf em=linux + 	    case ${cpu} in +@@ -2649,6 +2664,7 @@ +       sparc-*-coff)			fmt=coff ;; +       sparc-*-linux*aout*)		fmt=aout em=linux ;; +       sparc-*-linux-gnu*)		fmt=elf em=linux ;; ++      sparc-*-linux-uclibc*)		fmt=elf em=linux ;; +       sparc-*-lynxos*)			fmt=coff em=lynx ;; +       sparc-fujitsu-none)		fmt=aout ;; +       sparc-*-elf)			fmt=elf ;; +diff -urN binutils-2.14.90.0.6/gas/configure.in binutils-2.14.90.0.6-uClibc/gas/configure.in +--- binutils-2.14.90.0.6/gas/configure.in	2003-07-23 10:08:10.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/gas/configure.in	2004-01-06 21:57:26.000000000 -0600 +@@ -184,6 +184,7 @@ +       alpha*-*-osf*)			fmt=ecoff ;; +       alpha*-*-linuxecoff*)		fmt=ecoff ;; +       alpha*-*-linux-gnu*)		fmt=elf em=linux ;; ++      alpha*-*-linux-uclibc*)		fmt=elf em=linux ;; +       alpha*-*-netbsd*)			fmt=elf em=nbsd ;; +       alpha*-*-openbsd*)		fmt=elf em=obsd ;; +  +@@ -200,6 +201,7 @@ +       arm*-*-conix*)			fmt=elf ;; +       arm-*-linux*aout*)		fmt=aout em=linux ;; +       arm*-*-linux-gnu*)		fmt=elf  em=linux ;; ++      arm*-*-linux-uclibc*)		fmt=elf  em=linux ;; +       arm*-*-uclinux*)			fmt=elf  em=linux ;; +       arm-*-netbsdelf*)                 fmt=elf  em=nbsd ;; +       arm-*-*n*bsd*)			fmt=aout em=nbsd ;; +@@ -214,6 +216,7 @@ +       avr-*-*)				fmt=elf ;; +  +       cris-*-linux-gnu*)		fmt=multi bfd_gas=yes em=linux ;; ++      cris-*-linux-uclibc*)		fmt=multi bfd_gas=yes em=linux ;; +       cris-*-*)				fmt=multi bfd_gas=yes ;; +  +       d10v-*-*)				fmt=elf ;; +@@ -269,7 +272,9 @@ +       i386-*-linux*oldld)		fmt=aout em=linux ;; +       i386-*-linux*coff*)		fmt=coff em=linux ;; +       i386-*-linux-gnu*)		fmt=elf em=linux ;; ++      i386-*-linux-uclibc*)		fmt=elf em=linux ;; +       x86_64-*-linux-gnu*)		fmt=elf em=linux ;; ++      x86_64-*-linux-uclibc*)		fmt=elf em=linux ;; +       i386-*-lynxos*)			fmt=coff em=lynx ;; + changequote(,)dnl +       i386-*-sysv[45]*)			fmt=elf ;; +@@ -322,6 +327,7 @@ +       ia64-*-elf*)			fmt=elf ;; +       ia64-*-aix*)			fmt=elf em=ia64aix ;; +       ia64-*-linux-gnu*)		fmt=elf em=linux ;; ++      ia64-*-linux-uclibc*)		fmt=elf em=linux ;; +       ia64-*-hpux*)			fmt=elf em=hpux ;; +       ia64-*-netbsd*)			fmt=elf em=nbsd ;; +  +@@ -348,6 +354,7 @@ +       m68k-*-hpux*)			fmt=hp300 em=hp300 ;; +       m68k-*-linux*aout*)		fmt=aout em=linux ;; +       m68k-*-linux-gnu*)		fmt=elf em=linux ;; ++      m68k-*-linux-uclibc*)		fmt=elf em=linux ;; +       m68k-*-gnu*)			fmt=elf ;; +       m68k-*-lynxos*)			fmt=coff em=lynx ;; +       m68k-*-netbsdelf*)		fmt=elf em=nbsd ;; +@@ -402,6 +409,7 @@ +       ppc-*-beos*)			fmt=coff ;; +       ppc-*-*n*bsd* | ppc-*-elf*)	fmt=elf ;; +       ppc-*-eabi* | ppc-*-sysv4*)	fmt=elf ;; ++      ppc-*-linux-uclibc* | \ +       ppc-*-linux-gnu*)			fmt=elf + 	    case "$endian" in + 		big)  ;; +@@ -424,7 +432,9 @@ +       ppc-*-kaos*)			fmt=elf ;; +  +       s390x-*-linux-gnu*)		fmt=elf em=linux ;; ++      s390x-*-linux-uclibc*)		fmt=elf em=linux ;; +       s390-*-linux-gnu*)		fmt=elf em=linux ;; ++      s390-*-linux-uclibc*)		fmt=elf em=linux ;; +  +       sh*-*-linux*)			fmt=elf em=linux + 	    case ${cpu} in +@@ -457,6 +467,7 @@ +       sparc-*-coff)			fmt=coff ;; +       sparc-*-linux*aout*)		fmt=aout em=linux ;; +       sparc-*-linux-gnu*)		fmt=elf em=linux ;; ++      sparc-*-linux-uclibc*)		fmt=elf em=linux ;; +       sparc-*-lynxos*)			fmt=coff em=lynx ;; +       sparc-fujitsu-none)		fmt=aout ;; +       sparc-*-elf)			fmt=elf ;; +diff -urN binutils-2.14.90.0.6/ld/configure binutils-2.14.90.0.6-uClibc/ld/configure +--- binutils-2.14.90.0.6/ld/configure	2003-05-05 16:46:49.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/ld/configure	2004-01-06 21:59:31.000000000 -0600 +@@ -1578,6 +1578,11 @@ +   lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` +   ;; +  ++linux-uclibc*) ++  lt_cv_deplibs_check_method=pass_all ++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++  ;; ++ + netbsd*) +   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then +     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.14.90.0.6/ld/configure.tgt binutils-2.14.90.0.6-uClibc/ld/configure.tgt +--- binutils-2.14.90.0.6/ld/configure.tgt	2003-08-21 10:28:48.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/ld/configure.tgt	2004-01-06 22:09:40.000000000 -0600 +@@ -30,6 +30,7 @@ + 			targ_extra_emuls="criself crislinux" + 			targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*)	targ_emul=crislinux ;; ++cris-*-linux-uclibc*)	targ_emul=crislinux ;; + cris-*-*)		targ_emul=criself + 			targ_extra_emuls="crisaout crislinux" + 			targ_extra_libpath=$targ_extra_emuls ;; +@@ -59,14 +60,16 @@ + 			tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + 			tdir_sun4=sparc-sun-sunos4 + 			;; +-sparc64-*-linux-gnu*)	targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*)	 \ ++			targ_emul=elf64_sparc + 			targ_extra_emuls="elf32_sparc sparclinux sun4" + 			targ_extra_libpath=elf32_sparc + 			tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + 			tdir_sparclinux=${tdir_elf32_sparc}aout + 			tdir_sun4=sparc-sun-sunos4 + 			;; +-sparc*-*-linux-gnu*)	targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-gnu*) \ ++			targ_emul=elf32_sparc + 			targ_extra_emuls="sparclinux elf64_sparc sun4" + 			targ_extra_libpath=elf64_sparc + 			tdir_sparclinux=${targ_alias}aout +@@ -124,7 +127,7 @@ + m68*-ericsson-ose)	targ_emul=sun3 ;; + m68*-apple-aux*)	targ_emul=m68kaux ;; + *-tandem-none)		targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*)	targ_emul=i386nto ;; + i[3-7]86-*-vsta)	targ_emul=vsta ;; + i[3-7]86-go32-rtems*)	targ_emul=i386go32 ;; +@@ -148,14 +151,16 @@ + 			tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + 			;; + i[3-7]86-*-linux*oldld)	targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*)	targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++			targ_emul=elf_i386 + 			targ_extra_emuls=i386linux + 			if test x${want64} = xtrue; then + 			  targ_extra_emuls="$targ_extra_emuls elf_x86_64" + 			fi + 			tdir_i386linux=${targ_alias}aout + 			;; +-x86_64-*-linux-gnu*)	targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++			targ_emul=elf_x86_64 + 			targ_extra_emuls="elf_i386 i386linux" + 			targ_extra_libpath=elf_i386 + 			tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -250,10 +255,13 @@ + arm9e-*-elf)		targ_emul=armelf ;; + arm-*-oabi)		targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*)	targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*)	targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*)	targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*)	targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*)	targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*)		targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*)	targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++			targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff)	targ_emul=armcoff ;; + strongarm-*-elf)	targ_emul=armelf ;; + strongarm-*-kaos*)	targ_emul=armelf ;; +@@ -354,7 +362,8 @@ + 			targ_extra_emuls=m68kelf + 			tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + 			;; +-m68k-*-linux-gnu*)	targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++			targ_emul=m68kelf + 			targ_extra_emuls=m68klinux + 			tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + 			;; +@@ -370,9 +379,9 @@ + m68*-*-psos*)		targ_emul=m68kpsos ;; + m68*-*-rtemscoff*)	targ_emul=m68kcoff ;; + m68*-*-rtems*)		targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*)	targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*)  targ_emul=hppa64linux ;; + hppa*64*-*)		targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*)	targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*)	targ_emul=hppalinux ;; + hppa*-*-*elf*)		targ_emul=hppaelf ;; + hppa*-*-lites*)		targ_emul=hppaelf ;; + hppa*-*-netbsd*)	targ_emul=hppanbsd ;; +@@ -416,16 +425,20 @@ + mips*-*-rtems*)		targ_emul=elf32ebmip ;; + mips*el-*-vxworks*)	targ_emul=elf32elmip ;; + mips*-*-vxworks*)	targ_emul=elf32ebmip ;; +-mips64*el-*-linux-gnu*)	targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) \ ++			targ_emul=elf32ltsmipn32 + 			targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + 			;; +-mips64*-*-linux-gnu*)	targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) \ ++			targ_emul=elf32btsmipn32 + 			targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + 			;; +-mips*el-*-linux-gnu*)	targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) \ ++			targ_emul=elf32ltsmip + 			targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + 			;; +-mips*-*-linux-gnu*)	targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) \ ++			targ_emul=elf32btsmip + 			targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + 			;; + mips*-*-lnews*)		targ_emul=mipslnews ;; +@@ -447,6 +460,10 @@ + alpha*-*-linux-gnu*)	targ_emul=elf64alpha targ_extra_emuls=alpha + 			tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + 			;; ++alpha*-*-linux-uclibc*)	targ_emul=elf64alpha targ_extra_emuls=alpha ++			# The following needs to be checked... ++			tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++			;; + alpha*-*-osf*)		targ_emul=alpha ;; + alpha*-*-gnu*)		targ_emul=elf64alpha ;; + alpha*-*-netware*)	targ_emul=alpha ;; +diff -urN binutils-2.14.90.0.6/libtool.m4 binutils-2.14.90.0.6-uClibc/libtool.m4 +--- binutils-2.14.90.0.6/libtool.m4	2003-05-05 16:46:46.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/libtool.m4	2004-01-06 20:30:39.000000000 -0600 +@@ -645,6 +645,11 @@ +   lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` +   ;; +  ++linux-uclibc*) ++  lt_cv_deplibs_check_method=pass_all ++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++  ;; ++ + netbsd*) +   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then +     [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.14.90.0.6/ltconfig binutils-2.14.90.0.6-uClibc/ltconfig +--- binutils-2.14.90.0.6/ltconfig	2003-07-23 10:08:08.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/ltconfig	2004-01-06 21:05:11.000000000 -0600 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +  +@@ -1259,6 +1260,24 @@ +   dynamic_linker='GNU/Linux ld.so' +   ;; +  ++linux-uclibc*) ++  version_type=linux ++  need_lib_prefix=no ++  need_version=no ++  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++  soname_spec='${libname}${release}.so$major' ++  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++  shlibpath_var=LD_LIBRARY_PATH ++  shlibpath_overrides_runpath=no ++  # This implies no fast_install, which is unacceptable. ++  # Some rework will be needed to allow for fast_install ++  # before this can be enabled. ++  # Note: copied from linux-gnu, and may not be appropriate. ++  hardcode_into_libs=yes ++  # Assume using the uClibc dynamic linker. ++  dynamic_linker="uClibc ld.so" ++  ;; ++ + netbsd*) +   need_lib_prefix=no +   need_version=no diff --git a/sources/binutils-uclibc-200-build_modules.patch b/sources/binutils-uclibc-200-build_modules.patch new file mode 100644 index 000000000..e9f8e75a8 --- /dev/null +++ b/sources/binutils-uclibc-200-build_modules.patch @@ -0,0 +1,31 @@ +Get around an odd build failure. +diff -urN binutils-2.14.90.0.6/configure binutils-2.14.90.0.6-uClibc/configure +--- binutils-2.14.90.0.6/configure	2003-08-21 10:29:32.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/configure	2004-01-07 05:43:40.000000000 -0600 +@@ -906,6 +906,11 @@ + fi +  +  ++case "$target" in ++  *-*-*-uclibc*) ++    build_modules= ++    ;; ++esac + ################################################################################ +  + srcname="gnu development package" +diff -urN binutils-2.14.90.0.6/configure.in binutils-2.14.90.0.6-uClibc/configure.in +--- binutils-2.14.90.0.6/configure.in	2003-08-21 10:29:30.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/configure.in	2004-01-07 05:44:02.000000000 -0600 +@@ -178,6 +178,11 @@ + fi +  +  ++case "$target" in ++  *-*-*-uclibc*) ++    build_modules= ++    ;; ++esac + ################################################################################ +  + srcname="gnu development package" diff --git a/sources/gcc-uclibc-3.3-100-conf.patch b/sources/gcc-uclibc-3.3-100-conf.patch new file mode 100644 index 000000000..e09c42dc8 --- /dev/null +++ b/sources/gcc-uclibc-3.3-100-conf.patch @@ -0,0 +1,1850 @@ +diff -urN gcc-3.3.2/boehm-gc/config.sub gcc-3.3.2-uClibc/boehm-gc/config.sub +--- gcc-3.3.2/boehm-gc/config.sub	2002-02-11 22:37:53.000000000 -0600 ++++ gcc-3.3.2-uClibc/boehm-gc/config.sub	2004-01-06 22:54:57.000000000 -0600 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +-  nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*) ++  nto-qnx* | linux-gnu* | linux-uclibc* | storm-chaos* | os2-emx* | windows32-*) +     os=-$maybe_os +     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` +     ;; +@@ -1089,7 +1089,8 @@ + 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + 	      | -chorusos* | -chorusrdb* \ + 	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +-	      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++	      | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++	      | -uxpv* | -beos* | -mpeix* | -udk* \ + 	      | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN gcc-3.3.2/config.sub gcc-3.3.2-uClibc/config.sub +--- gcc-3.3.2/config.sub	2003-01-30 17:25:36.000000000 -0600 ++++ gcc-3.3.2-uClibc/config.sub	2004-01-06 22:51:57.000000000 -0600 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +-  nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) ++  nto-qnx* | linux-gnu* | linux-uclibc* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) +     os=-$maybe_os +     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` +     ;; +@@ -1112,7 +1112,8 @@ + 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + 	      | -chorusos* | -chorusrdb* \ + 	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +-	      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++	      | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++	      | -uxpv* | -beos* | -mpeix* | -udk* \ + 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN gcc-3.3.2/gcc/config/arm/linux-elf.h gcc-3.3.2-uClibc/gcc/config/arm/linux-elf.h +--- gcc-3.3.2/gcc/config/arm/linux-elf.h	2003-09-16 10:39:23.000000000 -0500 ++++ gcc-3.3.2-uClibc/gcc/config/arm/linux-elf.h	2004-01-07 02:40:15.000000000 -0600 +@@ -78,6 +78,18 @@ +   "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" +  + #undef  LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC "%{h*} %{version:-v} \ ++   %{b} %{Wl,*:%*} \ ++   %{static:-Bstatic} \ ++   %{shared:-shared} \ ++   %{symbolic:-Bsymbolic} \ ++   %{rdynamic:-export-dynamic} \ ++   %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ ++   -X \ ++   %{mbig-endian:-EB}" \ ++   SUBTARGET_EXTRA_LINK_SPEC ++#else + #define LINK_SPEC "%{h*} %{version:-v} \ +    %{b} %{Wl,*:%*} \ +    %{static:-Bstatic} \ +@@ -88,6 +100,7 @@ +    -X \ +    %{mbig-endian:-EB}" \ +    SUBTARGET_EXTRA_LINK_SPEC ++#endif +  + #define TARGET_OS_CPP_BUILTINS()		\ +     do {					\ +diff -urN gcc-3.3.2/gcc/config/cris/linux.h gcc-3.3.2-uClibc/gcc/config/cris/linux.h +--- gcc-3.3.2/gcc/config/cris/linux.h	2003-03-10 21:01:35.000000000 -0600 ++++ gcc-3.3.2-uClibc/gcc/config/cris/linux.h	2004-01-08 08:46:08.000000000 -0600 +@@ -81,6 +81,25 @@ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG +  ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++  -rpath-link include/asm/../..%s\ ++  %{shared} %{static}\ ++  %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++  %{!shared: \ ++    %{!static: \ ++      %{rdynamic:-export-dynamic} \ ++      %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++  %{!r:%{O2|O3: --gc-sections}}" ++ ++#else  /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" +  +@@ -95,6 +114,8 @@ +   %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ +   %{!r:%{O2|O3: --gc-sections}}" +  ++#endif  /* USE_UCLIBC */ ++ +  + /* Node: Run-time Target */ +  +diff -urN gcc-3.3.2/gcc/config/cris/t-linux-uclibc gcc-3.3.2-uClibc/gcc/config/cris/t-linux-uclibc +--- gcc-3.3.2/gcc/config/cris/t-linux-uclibc	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/gcc/config/cris/t-linux-uclibc	2004-01-08 09:56:59.000000000 -0600 +@@ -0,0 +1,3 @@ ++T_CFLAGS = -DUSE_UCLIBC ++TARGET_LIBGCC2_CFLAGS += -fPIC ++CRTSTUFF_T_CFLAGS_S = $(TARGET_LIBGCC2_CFLAGS) +diff -urN gcc-3.3.2/gcc/config/i386/linux.h gcc-3.3.2-uClibc/gcc/config/i386/linux.h +--- gcc-3.3.2/gcc/config/i386/linux.h	2002-11-15 08:57:12.000000000 -0600 ++++ gcc-3.3.2-uClibc/gcc/config/i386/linux.h	2004-01-06 22:30:58.000000000 -0600 +@@ -136,6 +136,15 @@ + 	%{static:-static}}}" + #endif + #else ++#if defined USE_UCLIBC ++#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ ++  %{!shared: \ ++    %{!ibcs: \ ++      %{!static: \ ++	%{rdynamic:-export-dynamic} \ ++	%{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++	%{static:-static}}}" ++#else + #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ +   %{!shared: \ +     %{!ibcs: \ +@@ -144,6 +153,7 @@ + 	%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + 	%{static:-static}}}" + #endif ++#endif +  + /* A C statement (sans semicolon) to output to the stdio stream +    FILE the assembler definition of uninitialized global DECL named +diff -urN gcc-3.3.2/gcc/config/mips/linux.h gcc-3.3.2-uClibc/gcc/config/mips/linux.h +--- gcc-3.3.2/gcc/config/mips/linux.h	2003-05-08 12:31:34.000000000 -0500 ++++ gcc-3.3.2-uClibc/gcc/config/mips/linux.h	2004-01-08 01:59:52.000000000 -0600 +@@ -175,6 +175,17 @@ +  + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC \ ++ "%(endian_spec) \ ++  %{shared:-shared} \ ++  %{!shared: \ ++    %{!ibcs: \ ++      %{!static: \ ++        %{rdynamic:-export-dynamic} \ ++        %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++        %{static:-static}}}" ++#else + #define LINK_SPEC \ +  "%(endian_spec) \ +   %{shared:-shared} \ +@@ -184,6 +195,7 @@ +         %{rdynamic:-export-dynamic} \ +         %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ +         %{static:-static}}}" ++#endif +  + #undef SUBTARGET_ASM_SPEC + #define SUBTARGET_ASM_SPEC "\ +diff -urN gcc-3.3.2/gcc/config/sh/linux.h gcc-3.3.2-uClibc/gcc/config/sh/linux.h +--- gcc-3.3.2/gcc/config/sh/linux.h	2003-09-16 10:39:23.000000000 -0500 ++++ gcc-3.3.2-uClibc/gcc/config/sh/linux.h	2004-01-08 04:56:28.000000000 -0600 +@@ -44,12 +44,21 @@ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define SUBTARGET_LINK_SPEC \ ++  "%{shared:-shared} \ ++   %{!static: \ ++     %{rdynamic:-export-dynamic} \ ++     %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++   %{static:-static}" ++#else + #define SUBTARGET_LINK_SPEC \ +   "%{shared:-shared} \ +    %{!static: \ +      %{rdynamic:-export-dynamic} \ +      %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ +    %{static:-static}" ++#endif +  + /* The GNU C++ standard library requires that these macros be defined.  */ + #undef CPLUSPLUS_CPP_SPEC +diff -urN gcc-3.3.2/gcc/config/sh/t-linux-uclibc gcc-3.3.2-uClibc/gcc/config/sh/t-linux-uclibc +--- gcc-3.3.2/gcc/config/sh/t-linux-uclibc	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/gcc/config/sh/t-linux-uclibc	2004-01-08 06:05:54.000000000 -0600 +@@ -0,0 +1,16 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Don't run fixproto ++STMP_FIXPROTO = ++ ++TARGET_LIBGCC2_CFLAGS = -fpic ++LIB1ASMFUNCS_CACHE = _ic_invalidate ++ ++LIB2FUNCS_EXTRA= ++ ++MULTILIB_OPTIONS= $(MULTILIB_ENDIAN) m3e/m4 ++MULTILIB_DIRNAMES=  ++MULTILIB_MATCHES =  ++MULTILIB_EXCEPTIONS= ++ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o +diff -urN gcc-3.3.2/gcc/config/sh/t-sh64-uclibc gcc-3.3.2-uClibc/gcc/config/sh/t-sh64-uclibc +--- gcc-3.3.2/gcc/config/sh/t-sh64-uclibc	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/gcc/config/sh/t-sh64-uclibc	2004-01-08 07:39:41.000000000 -0600 +@@ -0,0 +1,13 @@ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o ++ ++LIB1ASMFUNCS = \ ++  _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ ++  _shcompact_call_trampoline _shcompact_return_trampoline \ ++  _shcompact_incoming_args _ic_invalidate _nested_trampoline \ ++  _push_pop_shmedia_regs \ ++  _udivdi3 _divdi3 _umoddi3 _moddi3 ++ ++MULTILIB_OPTIONS = $(MULTILIB_ENDIAN) m5-32media-nofpu/m5-compact/m5-compact-nofpu/m5-64media/m5-64media-nofpu ++MULTILIB_DIRNAMES= $(MULTILIB_ENDIAN) nofpu compact nofpu/compact media64 nofpu/media64 ++MULTILIB_MATCHES= ++MULTILIB_EXCEPTIONS= +diff -urN gcc-3.3.2/gcc/config/t-linux-uclibc gcc-3.3.2-uClibc/gcc/config/t-linux-uclibc +--- gcc-3.3.2/gcc/config/t-linux-uclibc	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/gcc/config/t-linux-uclibc	2004-01-06 22:25:27.000000000 -0600 +@@ -0,0 +1,23 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Don't run fixproto ++STMP_FIXPROTO = ++ ++# Compile crtbeginS.o and crtendS.o with pic. ++CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) -fPIC ++# Compile libgcc2.a with pic. ++TARGET_LIBGCC2_CFLAGS = -fPIC ++ ++# Override t-slibgcc-elf-ver to export some libgcc symbols with ++# the symbol versions that glibc used. ++SHLIB_MAPFILES += $(srcdir)/config/libgcc-glibc.ver ++ ++# Use unwind-dw2-fde-glibc ++#LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde-glibc.c \ ++#  $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c ++#LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h unwind-dw2-fde.c ++ ++# Use unwind-dw2-fde ++LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \ ++  $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c ++LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h +diff -urN gcc-3.3.2/gcc/config.gcc gcc-3.3.2-uClibc/gcc/config.gcc +--- gcc-3.3.2/gcc/config.gcc	2003-10-01 14:07:01.000000000 -0500 ++++ gcc-3.3.2-uClibc/gcc/config.gcc	2004-01-08 08:12:01.000000000 -0600 +@@ -697,6 +697,17 @@ + 	extra_parts="" + 	use_collect2=yes + 	;; ++arm*-*-linux-uclibc*)		# ARM GNU/Linux with ELF - uClibc ++	tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/linux-gas.h arm/linux-elf.h" ++	tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" ++	extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++	gnu_ld=yes ++	case x${enable_threads} in ++	x | xyes | xpthreads | xposix) ++		thread_file='posix' ++		;; ++	esac ++	;; + arm*-*-linux*)			# ARM GNU/Linux with ELF + 	tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/linux-gas.h arm/linux-elf.h" + 	tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" +@@ -772,6 +783,10 @@ + 	tmake_file="cris/t-cris cris/t-elfmulti" + 	gas=yes + 	;; ++cris-*-linux-uclibc*) ++	tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" ++	tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux-uclibc" ++	;; + cris-*-linux*) + 	tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" + 	tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux" +@@ -1173,6 +1188,11 @@ + 		thread_file='single' + 	fi + 	;; ++i[34567]86-*-linux*uclibc*)	# Intel 80386's running GNU/Linux ++				# with ELF format using uClibc ++	tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h" ++	tmake_file="t-slibgcc-elf-ver t-linux-uclibc i386/t-crtstuff" ++	;; + i[34567]86-*-linux*)	# Intel 80386's running GNU/Linux + 			# with ELF format using glibc 2 + 			# aka GNU/Linux C library 6 +@@ -1883,6 +1903,16 @@ + 	tm_file="elfos.h ${tm_file} mips/netbsd.h" + 	tmake_file="${tmake_file} mips/t-netbsd" + 	;; ++mips*-*-linux-uclibc*)			# Linux MIPS, either endian. uClibc ++        tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" ++	case $machine in ++        mipsisa32*-*) ++                target_cpu_default="MASK_SOFT_FLOAT" ++		tm_defines="MIPS_ISA_DEFAULT=32" ++                ;; ++        esac ++	tmake_file="t-slibgcc-elf-ver t-linux-uclibc mips/t-linux" ++	;; + mips*-*-linux*)				# Linux MIPS, either endian. +         tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" + 	case $machine in +@@ -2129,6 +2159,11 @@ + 	out_file=rs6000/rs6000.c + 	tmake_file="rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" + 	;; ++powerpc-*-linux-uclibc*) ++	tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" ++	out_file=rs6000/rs6000.c ++	tmake_file="rs6000/t-ppcos t-slibgcc-elf-ver t-linux-uclibc rs6000/t-ppccomm" ++	;; + powerpc-*-linux*) + 	tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" + 	out_file=rs6000/rs6000.c +@@ -2313,10 +2348,18 @@ + 		tmake_file="${tmake_file} sh/t-le" + 		;; + 	esac +-	tmake_file="${tmake_file} sh/t-linux" ++	case $machine in ++	*-*-linux-uclibc*) tmake_file="${tmake_file} sh/t-linux-uclibc" ;; ++	*) tmake_file="${tmake_file} sh/t-linux" ;; ++	esac + 	tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/linux.h" + 	gas=yes gnu_ld=yes + 	case $machine in ++	sh64*-*-linux-uclibc*) ++		tmake_file="${tmake_file} sh/t-sh64-uclibc" ++		tm_file="${tm_file} sh/sh64.h" ++		extra_headers="shmedia.h ushmedia.h sshmedia.h" ++		;; + 	sh64*) + 		tmake_file="${tmake_file} sh/t-sh64" + 		tm_file="${tm_file} sh/sh64.h" +diff -urN gcc-3.3.2/libstdc++-v3/aclocal.m4 gcc-3.3.2-uClibc/libstdc++-v3/aclocal.m4 +--- gcc-3.3.2/libstdc++-v3/aclocal.m4	2003-09-10 22:08:35.000000000 -0500 ++++ gcc-3.3.2-uClibc/libstdc++-v3/aclocal.m4	2004-01-09 01:53:14.000000000 -0600 +@@ -1216,6 +1216,9 @@ +   dnl Default to "generic" +   if test x$enable_clocale_flag = xno; then +     case x${target_os} in ++      xlinux-uclibc*) ++	enable_clocale_flag=uclibc ++	;; +       xlinux* | xgnu*) + 	AC_EGREP_CPP([_GLIBCPP_ok], [ +         #include <features.h> +@@ -1339,6 +1342,41 @@ +       CTIME_CC=config/locale/generic/time_members.cc +       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h +       ;; ++    xuclibc) ++      AC_MSG_RESULT(uclibc) ++ ++      # Declare intention to use gettext, and add support for specific ++      # languages. ++      # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++      ALL_LINGUAS="de fr" ++ ++      # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++      AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++      if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++	USE_NLS=yes ++      fi ++      # Export the build objects. ++      for ling in $ALL_LINGUAS; do \ ++        glibcpp_MOFILES="$glibcpp_MOFILES $ling.mo"; \ ++        glibcpp_POFILES="$glibcpp_POFILES $ling.po"; \ ++      done ++      AC_SUBST(glibcpp_MOFILES) ++      AC_SUBST(glibcpp_POFILES) ++ ++      CLOCALE_H=config/locale/uclibc/c_locale.h ++      CLOCALE_CC=config/locale/uclibc/c_locale.cc ++      CCODECVT_H=config/locale/uclibc/codecvt_specializations.h ++      CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++      CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++      CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++      CMESSAGES_H=config/locale/uclibc/messages_members.h ++      CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++      CMONEY_CC=config/locale/uclibc/monetary_members.cc ++      CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++      CTIME_H=config/locale/uclibc/time_members.h ++      CTIME_CC=config/locale/uclibc/time_members.cc ++      CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++      ;; +     *) +       echo "$enable_clocale is an unknown locale package" 1>&2 +       exit 1 +diff -urN gcc-3.3.2/libstdc++-v3/configure gcc-3.3.2-uClibc/libstdc++-v3/configure +--- gcc-3.3.2/libstdc++-v3/configure	2003-09-10 22:08:35.000000000 -0500 ++++ gcc-3.3.2-uClibc/libstdc++-v3/configure	2004-01-09 01:52:45.000000000 -0600 +@@ -2011,6 +2011,11 @@ +   lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` +   ;; +  ++linux-uclibc*) ++  lt_cv_deplibs_check_method=pass_all ++  lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++  ;; ++ + netbsd*) +   if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then +     lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -2997,6 +3002,9 @@ +  +       if test x$enable_clocale_flag = xno; then +     case x${target_os} in ++      xlinux-uclibc*) ++	enable_clocale_flag=uclibc ++	;; +       xlinux* | xgnu*) + 	cat > conftest.$ac_ext <<EOF + #line 3003 "configure" +@@ -3183,6 +3191,70 @@ +       CTIME_CC=config/locale/generic/time_members.cc +       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h +       ;; ++    xuclibc) ++      echo "$ac_t""uclibc" 1>&6 ++ ++      # Declare intention to use gettext, and add support for specific ++      # languages. ++      # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++      ALL_LINGUAS="de fr" ++ ++      # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++      # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++echo "configure:3118: checking for $ac_word" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_check_msgfmt'+set}'`\" = set"; then ++  echo $ac_n "(cached) $ac_c" 1>&6 ++else ++  if test -n "$check_msgfmt"; then ++  ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test. ++else ++  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":" ++  ac_dummy="$PATH" ++  for ac_dir in $ac_dummy; do ++    test -z "$ac_dir" && ac_dir=. ++    if test -f $ac_dir/$ac_word; then ++      ac_cv_prog_check_msgfmt="yes" ++      break ++    fi ++  done ++  IFS="$ac_save_ifs" ++  test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt="$ac_cv_prog_check_msgfmt" ++if test -n "$check_msgfmt"; then ++  echo "$ac_t""$check_msgfmt" 1>&6 ++else ++  echo "$ac_t""no" 1>&6 ++fi ++ ++      if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++	USE_NLS=yes ++      fi ++      # Export the build objects. ++      for ling in $ALL_LINGUAS; do \ ++        glibcpp_MOFILES="$glibcpp_MOFILES $ling.mo"; \ ++        glibcpp_POFILES="$glibcpp_POFILES $ling.po"; \ ++      done ++       ++       ++ ++      CLOCALE_H=config/locale/uclibc/c_locale.h ++      CLOCALE_CC=config/locale/uclibc/c_locale.cc ++      CCODECVT_H=config/locale/uclibc/codecvt_specializations.h ++      CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++      CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++      CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++      CMESSAGES_H=config/locale/uclibc/messages_members.h ++      CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++      CMONEY_CC=config/locale/uclibc/monetary_members.cc ++      CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++      CTIME_H=config/locale/uclibc/time_members.h ++      CTIME_CC=config/locale/uclibc/time_members.cc ++      CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++      ;; +     *) +       echo "$enable_clocale is an unknown locale package" 1>&2 +       exit 1 +@@ -4125,94 +4197,1055 @@ + echo "$ac_t""$DEBUG_FLAGS" 1>&6 +  +  +-# Check for headers necessary for libsupc++ using dyn-string.c/cxa_demangle.c +-for ac_hdr in string.h stdlib.h ++# Check for headers necessary for libsupc++ using dyn-string.c/cxa_demangle.c ++for ac_hdr in string.h stdlib.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4134: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++  echo $ac_n "(cached) $ac_c" 1>&6 ++else ++  cat > conftest.$ac_ext <<EOF ++#line 4139 "configure" ++#include "confdefs.h" ++#include <$ac_hdr> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4144: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++  rm -rf conftest* ++  eval "ac_cv_header_$ac_safe=yes" ++else ++  echo "$ac_err" >&5 ++  echo "configure: failed program was:" >&5 ++  cat conftest.$ac_ext >&5 ++  rm -rf conftest* ++  eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++  echo "$ac_t""yes" 1>&6 ++    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++  cat >> confdefs.h <<EOF ++#define $ac_tr_hdr 1 ++EOF ++  ++else ++  echo "$ac_t""no" 1>&6 ++fi ++done ++ ++ ++# No surprises, no surprises... ++if test $ATOMICITYH = cpu/generic ; then ++  echo "configure: warning: No native atomic operations are provided yet for this platform." 1>&2 ++  if test $target_thread_file = single; then ++    echo "configure: warning: They cannot be faked when thread support is disabled." 1>&2 ++    echo "configure: warning: Thread-safety of certain classes is not guaranteed." 1>&2 ++  else ++    echo "configure: warning: They will be faked using a mutex." 1>&2 ++    echo "configure: warning: Performance of certain classes will degrade as a result." 1>&2 ++  fi ++fi ++ ++ ++if test -n "$with_cross_host" || test x"$build" != x"$host"; then ++ ++  # We are being configured with some form of cross compiler. ++  GLIBCPP_IS_CROSS_COMPILING=true ++ ++  # This lets us hard-code the functionality we know we'll have in the cross ++  # target environment.  "Let" is a sugar-coated word placed on an especially ++  # dull and tedious hack, actually. ++  # ++  # Here's why GLIBCPP_CHECK_MATH_SUPPORT, and other autoconf macros ++  # that involve linking, can't be used: ++  #    "cannot open sim-crt0.o" ++  #    "cannot open crt0.o" ++  # etc.  All this is because there currently exists no unified, consistent ++  # way for top level CC information to be passed down to target directories: ++  # newlib includes, newlib linking info, libgloss versus newlib crt0.o, etc. ++  # When all of that is done, all of this hokey, excessive AC_DEFINE junk for ++  # crosses can be removed. ++ ++  # If Canadian cross, then don't pick up tools from the build directory. ++  # Used in GLIBCPP_EXPORT_INCLUDES (and nowhere else?). ++  if test -n "$with_cross_host" && test x"$build" != x"$with_cross_host"; then ++    CANADIAN=yes ++  else ++    CANADIAN=no ++  fi ++ ++  # Construct crosses by hand, eliminating bits that need ld... ++  # GLIBCPP_CHECK_COMPILER_FEATURES ++  # GLIBCPP_CHECK_BUILTIN_MATH_SUPPORT ++  # GLIBCPP_CHECK_MATH_SUPPORT ++ ++  case "$target" in ++    *-uclibc*) ++      os_include_dir="os/uclibc" ++      for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \ ++        machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++        fp.h locale.h float.h inttypes.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4225: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++  echo $ac_n "(cached) $ac_c" 1>&6 ++else ++  cat > conftest.$ac_ext <<EOF ++#line 4230 "configure" ++#include "confdefs.h" ++#include <$ac_hdr> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4235: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++  rm -rf conftest* ++  eval "ac_cv_header_$ac_safe=yes" ++else ++  echo "$ac_err" >&5 ++  echo "configure: failed program was:" >&5 ++  cat conftest.$ac_ext >&5 ++  rm -rf conftest* ++  eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++  echo "$ac_t""yes" 1>&6 ++    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++  cat >> confdefs.h <<EOF ++#define $ac_tr_hdr 1 ++EOF ++  ++else ++  echo "$ac_t""no" 1>&6 ++fi ++done ++ ++      SECTION_FLAGS='-ffunction-sections -fdata-sections' ++       ++       ++  # If we're not using GNU ld, then there's no point in even trying these ++  # tests.  Check for that first.  We should have already tested for gld ++  # by now (in libtool), but require it now just to be safe... ++  test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS='' ++  test -z "$OPT_LDFLAGS" && OPT_LDFLAGS='' ++   ++ ++  # The name set by libtool depends on the version of libtool.  Shame on us ++  # for depending on an impl detail, but c'est la vie.  Older versions used ++  # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on ++  # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually ++  # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't ++  # set (hence we're using an older libtool), then set it. ++  if test x${with_gnu_ld+set} != xset; then ++    if test x${ac_cv_prog_gnu_ld+set} != xset; then ++      # We got through "ac_require(ac_prog_ld)" and still not set?  Huh? ++      with_gnu_ld=no ++    else ++      with_gnu_ld=$ac_cv_prog_gnu_ld ++    fi ++  fi ++ ++  # Start by getting the version number.  I think the libtool test already ++  # does some of this, but throws away the result. ++   ++  ldver=`$LD --version 2>/dev/null | head -1 | \ ++         sed -e 's/GNU ld version \([0-9.][0-9.]*\).*/\1/'` ++   ++  glibcpp_gnu_ld_version=`echo $ldver | \ ++         $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'` ++ ++  # Set --gc-sections. ++  if test "$with_gnu_ld" = "notbroken"; then ++    # GNU ld it is!  Joy and bunny rabbits! ++ ++    # All these tests are for C++; save the language and the compiler flags. ++    # Need to do this so that g++ won't try to link in libstdc++ ++    ac_test_CFLAGS="${CFLAGS+set}" ++    ac_save_CFLAGS="$CFLAGS" ++    CFLAGS='-x c++  -Wl,--gc-sections' ++ ++    # Check for -Wl,--gc-sections ++    # XXX This test is broken at the moment, as symbols required for ++    # linking are now in libsupc++ (not built yet.....). In addition,  ++    # this test has cored on solaris in the past. In addition, ++    # --gc-sections doesn't really work at the moment (keeps on discarding ++    # used sections, first .eh_frame and now some of the glibc sections for ++    # iconv). Bzzzzt. Thanks for playing, maybe next time. ++    echo $ac_n "checking for ld that supports -Wl,--gc-sections""... $ac_c" 1>&6 ++echo "configure:4313: checking for ld that supports -Wl,--gc-sections" >&5 ++    if test "$cross_compiling" = yes; then ++  ac_sectionLDflags=yes ++else ++  cat > conftest.$ac_ext <<EOF ++#line 4318 "configure" ++#include "confdefs.h" ++ ++     int main(void)  ++     { ++       try { throw 1; } ++       catch (...) { }; ++       return 0; ++     } ++     ++EOF ++if { (eval echo configure:4329: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ++then ++  ac_sectionLDflags=yes ++else ++  echo "configure: failed program was:" >&5 ++  cat conftest.$ac_ext >&5 ++  rm -fr conftest* ++  ac_sectionLDflags=no ++fi ++rm -fr conftest* ++fi ++ ++    if test "$ac_test_CFLAGS" = set; then ++      CFLAGS="$ac_save_CFLAGS" ++    else ++      # this is the suspicious part ++      CFLAGS='' ++    fi ++    if test "$ac_sectionLDflags" = "yes"; then ++      SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" ++    fi ++    echo "$ac_t""$ac_sectionLDflags" 1>&6 ++  fi ++ ++  # Set linker optimization flags. ++  if test x"$with_gnu_ld" = x"yes"; then ++    OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS" ++  fi ++ ++   ++   ++ ++       ++    echo $ac_n "checking for main in -lm""... $ac_c" 1>&6 ++echo "configure:4363: checking for main in -lm" >&5 ++ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'` ++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ++  echo $ac_n "(cached) $ac_c" 1>&6 ++else ++  ac_save_LIBS="$LIBS" ++LIBS="-lm  $LIBS" ++cat > conftest.$ac_ext <<EOF ++#line 4371 "configure" ++#include "confdefs.h" ++ ++int main() { ++main() ++; return 0; } ++EOF ++if { (eval echo configure:4378: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++  rm -rf conftest* ++  eval "ac_cv_lib_$ac_lib_var=yes" ++else ++  echo "configure: failed program was:" >&5 ++  cat conftest.$ac_ext >&5 ++  rm -rf conftest* ++  eval "ac_cv_lib_$ac_lib_var=no" ++fi ++rm -f conftest* ++LIBS="$ac_save_LIBS" ++ ++fi ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++  echo "$ac_t""yes" 1>&6 ++    ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \ ++    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` ++  cat >> confdefs.h <<EOF ++#define $ac_tr_lib 1 ++EOF ++ ++  LIBS="-lm $LIBS" ++ ++else ++  echo "$ac_t""no" 1>&6 ++fi ++ ++  for ac_func in nan copysignf ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4408: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++  echo $ac_n "(cached) $ac_c" 1>&6 ++else ++  cat > conftest.$ac_ext <<EOF ++#line 4413 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++    which can conflict with char $ac_func(); below.  */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error.  */ ++/* We use char because int might match the return type of a gcc2 ++    builtin and then its argument prototype would still apply.  */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++    to always fail with ENOSYS.  Some functions are actually named ++    something starting with __ and the normal name is an alias.  */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4436: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++  rm -rf conftest* ++  eval "ac_cv_func_$ac_func=yes" ++else ++  echo "configure: failed program was:" >&5 ++  cat conftest.$ac_ext >&5 ++  rm -rf conftest* ++  eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++  echo "$ac_t""yes" 1>&6 ++    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++  cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++  ++else ++  echo "$ac_t""no" 1>&6 ++LIBMATHOBJS="$LIBMATHOBJS ${ac_func}.lo" ++fi ++done ++ ++ ++    for ac_func in __signbit ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4465: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++  echo $ac_n "(cached) $ac_c" 1>&6 ++else ++  cat > conftest.$ac_ext <<EOF ++#line 4470 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++    which can conflict with char $ac_func(); below.  */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error.  */ ++/* We use char because int might match the return type of a gcc2 ++    builtin and then its argument prototype would still apply.  */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++    to always fail with ENOSYS.  Some functions are actually named ++    something starting with __ and the normal name is an alias.  */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4493: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++  rm -rf conftest* ++  eval "ac_cv_func_$ac_func=yes" ++else ++  echo "configure: failed program was:" >&5 ++  cat conftest.$ac_ext >&5 ++  rm -rf conftest* ++  eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++  echo "$ac_t""yes" 1>&6 ++    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++  cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++  ++else ++  echo "$ac_t""no" 1>&6 ++LIBMATHOBJS="$LIBMATHOBJS signbit.lo" ++fi ++done ++ ++  for ac_func in __signbitf ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4521: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++  echo $ac_n "(cached) $ac_c" 1>&6 ++else ++  cat > conftest.$ac_ext <<EOF ++#line 4526 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++    which can conflict with char $ac_func(); below.  */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error.  */ ++/* We use char because int might match the return type of a gcc2 ++    builtin and then its argument prototype would still apply.  */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++    to always fail with ENOSYS.  Some functions are actually named ++    something starting with __ and the normal name is an alias.  */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4549: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++  rm -rf conftest* ++  eval "ac_cv_func_$ac_func=yes" ++else ++  echo "configure: failed program was:" >&5 ++  cat conftest.$ac_ext >&5 ++  rm -rf conftest* ++  eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++  echo "$ac_t""yes" 1>&6 ++    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++  cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++  ++else ++  echo "$ac_t""no" 1>&6 ++LIBMATHOBJS="$LIBMATHOBJS signbitf.lo" ++fi ++done ++ ++ ++          if test x$ac_cv_func_copysignl = x"yes"; then ++    for ac_func in __signbitl ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4579: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++  echo $ac_n "(cached) $ac_c" 1>&6 ++else ++  cat > conftest.$ac_ext <<EOF ++#line 4584 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++    which can conflict with char $ac_func(); below.  */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error.  */ ++/* We use char because int might match the return type of a gcc2 ++    builtin and then its argument prototype would still apply.  */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++    to always fail with ENOSYS.  Some functions are actually named ++    something starting with __ and the normal name is an alias.  */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4607: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++  rm -rf conftest* ++  eval "ac_cv_func_$ac_func=yes" ++else ++  echo "configure: failed program was:" >&5 ++  cat conftest.$ac_ext >&5 ++  rm -rf conftest* ++  eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++  echo "$ac_t""yes" 1>&6 ++    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++  cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++  ++else ++  echo "$ac_t""no" 1>&6 ++LIBMATHOBJS="$LIBMATHOBJS signbitl.lo" ++fi ++done ++ ++  fi ++ ++  if test -n "$LIBMATHOBJS"; then ++    need_libmath=yes ++  fi ++   ++   ++ ++if test "$need_libmath" = yes; then ++  GLIBCPP_BUILD_LIBMATH_TRUE= ++  GLIBCPP_BUILD_LIBMATH_FALSE='#' ++else ++  GLIBCPP_BUILD_LIBMATH_TRUE='#' ++  GLIBCPP_BUILD_LIBMATH_FALSE= ++fi ++ ++       ++    enable_wchar_t=no ++ ++      echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6 ++echo "configure:4652: checking for mbstate_t" >&5 ++  cat > conftest.$ac_ext <<EOF ++#line 4654 "configure" ++#include "confdefs.h" ++#include <wchar.h> ++int main() { ++mbstate_t teststate; ++; return 0; } ++EOF ++if { (eval echo configure:4661: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++  rm -rf conftest* ++  have_mbstate_t=yes ++else ++  echo "configure: failed program was:" >&5 ++  cat conftest.$ac_ext >&5 ++  rm -rf conftest* ++  have_mbstate_t=no ++fi ++rm -f conftest* ++  echo "$ac_t""$have_mbstate_t" 1>&6 ++  if test x"$have_mbstate_t" = xyes; then ++    cat >> confdefs.h <<\EOF ++#define HAVE_MBSTATE_T 1 ++EOF ++ ++  fi ++ ++    for ac_hdr in wchar.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4683: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++  echo $ac_n "(cached) $ac_c" 1>&6 ++else ++  cat > conftest.$ac_ext <<EOF ++#line 4688 "configure" ++#include "confdefs.h" ++#include <$ac_hdr> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4693: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++  rm -rf conftest* ++  eval "ac_cv_header_$ac_safe=yes" ++else ++  echo "$ac_err" >&5 ++  echo "configure: failed program was:" >&5 ++  cat conftest.$ac_ext >&5 ++  rm -rf conftest* ++  eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++  echo "$ac_t""yes" 1>&6 ++    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++  cat >> confdefs.h <<EOF ++#define $ac_tr_hdr 1 ++EOF ++ ac_has_wchar_h=yes ++else ++  echo "$ac_t""no" 1>&6 ++ac_has_wchar_h=no ++fi ++done ++ ++  for ac_hdr in wctype.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4724: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++  echo $ac_n "(cached) $ac_c" 1>&6 ++else ++  cat > conftest.$ac_ext <<EOF ++#line 4729 "configure" ++#include "confdefs.h" ++#include <$ac_hdr> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4734: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++  rm -rf conftest* ++  eval "ac_cv_header_$ac_safe=yes" ++else ++  echo "$ac_err" >&5 ++  echo "configure: failed program was:" >&5 ++  cat conftest.$ac_ext >&5 ++  rm -rf conftest* ++  eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++  echo "$ac_t""yes" 1>&6 ++    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++  cat >> confdefs.h <<EOF ++#define $ac_tr_hdr 1 ++EOF ++ ac_has_wctype_h=yes ++else ++  echo "$ac_t""no" 1>&6 ++ac_has_wctype_h=no ++fi ++done ++ ++   ++    if test x"$ac_has_wchar_h" = xyes && ++     test x"$ac_has_wctype_h" = xyes && ++     test x"$enable_c_mbchar" != xno; then ++       ++            echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6 ++echo "configure:4767: checking for WCHAR_MIN and WCHAR_MAX" >&5 ++    cat > conftest.$ac_ext <<EOF ++#line 4769 "configure" ++#include "confdefs.h" ++#include <wchar.h> ++int main() { ++int i = WCHAR_MIN; int j = WCHAR_MAX; ++; return 0; } ++EOF ++if { (eval echo configure:4776: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++  rm -rf conftest* ++  has_wchar_minmax=yes ++else ++  echo "configure: failed program was:" >&5 ++  cat conftest.$ac_ext >&5 ++  rm -rf conftest* ++  has_wchar_minmax=no ++fi ++rm -f conftest* ++    echo "$ac_t""$has_wchar_minmax" 1>&6 ++     ++            echo $ac_n "checking for WEOF""... $ac_c" 1>&6 ++echo "configure:4789: checking for WEOF" >&5 ++    cat > conftest.$ac_ext <<EOF ++#line 4791 "configure" ++#include "confdefs.h" ++ ++      #include <wchar.h> ++      #include <stddef.h> ++int main() { ++wint_t i = WEOF; ++; return 0; } ++EOF ++if { (eval echo configure:4800: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++  rm -rf conftest* ++  has_weof=yes ++else ++  echo "configure: failed program was:" >&5 ++  cat conftest.$ac_ext >&5 ++  rm -rf conftest* ++  has_weof=no ++fi ++rm -f conftest* ++    echo "$ac_t""$has_weof" 1>&6 ++   ++        ac_wfuncs=yes ++    for ac_func in wcslen wmemchr wmemcmp wmemcpy wmemmove wmemset ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4816: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++  echo $ac_n "(cached) $ac_c" 1>&6 ++else ++  cat > conftest.$ac_ext <<EOF ++#line 4821 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++    which can conflict with char $ac_func(); below.  */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error.  */ ++/* We use char because int might match the return type of a gcc2 ++    builtin and then its argument prototype would still apply.  */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++    to always fail with ENOSYS.  Some functions are actually named ++    something starting with __ and the normal name is an alias.  */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4844: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++  rm -rf conftest* ++  eval "ac_cv_func_$ac_func=yes" ++else ++  echo "configure: failed program was:" >&5 ++  cat conftest.$ac_ext >&5 ++  rm -rf conftest* ++  eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++  echo "$ac_t""yes" 1>&6 ++    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++  cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++  ++else ++  echo "$ac_t""no" 1>&6 ++\ ++    ac_wfuncs=no ++fi ++done ++ ++   ++        for ac_func in btowc wctob fgetwc fgetws fputwc fputws fwide \ ++    fwprintf fwscanf swprintf swscanf vfwprintf vfwscanf vswprintf vswscanf \ ++    vwprintf vwscanf wprintf wscanf getwc getwchar mbsinit mbrlen mbrtowc \ ++    mbsrtowcs wcsrtombs putwc putwchar ungetwc wcrtomb wcstod wcstof wcstol \ ++    wcstoul wcscpy wcsncpy wcscat wcsncat wcscmp wcscoll wcsncmp wcsxfrm \ ++    wcscspn wcsspn wcstok wcsftime wcschr wcspbrk wcsrchr wcsstr ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4879: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++  echo $ac_n "(cached) $ac_c" 1>&6 ++else ++  cat > conftest.$ac_ext <<EOF ++#line 4884 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++    which can conflict with char $ac_func(); below.  */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error.  */ ++/* We use char because int might match the return type of a gcc2 ++    builtin and then its argument prototype would still apply.  */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++    to always fail with ENOSYS.  Some functions are actually named ++    something starting with __ and the normal name is an alias.  */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4907: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++  rm -rf conftest* ++  eval "ac_cv_func_$ac_func=yes" ++else ++  echo "configure: failed program was:" >&5 ++  cat conftest.$ac_ext >&5 ++  rm -rf conftest* ++  eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++  echo "$ac_t""yes" 1>&6 ++    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++  cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++  ++else ++  echo "$ac_t""no" 1>&6 ++\ ++    ac_wfuncs=no ++fi ++done ++ ++ ++    echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6 ++echo "configure:4935: checking for ISO C99 wchar_t support" >&5 ++    if test x"$has_weof" = xyes && ++       test x"$has_wchar_minmax" = xyes && ++       test x"$ac_wfuncs" = xyes; then ++      ac_isoC99_wchar_t=yes ++    else ++      ac_isoC99_wchar_t=no ++    fi ++    echo "$ac_t""$ac_isoC99_wchar_t" 1>&6 ++   ++            ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for iconv.h""... $ac_c" 1>&6 ++echo "configure:4947: checking for iconv.h" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++  echo $ac_n "(cached) $ac_c" 1>&6 ++else ++  cat > conftest.$ac_ext <<EOF ++#line 4952 "configure" ++#include "confdefs.h" ++#include <iconv.h> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4957: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++  rm -rf conftest* ++  eval "ac_cv_header_$ac_safe=yes" ++else ++  echo "$ac_err" >&5 ++  echo "configure: failed program was:" >&5 ++  cat conftest.$ac_ext >&5 ++  rm -rf conftest* ++  eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++  echo "$ac_t""yes" 1>&6 ++  ac_has_iconv_h=yes ++else ++  echo "$ac_t""no" 1>&6 ++ac_has_iconv_h=no ++fi ++ ++    ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6 ++echo "configure:4981: checking for langinfo.h" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++  echo $ac_n "(cached) $ac_c" 1>&6 ++else ++  cat > conftest.$ac_ext <<EOF ++#line 4986 "configure" ++#include "confdefs.h" ++#include <langinfo.h> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4991: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++  rm -rf conftest* ++  eval "ac_cv_header_$ac_safe=yes" ++else ++  echo "$ac_err" >&5 ++  echo "configure: failed program was:" >&5 ++  cat conftest.$ac_ext >&5 ++  rm -rf conftest* ++  eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++  echo "$ac_t""yes" 1>&6 ++  ac_has_langinfo_h=yes ++else ++  echo "$ac_t""no" 1>&6 ++ac_has_langinfo_h=no ++fi ++ ++ ++        echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6 ++echo "configure:5015: checking for iconv in -liconv" >&5 ++ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'` ++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ++  echo $ac_n "(cached) $ac_c" 1>&6 ++else ++  ac_save_LIBS="$LIBS" ++LIBS="-liconv  $LIBS" ++cat > conftest.$ac_ext <<EOF ++#line 5023 "configure" ++#include "confdefs.h" ++/* Override any gcc2 internal prototype to avoid an error.  */ ++/* We use char because int might match the return type of a gcc2 ++    builtin and then its argument prototype would still apply.  */ ++char iconv(); ++ ++int main() { ++iconv() ++; return 0; } ++EOF ++if { (eval echo configure:5034: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++  rm -rf conftest* ++  eval "ac_cv_lib_$ac_lib_var=yes" ++else ++  echo "configure: failed program was:" >&5 ++  cat conftest.$ac_ext >&5 ++  rm -rf conftest* ++  eval "ac_cv_lib_$ac_lib_var=no" ++fi ++rm -f conftest* ++LIBS="$ac_save_LIBS" ++ ++fi ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++  echo "$ac_t""yes" 1>&6 ++  libiconv="-liconv" ++else ++  echo "$ac_t""no" 1>&6 ++fi ++ ++    ac_save_LIBS="$LIBS" ++    LIBS="$LIBS $libiconv" ++ ++    for ac_func in iconv_open iconv_close iconv nl_langinfo + do +-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +-echo "configure:4134: checking for $ac_hdr" >&5 +-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:5060: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then +   echo $ac_n "(cached) $ac_c" 1>&6 + else +   cat > conftest.$ac_ext <<EOF +-#line 4139 "configure" ++#line 5065 "configure" + #include "confdefs.h" +-#include <$ac_hdr> ++/* System header to define __stub macros and hopefully few prototypes, ++    which can conflict with char $ac_func(); below.  */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error.  */ ++/* We use char because int might match the return type of a gcc2 ++    builtin and then its argument prototype would still apply.  */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++    to always fail with ENOSYS.  Some functions are actually named ++    something starting with __ and the normal name is an alias.  */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } + EOF +-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +-{ (eval echo configure:4144: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +-if test -z "$ac_err"; then ++if { (eval echo configure:5088: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +   rm -rf conftest* +-  eval "ac_cv_header_$ac_safe=yes" ++  eval "ac_cv_func_$ac_func=yes" + else +-  echo "$ac_err" >&5 +   echo "configure: failed program was:" >&5 +   cat conftest.$ac_ext >&5 +   rm -rf conftest* +-  eval "ac_cv_header_$ac_safe=no" ++  eval "ac_cv_func_$ac_func=no" + fi + rm -f conftest* + fi +-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then +   echo "$ac_t""yes" 1>&6 +-    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` +   cat >> confdefs.h <<EOF +-#define $ac_tr_hdr 1 ++#define $ac_tr_func 1 + EOF +-  ++ \ ++    ac_XPG2funcs=yes + else +   echo "$ac_t""no" 1>&6 ++ac_XPG2funcs=no + fi + done +  ++   ++    LIBS="$ac_save_LIBS" ++ ++    echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6 ++echo "configure:5118: checking for XPG2 wchar_t support" >&5 ++    if test x"$ac_has_iconv_h" = xyes && ++       test x"$ac_has_langinfo_h" = xyes && ++       test x"$ac_XPG2funcs" = xyes; then ++      ac_XPG2_wchar_t=yes ++    else ++      ac_XPG2_wchar_t=no ++    fi ++    echo "$ac_t""$ac_XPG2_wchar_t" 1>&6 ++   ++            if test x"$ac_isoC99_wchar_t" = xyes && ++       test x"$ac_XPG2_wchar_t" = xyes; then ++       cat >> confdefs.h <<\EOF ++#define _GLIBCPP_USE_WCHAR_T 1 ++EOF +  +-# No surprises, no surprises... +-if test $ATOMICITYH = cpu/generic ; then +-  echo "configure: warning: No native atomic operations are provided yet for this platform." 1>&2 +-  if test $target_thread_file = single; then +-    echo "configure: warning: They cannot be faked when thread support is disabled." 1>&2 +-    echo "configure: warning: Thread-safety of certain classes is not guaranteed." 1>&2 +-  else +-    echo "configure: warning: They will be faked using a mutex." 1>&2 +-    echo "configure: warning: Performance of certain classes will degrade as a result." 1>&2 ++       enable_wchar_t=yes  ++    fi +   fi +-fi ++  echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6 ++echo "configure:5138: checking for enabled wchar_t specializations" >&5 ++  echo "$ac_t""$enable_wchar_t" 1>&6	 ++   +  ++if test "$enable_wchar_t" = yes; then ++  GLIBCPP_TEST_WCHAR_T_TRUE= ++  GLIBCPP_TEST_WCHAR_T_FALSE='#' ++else ++  GLIBCPP_TEST_WCHAR_T_TRUE='#' ++  GLIBCPP_TEST_WCHAR_T_FALSE= ++fi	 +  +-if test -n "$with_cross_host" || test x"$build" != x"$host"; then ++      cat >> confdefs.h <<\EOF ++#define HAVE_COPYSIGN 1 ++EOF +  +-  # We are being configured with some form of cross compiler. +-  GLIBCPP_IS_CROSS_COMPILING=true ++      cat >> confdefs.h <<\EOF ++#define HAVE_FINITE 1 ++EOF +  +-  # This lets us hard-code the functionality we know we'll have in the cross +-  # target environment.  "Let" is a sugar-coated word placed on an especially +-  # dull and tedious hack, actually. +-  # +-  # Here's why GLIBCPP_CHECK_MATH_SUPPORT, and other autoconf macros +-  # that involve linking, can't be used: +-  #    "cannot open sim-crt0.o" +-  #    "cannot open crt0.o" +-  # etc.  All this is because there currently exists no unified, consistent +-  # way for top level CC information to be passed down to target directories: +-  # newlib includes, newlib linking info, libgloss versus newlib crt0.o, etc. +-  # When all of that is done, all of this hokey, excessive AC_DEFINE junk for +-  # crosses can be removed. ++      cat >> confdefs.h <<\EOF ++#define HAVE_FINITEF 1 ++EOF +  +-  # If Canadian cross, then don't pick up tools from the build directory. +-  # Used in GLIBCPP_EXPORT_INCLUDES (and nowhere else?). +-  if test -n "$with_cross_host" && test x"$build" != x"$with_cross_host"; then +-    CANADIAN=yes +-  else +-    CANADIAN=no +-  fi ++      cat >> confdefs.h <<\EOF ++#define HAVE_ISINF 1 ++EOF +  +-  # Construct crosses by hand, eliminating bits that need ld... +-  # GLIBCPP_CHECK_COMPILER_FEATURES +-  # GLIBCPP_CHECK_BUILTIN_MATH_SUPPORT +-  # GLIBCPP_CHECK_MATH_SUPPORT ++      cat >> confdefs.h <<\EOF ++#define HAVE_ISINFF 1 ++EOF +  +-  case "$target" in ++      cat >> confdefs.h <<\EOF ++#define HAVE_ISNAN 1 ++EOF ++ ++      cat >> confdefs.h <<\EOF ++#define HAVE_ISNANF 1 ++EOF ++      ;; +     *-linux*) +       os_include_dir="os/gnu-linux" +       for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \ +@@ -5163,10 +6196,6 @@ + EOF +  +       cat >> confdefs.h <<\EOF +-#define HAVE_FREXPF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF + #define HAVE_HYPOTF 1 + EOF +  +@@ -10293,103 +11322,6 @@ + #define HAVE_MMAP 1 + EOF +  +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_ACOSF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_ASINF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_ATAN2F 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_ATANF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_CEILF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_COPYSIGN 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_COPYSIGNF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_COSF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_COSHF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_EXPF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_FABSF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_FLOORF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_FMODF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_FREXPF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_LDEXPF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_LOG10F 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_LOGF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_MODFF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_POWF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_SINF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_SINHF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_SQRTF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_TANF 1 +-EOF +- +-      cat >> confdefs.h <<\EOF +-#define HAVE_TANHF 1 +-EOF +- +       ;; +   esac +  +diff -urN gcc-3.3.2/libstdc++-v3/configure.in gcc-3.3.2-uClibc/libstdc++-v3/configure.in +--- gcc-3.3.2/libstdc++-v3/configure.in	2003-07-17 13:32:00.000000000 -0500 ++++ gcc-3.3.2-uClibc/libstdc++-v3/configure.in	2004-01-08 21:36:43.000000000 -0600 +@@ -117,6 +117,35 @@ +   # GLIBCPP_CHECK_MATH_SUPPORT +  +   case "$target" in ++    *-uclibc*) ++      os_include_dir="os/uclibc" ++      AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++        machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++        fp.h locale.h float.h inttypes.h]) ++      SECTION_FLAGS='-ffunction-sections -fdata-sections' ++      AC_SUBST(SECTION_FLAGS) ++      GLIBCPP_CHECK_LINKER_FEATURES ++      GLIBCPP_CHECK_COMPLEX_MATH_SUPPORT ++      GLIBCPP_CHECK_WCHAR_T_SUPPORT ++      AC_DEFINE(HAVE_COPYSIGN) ++      #AC_DEFINE(HAVE_COPYSIGNF) ++      AC_DEFINE(HAVE_FINITE) ++      AC_DEFINE(HAVE_FINITEF) ++      #AC_DEFINE(HAVE_FREXPF) ++      #AC_DEFINE(HAVE_HYPOTF) ++      AC_DEFINE(HAVE_ISINF) ++      AC_DEFINE(HAVE_ISINFF) ++      AC_DEFINE(HAVE_ISNAN) ++      AC_DEFINE(HAVE_ISNANF) ++      #AC_DEFINE(HAVE_SINCOS) ++      #AC_DEFINE(HAVE_SINCOSF) ++      #if test x"long_double_math_on_this_cpu" = x"yes"; then ++        #AC_DEFINE(HAVE_FINITEL) ++        #AC_DEFINE(HAVE_HYPOTL) ++        #AC_DEFINE(HAVE_ISINFL) ++        #AC_DEFINE(HAVE_ISNANL) ++      #fi ++      ;; +     *-linux*) +       os_include_dir="os/gnu-linux" +       AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ +diff -urN gcc-3.3.2/libstdc++-v3/include/c_std/std_cstdlib.h gcc-3.3.2-uClibc/libstdc++-v3/include/c_std/std_cstdlib.h +--- gcc-3.3.2/libstdc++-v3/include/c_std/std_cstdlib.h	2003-04-18 05:08:05.000000000 -0500 ++++ gcc-3.3.2-uClibc/libstdc++-v3/include/c_std/std_cstdlib.h	2004-01-06 18:22:00.000000000 -0600 +@@ -101,9 +101,11 @@ +   using ::labs; +   using ::ldiv; +   using ::malloc; ++#if _GLIBCPP_USE_WCHAR_T +   using ::mblen; +   using ::mbstowcs; +   using ::mbtowc; ++#endif +   using ::qsort; +   using ::rand; +   using ::realloc; +@@ -112,8 +114,10 @@ +   using ::strtol; +   using ::strtoul; +   using ::system; ++#if _GLIBCPP_USE_WCHAR_T +   using ::wcstombs; +   using ::wctomb; ++#endif +  +   inline long  +   abs(long __i) { return labs(__i); } +diff -urN gcc-3.3.2/libstdc++-v3/include/c_std/std_cwchar.h gcc-3.3.2-uClibc/libstdc++-v3/include/c_std/std_cwchar.h +--- gcc-3.3.2/libstdc++-v3/include/c_std/std_cwchar.h	2003-04-18 05:08:05.000000000 -0500 ++++ gcc-3.3.2-uClibc/libstdc++-v3/include/c_std/std_cwchar.h	2004-01-06 18:22:00.000000000 -0600 +@@ -165,7 +165,9 @@ +   using ::wcscoll; +   using ::wcscpy; +   using ::wcscspn; ++#ifdef HAVE_WCSFTIME +   using ::wcsftime; ++#endif +   using ::wcslen; +   using ::wcsncat; +   using ::wcsncmp; +diff -urN gcc-3.3.2/ltconfig gcc-3.3.2-uClibc/ltconfig +--- gcc-3.3.2/ltconfig	2003-02-19 20:10:02.000000000 -0600 ++++ gcc-3.3.2-uClibc/ltconfig	2004-01-06 22:16:18.000000000 -0600 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +  +@@ -1247,6 +1248,24 @@ +   dynamic_linker='GNU/Linux ld.so' +   ;; +  ++linux-uclibc*) ++  version_type=linux ++  need_lib_prefix=no ++  need_version=no ++  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++  soname_spec='${libname}${release}.so$major' ++  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++  shlibpath_var=LD_LIBRARY_PATH ++  shlibpath_overrides_runpath=no ++  # This implies no fast_install, which is unacceptable. ++  # Some rework will be needed to allow for fast_install ++  # before this can be enabled. ++  # Note: copied from linux-gnu, and may not be appropriate. ++  hardcode_into_libs=yes ++  # Assume using the uClibc dynamic linker. ++  dynamic_linker="uClibc ld.so" ++  ;; ++ + netbsd*) +   need_lib_prefix=no +   need_version=no diff --git a/sources/gcc-uclibc-3.3-110-conf.patch b/sources/gcc-uclibc-3.3-110-conf.patch new file mode 100644 index 000000000..1eaacae95 --- /dev/null +++ b/sources/gcc-uclibc-3.3-110-conf.patch @@ -0,0 +1,63 @@ +Use the patch by Carl Miller <chaz@energoncube.net> for powerpc, with +some minor modifications.  Changed *os_uclibc to *os_linux_uclibc since +at some point we might support other platforms. +Index: gcc/config/rs6000/linux.h +=================================================================== +RCS file: /home/cvs/tools/gcc-3.3.2/gcc/config/rs6000/linux.h,v +retrieving revision 1.1.1.1 +diff -d -u -r1.1.1.1 linux.h +--- gcc-3.3.2/gcc/config/rs6000/linux.h	4 Dec 2003 01:19:31 -0000	1.1.1.1 ++++ gcc-3.3.2/gcc/config/rs6000/linux.h	4 Dec 2003 23:18:01 -0000 +@@ -64,7 +64,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" +  + #undef	LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif +  + #undef TARGET_VERSION + #define TARGET_VERSION fprintf (stderr, " (PowerPC GNU/Linux)"); +Index: gcc/config/rs6000/sysv4.h +=================================================================== +RCS file: /home/cvs/tools/gcc-3.3.2/gcc/config/rs6000/sysv4.h,v +retrieving revision 1.1.1.1 +diff -d -u -r1.1.1.1 sysv4.h +--- gcc-3.3.2/gcc/config/rs6000/sysv4.h	4 Dec 2003 01:19:31 -0000	1.1.1.1 ++++ gcc-3.3.2/gcc/config/rs6000/sysv4.h	4 Dec 2003 23:18:18 -0000 +@@ -953,9 +953,11 @@ + %{mcall-linux: %(link_os_linux) } \ + %{mcall-gnu: %(link_os_gnu) } \ + %{mcall-netbsd: %(link_os_netbsd) } \ ++%{mcall-uclibc: %(link_os_linux_uclibc) } \ + %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: \ +          %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: \ +-         %{!mcall-netbsd: %(link_os_default) }}}}}}}}}" ++         %{!mcall-netbsd: %{!mcall-uclibc: \ ++         %(link_os_default) }}}}}}}}}}" +  + #define LINK_OS_DEFAULT_SPEC "" +  +@@ -1292,6 +1294,12 @@ +  + #define LINK_OS_WINDISS_SPEC "" +  ++/* uClibc support for Linux. */ ++ ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++  %{rdynamic:-export-dynamic} \ ++  %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + /* Define any extra SPECS that the compiler needs to generate.  */ + /* Override rs6000.h definition.  */ + #undef	SUBTARGET_EXTRA_SPECS +@@ -1357,6 +1365,7 @@ +   { "link_os_netbsd",		LINK_OS_NETBSD_SPEC },			\ +   { "link_os_vxworks",		LINK_OS_VXWORKS_SPEC },			\ +   { "link_os_windiss",		LINK_OS_WINDISS_SPEC },			\ ++  { "link_os_linux_uclibc",	LINK_OS_LINUX_UCLIBC_SPEC },		\ +   { "link_os_default",		LINK_OS_DEFAULT_SPEC },			\ +   { "cc1_endian_big",		CC1_ENDIAN_BIG_SPEC },			\ +   { "cc1_endian_little",	CC1_ENDIAN_LITTLE_SPEC },		\ diff --git a/sources/gcc-uclibc-3.3-200-code.patch b/sources/gcc-uclibc-3.3-200-code.patch new file mode 100644 index 000000000..5880d834b --- /dev/null +++ b/sources/gcc-uclibc-3.3-200-code.patch @@ -0,0 +1,3021 @@ +Warning!  This patch is not finished.  The wide char time-related stuff +is broken or non-functional.  But it serves as a starting point to get +things building while I continue to work on the uClibc locale internals. +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c++locale_internal.h	2004-01-09 07:55:02.000000000 -0600 +@@ -0,0 +1,63 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library.  This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING.  If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction.  Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License.  This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek <jakub@redhat.com> ++ ++#include <clocale> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++                                                   ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strtol_l) __strtol_l; ++extern "C" __typeof(strtoll_l) __strtoll_l; ++extern "C" __typeof(strtoul_l) __strtoul_l; ++extern "C" __typeof(strtoull_l) __strtoull_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#endif // GLIBC 2.3 and later +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.cc	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.cc	2004-01-09 08:37:55.000000000 -0600 +@@ -0,0 +1,231 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library.  This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING.  If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction.  Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License.  This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8  Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <stdexcept> ++#include <langinfo.h> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L)      strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L)     strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L)     strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L)    strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L)         strtof((S), (E)) ++#define __strtod_l(S, E, L)         strtod((S), (E)) ++#define __strtold_l(S, E, L)        strtold((S), (E)) ++#endif ++ ++namespace std  ++{ ++  template<> ++    void ++    __convert_to_v(const char* __s, long& __v, ios_base::iostate& __err,  ++		   const __c_locale& __cloc, int __base) ++    { ++      if (!(__err & ios_base::failbit)) ++      { ++	char* __sanity; ++	errno = 0; ++	long __l = __strtol_l(__s, &__sanity, __base, __cloc); ++	if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++	  __v = __l; ++	else ++	  __err |= ios_base::failbit; ++      } ++    } ++ ++  template<> ++    void ++    __convert_to_v(const char* __s, unsigned long& __v,  ++		   ios_base::iostate& __err, const __c_locale& __cloc,  ++		   int __base) ++    { ++      if (!(__err & ios_base::failbit)) ++	{ ++	  char* __sanity; ++	  errno = 0; ++	  unsigned long __ul = __strtoul_l(__s, &__sanity, __base, __cloc); ++          if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++	    __v = __ul; ++	  else ++	    __err |= ios_base::failbit; ++	} ++    } ++ ++#ifdef _GLIBCPP_USE_LONG_LONG ++  template<> ++    void ++    __convert_to_v(const char* __s, long long& __v, ios_base::iostate& __err,  ++		   const __c_locale& __cloc, int __base) ++    { ++      if (!(__err & ios_base::failbit)) ++	{ ++	  char* __sanity; ++	  errno = 0; ++	  long long __ll = __strtoll_l(__s, &__sanity, __base, __cloc); ++          if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++	    __v = __ll; ++	  else ++	    __err |= ios_base::failbit; ++	} ++    } ++ ++  template<> ++    void ++    __convert_to_v(const char* __s, unsigned long long& __v,  ++		   ios_base::iostate& __err, const __c_locale& __cloc,  ++		   int __base) ++    { ++      if (!(__err & ios_base::failbit)) ++	{       ++	  char* __sanity; ++	  errno = 0; ++	  unsigned long long __ull = __strtoull_l(__s, &__sanity, __base,  ++						  __cloc); ++          if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++	    __v = __ull; ++	  else ++	    __err |= ios_base::failbit; ++	}   ++    } ++#endif ++ ++  template<> ++    void ++    __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err,  ++		   const __c_locale& __cloc, int) ++    { ++      if (!(__err & ios_base::failbit)) ++	{ ++	  char* __sanity; ++	  errno = 0; ++	  float __f = __strtof_l(__s, &__sanity, __cloc); ++          if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++	    __v = __f; ++	  else ++	    __err |= ios_base::failbit; ++	} ++    } ++ ++  template<> ++    void ++    __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err,  ++		   const __c_locale& __cloc, int) ++    { ++      if (!(__err & ios_base::failbit)) ++	{ ++	  char* __sanity; ++	  errno = 0; ++	  double __d = __strtod_l(__s, &__sanity, __cloc); ++          if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++	    __v = __d; ++	  else ++	    __err |= ios_base::failbit; ++	} ++    } ++ ++  template<> ++    void ++    __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++		   const __c_locale& __cloc, int) ++    { ++      if (!(__err & ios_base::failbit)) ++	{ ++	  char* __sanity; ++	  errno = 0; ++	  long double __ld = __strtold_l(__s, &__sanity, __cloc); ++          if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++	    __v = __ld; ++	  else ++	    __err |= ios_base::failbit; ++	} ++    } ++ ++  void ++  locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s,  ++				    __c_locale __old) ++  { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++    __cloc = __newlocale(1 << LC_ALL, __s, __old); ++    if (!__cloc) ++      { ++	// This named locale is not supported by the underlying OS. ++	__throw_runtime_error("attempt to create locale from unknown name"); ++      } ++#else ++    __cloc = NULL; ++#endif ++  } ++   ++  void ++  locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++  { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++    if (_S_c_locale != __cloc) ++      __freelocale(__cloc);  ++#else ++    __cloc = NULL; ++#endif ++  } ++ ++  __c_locale ++  locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++#ifdef __UCLIBC_HAS_XLOCALE__ ++  { return __duplocale(__cloc); } ++#else ++  { return __c_locale(); } ++#endif ++ ++  const char* locale::_S_categories[_S_categories_size  ++				    + _S_extra_categories_size] = ++    { ++      "LC_CTYPE",  ++      "LC_NUMERIC", ++      "LC_TIME",  ++      "LC_COLLATE",  ++      "LC_MONETARY", ++      "LC_MESSAGES" ++#if _GLIBCPP_NUM_CATEGORIES != 0 ++      ,  ++      "LC_PAPER",  ++      "LC_NAME",  ++      "LC_ADDRESS", ++      "LC_TELEPHONE",  ++      "LC_MEASUREMENT",  ++      "LC_IDENTIFICATION"  ++#endif ++    }; ++}  // namespace std +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.h	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.h	2004-01-09 07:51:06.000000000 -0600 +@@ -0,0 +1,118 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library.  This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING.  If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction.  Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License.  This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8  Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifndef _CPP_BITS_C_LOCALE_H ++#define _CPP_BITS_C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include <clocale> ++#include <langinfo.h>		// For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include <iconv.h>		// For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include <libintl.h> 		// For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCPP_C_LOCALE_GNU for ++#endif ++#define _GLIBCPP_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCPP_NUM_CATEGORIES 6 ++#define _GLIBCPP_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++  extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++  typedef __locale_t		__c_locale; ++#else ++  typedef int*			__c_locale; ++#endif ++ ++  // Convert numeric value of type _Tv to string and return length of ++  // string.  If snprintf is available use it, otherwise fall back to ++  // the unsafe sprintf which, in general, can be dangerous and should ++  // be avoided. ++  template<typename _Tv> ++    int ++    __convert_from_v(char* __out, const int __size, const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++		     _Tv __v, const __c_locale& __cloc, int __prec = -1) ++    { ++      __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++		     _Tv __v, const __c_locale&, int __prec = -1) ++    { ++# ifdef __UCLIBC_HAS_LOCALE__ ++      char* __old = setlocale(LC_ALL, NULL); ++      char* __sav = static_cast<char*>(malloc(strlen(__old) + 1)); ++      if (__sav) ++        strcpy(__sav, __old); ++      setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++      int __ret; ++      if (__prec >= 0) ++        __ret = snprintf(__out, __size, __fmt, __prec, __v); ++      else ++        __ret = snprintf(__out, __size, __fmt, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++      __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++      setlocale(LC_ALL, __sav); ++      free(__sav); ++#endif ++      return __ret; ++    } ++} ++ ++#endif +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_members.cc	2004-01-09 04:04:34.000000000 -0600 +@@ -0,0 +1,113 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library.  This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING.  If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction.  Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License.  This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++namespace std ++{ ++  // Specializations. ++#ifdef _GLIBCPP_USE_WCHAR_T ++  codecvt_base::result ++  codecvt<wchar_t, char, mbstate_t>:: ++  do_out(state_type& __state, const intern_type* __from,  ++	 const intern_type* __from_end, const intern_type*& __from_next, ++	 extern_type* __to, extern_type* __to_end, ++	 extern_type*& __to_next) const ++  { ++    result __ret = error; ++    size_t __len = min(__from_end - __from, __to_end - __to); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++    __c_locale __old = __uselocale(_S_c_locale); ++#endif ++    size_t __conv = wcsrtombs(__to, &__from, __len, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++    __uselocale(__old); ++#endif ++ ++    if (__conv == __len) ++      { ++	__from_next = __from; ++	__to_next = __to + __conv; ++	__ret = ok; ++      } ++    else if (__conv > 0 && __conv < __len) ++      { ++	__from_next = __from; ++	__to_next = __to + __conv; ++	__ret = partial; ++      } ++    else ++      __ret = error; ++	 ++    return __ret;  ++  } ++   ++  codecvt_base::result ++  codecvt<wchar_t, char, mbstate_t>:: ++  do_in(state_type& __state, const extern_type* __from,  ++	const extern_type* __from_end, const extern_type*& __from_next, ++	intern_type* __to, intern_type* __to_end, ++	intern_type*& __to_next) const ++  { ++    result __ret = error; ++    size_t __len = min(__from_end - __from, __to_end - __to); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++    __c_locale __old = __uselocale(_S_c_locale); ++#endif ++    size_t __conv = mbsrtowcs(__to, &__from, __len, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++    __uselocale(__old); ++#endif ++ ++    if (__conv == __len) ++      { ++	__from_next = __from; ++	__to_next = __to + __conv; ++	__ret = ok; ++      } ++    else if (__conv > 0 && __conv < __len) ++      { ++	__from_next = __from; ++	__to_next = __to + __conv; ++	__ret = partial; ++      } ++    else ++      __ret = error; ++	 ++    return __ret;  ++  } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h	2004-01-09 01:53:51.000000000 -0600 +@@ -0,0 +1,461 @@ ++// Locale support (codecvt) -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library.  This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING.  If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction.  Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License.  This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 Template class codecvt ++// ++ ++// Warning: this file is not meant for user inclusion.  Use <locale>. ++ ++// Written by Benjamin Kosnik <bkoz@cygnus.com> ++ ++  // XXX ++  // Define this here to codecvt.cc can have _S_max_size definition. ++#define _GLIBCPP_USE___ENC_TRAITS 1 ++ ++  // Extension to use icov for dealing with character encodings, ++  // including conversions and comparisons between various character ++  // sets.  This object encapsulates data that may need to be shared between ++  // char_traits, codecvt and ctype. ++  class __enc_traits ++  { ++  public: ++    // Types:  ++    // NB: A conversion descriptor subsumes and enhances the ++    // functionality of a simple state type such as mbstate_t. ++    typedef iconv_t	__desc_type; ++     ++  protected: ++    // Data Members: ++    // Max size of charset encoding name ++    static const int 	_S_max_size = 32; ++    // Name of internal character set encoding. ++    char	       	_M_int_enc[_S_max_size]; ++    // Name of external character set encoding. ++    char  	       	_M_ext_enc[_S_max_size]; ++ ++    // Conversion descriptor between external encoding to internal encoding. ++    __desc_type		_M_in_desc; ++    // Conversion descriptor between internal encoding to external encoding. ++    __desc_type		_M_out_desc; ++ ++    // Details the byte-order marker for the external encoding, if necessary. ++    int			_M_ext_bom; ++ ++    // Details the byte-order marker for the internal encoding, if necessary. ++    int			_M_int_bom; ++ ++  public: ++    explicit __enc_traits()  ++    : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0)  ++    { ++      memset(_M_int_enc, 0, _S_max_size); ++      memset(_M_ext_enc, 0, _S_max_size); ++    } ++ ++    explicit __enc_traits(const char* __int, const char* __ext,  ++			  int __ibom = 0, int __ebom = 0) ++    : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0) ++    { ++      strncpy(_M_int_enc, __int, _S_max_size); ++      strncpy(_M_ext_enc, __ext, _S_max_size); ++    } ++ ++    // 21.1.2 traits typedefs ++    // p4 ++    // typedef STATE_T state_type ++    // requires: state_type shall meet the requirements of ++    // CopyConstructible types (20.1.3) ++    __enc_traits(const __enc_traits& __obj): _M_in_desc(0), _M_out_desc(0) ++    { ++      strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size); ++      strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size); ++      _M_ext_bom = __obj._M_ext_bom; ++      _M_int_bom = __obj._M_int_bom; ++    } ++ ++    // Need assignment operator as well. ++    __enc_traits& ++    operator=(const __enc_traits& __obj) ++    { ++      strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size); ++      strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size); ++      _M_in_desc = 0; ++      _M_out_desc = 0; ++      _M_ext_bom = __obj._M_ext_bom; ++      _M_int_bom = __obj._M_int_bom; ++      return *this; ++    } ++ ++    ~__enc_traits() ++    { ++      __desc_type __err = reinterpret_cast<iconv_t>(-1); ++      if (_M_in_desc && _M_in_desc != __err)  ++	iconv_close(_M_in_desc); ++      if (_M_out_desc && _M_out_desc != __err)  ++	iconv_close(_M_out_desc); ++    }  ++ ++    void ++    _M_init() ++    { ++      const __desc_type __err = reinterpret_cast<iconv_t>(-1); ++      if (!_M_in_desc) ++	{ ++	  _M_in_desc = iconv_open(_M_int_enc, _M_ext_enc); ++	  if (_M_in_desc == __err) ++	    __throw_runtime_error("creating iconv input descriptor failed."); ++	} ++      if (!_M_out_desc) ++	{ ++	  _M_out_desc = iconv_open(_M_ext_enc, _M_int_enc); ++	  if (_M_out_desc == __err) ++	    __throw_runtime_error("creating iconv output descriptor failed."); ++	} ++    } ++ ++    bool ++    _M_good() ++    {  ++      const __desc_type __err = reinterpret_cast<iconv_t>(-1); ++      bool __test = _M_in_desc && _M_in_desc != __err;  ++      __test &=  _M_out_desc && _M_out_desc != __err; ++      return __test; ++    } ++ ++    const __desc_type*  ++    _M_get_in_descriptor() ++    { return &_M_in_desc; } ++ ++    const __desc_type*  ++    _M_get_out_descriptor() ++    { return &_M_out_desc; } ++ ++    int  ++    _M_get_external_bom() ++    { return _M_ext_bom; } ++ ++    int  ++    _M_get_internal_bom() ++    { return _M_int_bom; } ++ ++    const char*  ++    _M_get_internal_enc() ++    { return _M_int_enc; } ++ ++    const char*  ++    _M_get_external_enc() ++    { return _M_ext_enc; } ++  }; ++ ++  // Partial specialization ++  // This specialization takes advantage of iconv to provide code ++  // conversions between a large number of character encodings. ++  template<typename _InternT, typename _ExternT> ++    class codecvt<_InternT, _ExternT, __enc_traits> ++    : public __codecvt_abstract_base<_InternT, _ExternT, __enc_traits> ++    { ++    public:       ++      // Types: ++      typedef codecvt_base::result			result; ++      typedef _InternT 					intern_type; ++      typedef _ExternT 					extern_type; ++      typedef __enc_traits 				state_type; ++      typedef __enc_traits::__desc_type 		__desc_type; ++      typedef __enc_traits				__enc_type; ++ ++      // Data Members: ++      static locale::id 		id; ++ ++      explicit  ++      codecvt(size_t __refs = 0) ++      : __codecvt_abstract_base<intern_type, extern_type, state_type>(__refs) ++      { } ++ ++      explicit  ++      codecvt(__enc_type* __enc, size_t __refs = 0) ++      : __codecvt_abstract_base<intern_type, extern_type, state_type>(__refs) ++      { } ++ ++    protected: ++      virtual  ++      ~codecvt() { } ++ ++      virtual result ++      do_out(state_type& __state, const intern_type* __from,  ++	     const intern_type* __from_end, const intern_type*& __from_next, ++	     extern_type* __to, extern_type* __to_end, ++	     extern_type*& __to_next) const; ++ ++      virtual result ++      do_unshift(state_type& __state, extern_type* __to,  ++		 extern_type* __to_end, extern_type*& __to_next) const; ++ ++      virtual result ++      do_in(state_type& __state, const extern_type* __from,  ++	    const extern_type* __from_end, const extern_type*& __from_next, ++	    intern_type* __to, intern_type* __to_end,  ++	    intern_type*& __to_next) const; ++ ++      virtual int  ++      do_encoding() const throw(); ++ ++      virtual bool  ++      do_always_noconv() const throw(); ++ ++      virtual int  ++      do_length(const state_type&, const extern_type* __from,  ++		const extern_type* __end, size_t __max) const; ++ ++      virtual int  ++      do_max_length() const throw(); ++    }; ++ ++  template<typename _InternT, typename _ExternT> ++    locale::id  ++    codecvt<_InternT, _ExternT, __enc_traits>::id; ++ ++  // This adaptor works around the signature problems of the second ++  // argument to iconv():  SUSv2 and others use 'const char**', but glibc 2.2 ++  // uses 'char**', which matches the POSIX 1003.1-2001 standard. ++  // Using this adaptor, g++ will do the work for us. ++  template<typename _T> ++    inline size_t ++    __iconv_adaptor(size_t(*__func)(iconv_t, _T, size_t*, char**, size_t*), ++                    iconv_t __cd, char** __inbuf, size_t* __inbytes, ++                    char** __outbuf, size_t* __outbytes) ++    { return __func(__cd, (_T)__inbuf, __inbytes, __outbuf, __outbytes); } ++ ++  template<typename _InternT, typename _ExternT> ++    codecvt_base::result ++    codecvt<_InternT, _ExternT, __enc_traits>:: ++    do_out(state_type& __state, const intern_type* __from,  ++	   const intern_type* __from_end, const intern_type*& __from_next, ++	   extern_type* __to, extern_type* __to_end, ++	   extern_type*& __to_next) const ++    { ++      result __ret = codecvt_base::error; ++      if (__state._M_good()) ++	{ ++	  typedef state_type::__desc_type	__desc_type; ++	  const __desc_type* __desc = __state._M_get_out_descriptor(); ++	  const size_t __fmultiple = sizeof(intern_type); ++	  size_t __fbytes = __fmultiple * (__from_end - __from); ++	  const size_t __tmultiple = sizeof(extern_type); ++	  size_t __tbytes = __tmultiple * (__to_end - __to);  ++	   ++	  // Argument list for iconv specifies a byte sequence. Thus, ++	  // all to/from arrays must be brutally casted to char*. ++	  char* __cto = reinterpret_cast<char*>(__to); ++	  char* __cfrom; ++	  size_t __conv; ++ ++	  // Some encodings need a byte order marker as the first item ++	  // in the byte stream, to designate endian-ness. The default ++	  // value for the byte order marker is NULL, so if this is ++	  // the case, it's not necessary and we can just go on our ++	  // merry way. ++	  int __int_bom = __state._M_get_internal_bom(); ++	  if (__int_bom) ++	    {	   ++	      size_t __size = __from_end - __from; ++	      intern_type* __cfixed = static_cast<intern_type*>(__builtin_alloca(sizeof(intern_type) * (__size + 1))); ++	      __cfixed[0] = static_cast<intern_type>(__int_bom); ++	      char_traits<intern_type>::copy(__cfixed + 1, __from, __size); ++	      __cfrom = reinterpret_cast<char*>(__cfixed); ++	      __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++                                        &__fbytes, &__cto, &__tbytes);  ++	    } ++	  else ++	    { ++	      intern_type* __cfixed = const_cast<intern_type*>(__from); ++	      __cfrom = reinterpret_cast<char*>(__cfixed); ++	      __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, &__fbytes,  ++				       &__cto, &__tbytes);  ++	    } ++ ++	  if (__conv != size_t(-1)) ++	    { ++	      __from_next = reinterpret_cast<const intern_type*>(__cfrom); ++	      __to_next = reinterpret_cast<extern_type*>(__cto); ++	      __ret = codecvt_base::ok; ++	    } ++	  else  ++	    { ++	      if (__fbytes < __fmultiple * (__from_end - __from)) ++		{ ++		  __from_next = reinterpret_cast<const intern_type*>(__cfrom); ++		  __to_next = reinterpret_cast<extern_type*>(__cto); ++		  __ret = codecvt_base::partial; ++		} ++	      else ++		__ret = codecvt_base::error; ++	    } ++	} ++      return __ret;  ++    } ++ ++  template<typename _InternT, typename _ExternT> ++    codecvt_base::result ++    codecvt<_InternT, _ExternT, __enc_traits>:: ++    do_unshift(state_type& __state, extern_type* __to,  ++	       extern_type* __to_end, extern_type*& __to_next) const ++    { ++      result __ret = codecvt_base::error; ++      if (__state._M_good()) ++	{ ++	  typedef state_type::__desc_type	__desc_type; ++	  const __desc_type* __desc = __state._M_get_in_descriptor(); ++	  const size_t __tmultiple = sizeof(intern_type); ++	  size_t __tlen = __tmultiple * (__to_end - __to);  ++	   ++	  // Argument list for iconv specifies a byte sequence. Thus, ++	  // all to/from arrays must be brutally casted to char*. ++	  char* __cto = reinterpret_cast<char*>(__to); ++	  size_t __conv = __iconv_adaptor(iconv,*__desc, NULL, NULL, ++                                          &__cto, &__tlen);  ++	   ++	  if (__conv != size_t(-1)) ++	    { ++	      __to_next = reinterpret_cast<extern_type*>(__cto); ++	      if (__tlen == __tmultiple * (__to_end - __to)) ++		__ret = codecvt_base::noconv; ++	      else if (__tlen == 0) ++		__ret = codecvt_base::ok; ++	      else ++		__ret = codecvt_base::partial; ++	    } ++	  else  ++	    __ret = codecvt_base::error; ++	} ++      return __ret;  ++    } ++    ++  template<typename _InternT, typename _ExternT> ++    codecvt_base::result ++    codecvt<_InternT, _ExternT, __enc_traits>:: ++    do_in(state_type& __state, const extern_type* __from,  ++	  const extern_type* __from_end, const extern_type*& __from_next, ++	  intern_type* __to, intern_type* __to_end,  ++	  intern_type*& __to_next) const ++    {  ++      result __ret = codecvt_base::error; ++      if (__state._M_good()) ++	{ ++	  typedef state_type::__desc_type	__desc_type; ++	  const __desc_type* __desc = __state._M_get_in_descriptor(); ++	  const size_t __fmultiple = sizeof(extern_type); ++	  size_t __flen = __fmultiple * (__from_end - __from); ++	  const size_t __tmultiple = sizeof(intern_type); ++	  size_t __tlen = __tmultiple * (__to_end - __to);  ++	   ++	  // Argument list for iconv specifies a byte sequence. Thus, ++	  // all to/from arrays must be brutally casted to char*. ++	  char* __cto = reinterpret_cast<char*>(__to); ++	  char* __cfrom; ++	  size_t __conv; ++ ++	  // Some encodings need a byte order marker as the first item ++	  // in the byte stream, to designate endian-ness. The default ++	  // value for the byte order marker is NULL, so if this is ++	  // the case, it's not necessary and we can just go on our ++	  // merry way. ++	  int __ext_bom = __state._M_get_external_bom(); ++	  if (__ext_bom) ++	    {	   ++	      size_t __size = __from_end - __from; ++	      extern_type* __cfixed =  static_cast<extern_type*>(__builtin_alloca(sizeof(extern_type) * (__size + 1))); ++	      __cfixed[0] = static_cast<extern_type>(__ext_bom); ++	      char_traits<extern_type>::copy(__cfixed + 1, __from, __size); ++	      __cfrom = reinterpret_cast<char*>(__cfixed); ++	      __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++                                       &__flen, &__cto, &__tlen);  ++	    } ++	  else ++	    { ++	      extern_type* __cfixed = const_cast<extern_type*>(__from); ++	      __cfrom = reinterpret_cast<char*>(__cfixed); ++	      __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++                                       &__flen, &__cto, &__tlen);  ++	    } ++ ++	   ++	  if (__conv != size_t(-1)) ++	    { ++	      __from_next = reinterpret_cast<const extern_type*>(__cfrom); ++	      __to_next = reinterpret_cast<intern_type*>(__cto); ++	      __ret = codecvt_base::ok; ++	    } ++	  else  ++	    { ++	      if (__flen < static_cast<size_t>(__from_end - __from)) ++		{ ++		  __from_next = reinterpret_cast<const extern_type*>(__cfrom); ++		  __to_next = reinterpret_cast<intern_type*>(__cto); ++		  __ret = codecvt_base::partial; ++		} ++	      else ++		__ret = codecvt_base::error; ++	    } ++	} ++      return __ret;  ++    } ++   ++  template<typename _InternT, typename _ExternT> ++    int  ++    codecvt<_InternT, _ExternT, __enc_traits>:: ++    do_encoding() const throw() ++    { ++      int __ret = 0; ++      if (sizeof(_ExternT) <= sizeof(_InternT)) ++	__ret = sizeof(_InternT)/sizeof(_ExternT); ++      return __ret;  ++    } ++   ++  template<typename _InternT, typename _ExternT> ++    bool  ++    codecvt<_InternT, _ExternT, __enc_traits>:: ++    do_always_noconv() const throw() ++    { return false; } ++   ++  template<typename _InternT, typename _ExternT> ++    int  ++    codecvt<_InternT, _ExternT, __enc_traits>:: ++    do_length(const state_type&, const extern_type* __from,  ++	      const extern_type* __end, size_t __max) const ++    { return min(__max, static_cast<size_t>(__end - __from)); } ++ ++#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS ++// 74.  Garbled text for codecvt::do_max_length ++  template<typename _InternT, typename _ExternT> ++    int  ++    codecvt<_InternT, _ExternT, __enc_traits>:: ++    do_max_length() const throw() ++    { return 1; } ++#endif +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/collate_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/collate_members.cc	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/collate_members.cc	2004-01-09 08:06:24.000000000 -0600 +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library.  This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING.  If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction.  Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License.  This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2  collate virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L)      strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L)   strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L)      wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L)   wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++  // These are basically extensions to char_traits, and perhaps should ++  // be put there instead of here. ++  template<> ++    int  ++    collate<char>::_M_compare(const char* __one, const char* __two) const ++    {  ++      int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++      return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++    } ++   ++  template<> ++    size_t ++    collate<char>::_M_transform(char* __to, const char* __from,  ++				size_t __n) const  ++    { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++  template<> ++    int  ++    collate<wchar_t>::_M_compare(const wchar_t* __one,  ++				 const wchar_t* __two) const ++    { ++      int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++      return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++    } ++   ++  template<> ++    size_t ++    collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from, ++				   size_t __n) const ++    { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/ctype_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/ctype_members.cc	2004-01-09 08:15:41.000000000 -0600 +@@ -0,0 +1,274 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library.  This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING.  If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction.  Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License.  This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2  ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L)           wctype((S)) ++#define __towupper_l(C, L)         towupper((C)) ++#define __towlower_l(C, L)         towlower((C)) ++#define __iswctype_l(C, M, L)      iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++  // NB: The other ctype<char> specializations are in src/locale.cc and ++  // various /config/os/* files. ++  template<> ++    ctype_byname<char>::ctype_byname(const char* __s, size_t __refs) ++    : ctype<char>(0, false, __refs)  ++    { 	 ++      _S_destroy_c_locale(_M_c_locale_ctype); ++      _S_create_c_locale(_M_c_locale_ctype, __s);  ++#ifdef __UCLIBC_HAS_XLOCALE__ ++      _M_toupper = _M_c_locale_ctype->__ctype_toupper; ++      _M_tolower = _M_c_locale_ctype->__ctype_tolower; ++      _M_table = _M_c_locale_ctype->__ctype_b; ++#endif ++    } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T   ++  ctype<wchar_t>::__wmask_type ++  ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const ++  { ++    __wmask_type __ret; ++    switch (__m) ++      { ++      case space: ++	__ret = __wctype_l("space", _M_c_locale_ctype); ++	break; ++      case print: ++	__ret = __wctype_l("print", _M_c_locale_ctype); ++	break; ++      case cntrl: ++	__ret = __wctype_l("cntrl", _M_c_locale_ctype); ++	break; ++      case upper: ++	__ret = __wctype_l("upper", _M_c_locale_ctype); ++	break; ++      case lower: ++	__ret = __wctype_l("lower", _M_c_locale_ctype); ++	break; ++      case alpha: ++	__ret = __wctype_l("alpha", _M_c_locale_ctype); ++	break; ++      case digit: ++	__ret = __wctype_l("digit", _M_c_locale_ctype); ++	break; ++      case punct: ++	__ret = __wctype_l("punct", _M_c_locale_ctype); ++	break; ++      case xdigit: ++	__ret = __wctype_l("xdigit", _M_c_locale_ctype); ++	break; ++      case alnum: ++	__ret = __wctype_l("alnum", _M_c_locale_ctype); ++	break; ++      case graph: ++	__ret = __wctype_l("graph", _M_c_locale_ctype); ++	break; ++      default: ++	__ret = 0; ++      } ++    return __ret; ++  }; ++   ++  wchar_t ++  ctype<wchar_t>::do_toupper(wchar_t __c) const ++  { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++  const wchar_t* ++  ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++  { ++    while (__lo < __hi) ++      { ++        *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++        ++__lo; ++      } ++    return __hi; ++  } ++   ++  wchar_t ++  ctype<wchar_t>::do_tolower(wchar_t __c) const ++  { return __towlower_l(__c, _M_c_locale_ctype); } ++   ++  const wchar_t* ++  ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++  { ++    while (__lo < __hi) ++      { ++        *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++        ++__lo; ++      } ++    return __hi; ++  } ++ ++  bool ++  ctype<wchar_t>:: ++  do_is(mask __m, wchar_t __c) const ++  {  ++    // Highest bitmask in ctype_base == 10, but extra in "C" ++    // library for blank. ++    bool __ret = false; ++    const size_t __bitmasksize = 11;  ++    for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++      { ++	const mask __bit = static_cast<mask>(_ISbit(__bitcur)); ++	if (__m & __bit) ++	  __ret |= __iswctype_l(__c, _M_convert_to_wmask(__bit),  ++				_M_c_locale_ctype);  ++      } ++    return __ret;     ++  } ++   ++  const wchar_t*  ++  ctype<wchar_t>:: ++  do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++  { ++    for (;__lo < __hi; ++__vec, ++__lo) ++      { ++	// Highest bitmask in ctype_base == 10, but extra in "C" ++	// library for blank. ++	const size_t __bitmasksize = 11;  ++	mask __m = 0; ++	for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++	  {  ++	    const mask __bit = static_cast<mask>(_ISbit(__bitcur)); ++	    if (__iswctype_l(*__lo, _M_convert_to_wmask(__bit),  ++			     _M_c_locale_ctype)) ++	      __m |= __bit; ++	  } ++	*__vec = __m; ++      } ++    return __hi; ++  } ++   ++  const wchar_t*  ++  ctype<wchar_t>:: ++  do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++  { ++    while (__lo < __hi && !this->do_is(__m, *__lo)) ++      ++__lo; ++    return __lo; ++  } ++ ++  const wchar_t* ++  ctype<wchar_t>:: ++  do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++  { ++    while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++      ++__lo; ++    return __lo; ++  } ++ ++  wchar_t ++  ctype<wchar_t>:: ++  do_widen(char __c) const ++  { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++    __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++    wchar_t __ret = btowc(__c); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++    __uselocale(__old); ++#endif ++    return __ret; ++  } ++ ++  const char*  ++  ctype<wchar_t>:: ++  do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++  { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++    __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++    mbstate_t __state; ++    memset(static_cast<void*>(&__state), 0, sizeof(mbstate_t)); ++    mbsrtowcs(__dest, &__lo, __hi - __lo, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++    __uselocale(__old); ++#endif ++    return __hi; ++  } ++ ++  char ++  ctype<wchar_t>:: ++  do_narrow(wchar_t __wc, char __dfault) const ++  {  ++#ifdef __UCLIBC_HAS_XLOCALE__ ++    __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++    int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++    __uselocale(__old); ++#endif ++    return (__c == EOF ? __dfault : static_cast<char>(__c));  ++  } ++ ++  const wchar_t* ++  ctype<wchar_t>:: ++  do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault,  ++	    char* __dest) const ++  { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++    __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++    size_t __offset = 0; ++    while (true) ++      { ++	const wchar_t* __start = __lo + __offset;         ++	size_t __len = __hi - __start; ++	 ++	mbstate_t __state; ++	memset(static_cast<void*>(&__state), 0, sizeof(mbstate_t)); ++	size_t __con = wcsrtombs(__dest + __offset, &__start, __len, &__state); ++	if (__con != __len && __start != 0) ++	  { ++	    __offset = __start - __lo;           ++	    __dest[__offset++] = __dfault; ++	  } ++	else ++	  break; ++      } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++    __uselocale(__old); ++#endif ++    return __hi; ++  } ++#endif //  _GLIBCPP_USE_WCHAR_T ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.cc	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.cc	2004-01-09 08:46:16.000000000 -0600 +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library.  This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING.  If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction.  Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License.  This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2  messages virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++			     const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++  // Specializations. ++  template<> ++    string ++    messages<char>::do_get(catalog, int, int, const string& __dfault) const ++    { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++      __c_locale __old = __uselocale(_M_c_locale_messages); ++      const char* __msg = const_cast<const char*>(gettext(__dfault.c_str())); ++      __uselocale(__old); ++      return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++      char* __old = strdup(setlocale(LC_ALL, NULL)); ++      setlocale(LC_ALL, _M_name_messages); ++      const char* __msg = gettext(__dfault.c_str()); ++      setlocale(LC_ALL, __old); ++      free(__old); ++      return string(__msg); ++#else ++      const char* __msg = gettext(__dfault.c_str()); ++      return string(__msg); ++#endif ++    } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++  template<> ++    wstring ++    messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const ++    { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++      __c_locale __old = __uselocale(_M_c_locale_messages); ++      char* __msg = gettext(_M_convert_to_char(__dfault)); ++      __uselocale(__old); ++      return _M_convert_from_char(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++      char* __old = strdup(setlocale(LC_ALL, NULL)); ++      setlocale(LC_ALL, _M_name_messages); ++      char* __msg = gettext(_M_convert_to_char(__dfault)); ++      setlocale(LC_ALL, __old); ++      free(__old); ++      return _M_convert_from_char(__msg); ++# else ++      char* __msg = gettext(_M_convert_to_char(__dfault)); ++      return _M_convert_from_char(__msg); ++# endif ++    } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.h	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.h	2004-01-09 08:52:48.000000000 -0600 +@@ -0,0 +1,122 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library.  This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING.  If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction.  Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License.  This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2  messages functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++				  const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D)           ((void)0) ++#define __bindtextdomain(D,P)     ((void)0) ++#endif ++ ++  // Non-virtual member functions. ++  template<typename _CharT> ++     messages<_CharT>::messages(size_t __refs) ++     : locale::facet(__refs) ++     {   ++#ifndef __UCLIBC_HAS_XLOCALE__ ++       _M_name_messages = _S_c_name; ++#endif ++       _M_c_locale_messages = _S_c_locale;  ++     } ++ ++  template<typename _CharT> ++     messages<_CharT>::messages(__c_locale __cloc,  ++				const char* __s, size_t __refs)  ++     : locale::facet(__refs) ++     { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++       _M_name_messages = new char[strlen(__s) + 1]; ++       strcpy(_M_name_messages, __s); ++#endif ++       _M_c_locale_messages = _S_clone_c_locale(__cloc);  ++     } ++ ++  template<typename _CharT> ++    typename messages<_CharT>::catalog  ++    messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc,  ++			   const char* __dir) const ++    {  ++      __bindtextdomain(__s.c_str(), __dir); ++      return this->do_open(__s, __loc);  ++    } ++ ++  // Virtual member functions. ++  template<typename _CharT> ++    messages<_CharT>::~messages() ++    {  ++#ifndef __UCLIBC_HAS_XLOCALE__ ++      if (_S_c_name != _M_name_messages) ++	delete [] _M_name_messages; ++#endif ++      _S_destroy_c_locale(_M_c_locale_messages);  ++    } ++ ++  template<typename _CharT> ++    typename messages<_CharT>::catalog  ++    messages<_CharT>::do_open(const basic_string<char>& __s,  ++			      const locale&) const ++    {  ++      // No error checking is done, assume the catalog exists and can ++      // be used. ++      __textdomain(__s.c_str()); ++      return 0; ++    } ++ ++  template<typename _CharT> ++    void     ++    messages<_CharT>::do_close(catalog) const  ++    { } ++ ++   // messages_byname ++   template<typename _CharT> ++     messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++     : messages<_CharT>(__refs)  ++     {  ++#ifndef __UCLIBC_HAS_XLOCALE__ ++       if (_S_c_name != _M_name_messages) ++	 delete [] _M_name_messages; ++       _M_name_messages = new char[strlen(__s) + 1]; ++       strcpy(_M_name_messages, __s); ++#endif ++       _S_destroy_c_locale(_M_c_locale_messages); ++       _S_create_c_locale(_M_c_locale_messages, __s);  ++     } +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/monetary_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/monetary_members.cc	2004-01-09 18:20:23.000000000 -0600 +@@ -0,0 +1,578 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library.  This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING.  If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction.  Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License.  This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2  moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L)         nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++  // Construct and return valid pattern consisting of some combination of: ++  // space none symbol sign value ++  money_base::pattern ++  money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++  {  ++    pattern __ret; ++ ++    // This insanely complicated routine attempts to construct a valid ++    // pattern for use with monyepunct. A couple of invariants: ++ ++    // if (__precedes) symbol -> value ++    // else value -> symbol ++     ++    // if (__space) space ++    // else none ++ ++    // none == never first ++    // space never first or last ++ ++    // Any elegant implementations of this are welcome. ++    switch (__posn) ++      { ++      case 0: ++      case 1: ++	// 1 The sign precedes the value and symbol. ++	if (__space) ++	  { ++	    // Pattern starts with sign. ++	    if (__precedes) ++	      { ++		__ret.field[1] = symbol; ++		__ret.field[2] = space; ++		__ret.field[3] = value; ++	      } ++	    else ++	      { ++		__ret.field[1] = value; ++		__ret.field[2] = space; ++		__ret.field[3] = symbol; ++	      } ++	    __ret.field[0] = sign; ++	  } ++	else ++	  { ++	    // Pattern starts with sign and ends with none. ++	    if (__precedes) ++	      { ++		__ret.field[1] = symbol; ++		__ret.field[2] = value; ++	      } ++	    else ++	      { ++		__ret.field[1] = value; ++		__ret.field[2] = symbol; ++	      } ++	    __ret.field[0] = sign; ++	    __ret.field[3] = none; ++	  } ++	break; ++      case 2: ++	// 2 The sign follows the value and symbol. ++	if (__space) ++	  { ++	    // Pattern either ends with sign. ++	    if (__precedes) ++	      { ++		__ret.field[0] = symbol; ++		__ret.field[1] = space; ++		__ret.field[2] = value; ++	      } ++	    else ++	      { ++		__ret.field[0] = value; ++		__ret.field[1] = space; ++		__ret.field[2] = symbol; ++	      } ++	    __ret.field[3] = sign; ++	  } ++	else ++	  { ++	    // Pattern ends with sign then none. ++	    if (__precedes) ++	      { ++		__ret.field[0] = symbol; ++		__ret.field[1] = value; ++	      } ++	    else ++	      { ++		__ret.field[0] = value; ++		__ret.field[1] = symbol; ++	      } ++	    __ret.field[2] = sign; ++	    __ret.field[3] = none; ++	  } ++	break; ++      case 3: ++	// 3 The sign immediately precedes the symbol. ++	if (__space) ++	  { ++	    // Have space. ++	    if (__precedes) ++	      { ++		__ret.field[0] = sign; ++		__ret.field[1] = symbol; ++		__ret.field[2] = space; ++		__ret.field[3] = value; ++	      } ++	    else ++	      { ++		__ret.field[0] = value; ++		__ret.field[1] = space; ++		__ret.field[2] = sign; ++		__ret.field[3] = symbol; ++	      } ++	  } ++	else ++	  { ++	    // Have none. ++	    if (__precedes) ++	      { ++		__ret.field[0] = sign; ++		__ret.field[1] = symbol; ++		__ret.field[2] = value; ++	      } ++	    else ++	      { ++		__ret.field[0] = value; ++		__ret.field[1] = sign; ++		__ret.field[2] = symbol; ++	      } ++	    __ret.field[3] = none; ++	  } ++	break; ++      case 4: ++	// 4 The sign immediately follows the symbol.  ++	if (__space) ++	  { ++	    // Have space. ++	    if (__precedes) ++	      { ++		__ret.field[0] = symbol; ++		__ret.field[1] = sign; ++		__ret.field[2] = space; ++		__ret.field[3] = value; ++	      } ++	    else ++	      { ++		__ret.field[0] = value; ++		__ret.field[1] = space; ++		__ret.field[2] = symbol; ++		__ret.field[3] = sign; ++	      } ++	  } ++	else ++	  { ++	    // Have none. ++	    if (__precedes) ++	      { ++		__ret.field[0] = symbol; ++		__ret.field[1] = sign; ++		__ret.field[2] = value; ++	      } ++	    else ++	      { ++		__ret.field[0] = value; ++		__ret.field[1] = symbol; ++		__ret.field[2] = sign; ++	      } ++	    __ret.field[3] = none; ++	  } ++	break; ++      default: ++	; ++      } ++    return __ret; ++  } ++ ++  template<>  ++    void ++    moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc,  ++						     const char*) ++    { ++      if (!__cloc) ++	{ ++	  // "C" locale ++	  _M_decimal_point = '.'; ++	  _M_thousands_sep = ','; ++	  _M_grouping = ""; ++	  _M_curr_symbol = ""; ++	  _M_positive_sign = ""; ++	  _M_negative_sign = ""; ++	  _M_frac_digits = 0; ++	  _M_pos_format = money_base::_S_default_pattern; ++	  _M_neg_format = money_base::_S_default_pattern; ++	} ++      else ++	{ ++	  // Named locale. ++	  _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc)); ++	  _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc)); ++	  _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++	  _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ ++	  char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++	  if (!__nposn) ++	    _M_negative_sign = "()"; ++	  else ++	    _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ ++	  // _Intl == true ++	  _M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++	  _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc)); ++	  char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++	  char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++	  char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++	  _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++	  char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++	  char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++	  _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++	} ++    } ++ ++  template<>  ++    void ++    moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc,  ++						      const char*) ++    { ++      if (!__cloc) ++	{ ++	  // "C" locale ++	  _M_decimal_point = '.'; ++	  _M_thousands_sep = ','; ++	  _M_grouping = ""; ++	  _M_curr_symbol = ""; ++	  _M_positive_sign = ""; ++	  _M_negative_sign = ""; ++	  _M_frac_digits = 0; ++	  _M_pos_format = money_base::_S_default_pattern; ++	  _M_neg_format = money_base::_S_default_pattern; ++	} ++      else ++	{ ++	  // Named locale. ++	  _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc)); ++	  _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc)); ++	  _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++	  _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ ++	  char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++	  if (!__nposn) ++	    _M_negative_sign = "()"; ++	  else ++	    _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ ++	  // _Intl == false ++	  _M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++	  _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++	  char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++	  char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++	  char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++	  _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++	  char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++	  char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++	  _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++	} ++    } ++ ++  template<>  ++    moneypunct<char, true>::~moneypunct() ++    { } ++ ++  template<>  ++    moneypunct<char, false>::~moneypunct() ++    { } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++  template<>  ++    void ++    moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc,  ++#ifdef __UCLIBC_HAS_XLOCALE__ ++							const char*) ++#else ++							const char* __name) ++#endif ++    { ++      if (!__cloc) ++	{ ++	  // "C" locale ++	  _M_decimal_point = L'.'; ++	  _M_thousands_sep = L','; ++	  _M_grouping = ""; ++	  _M_curr_symbol = L""; ++	  _M_positive_sign = L""; ++	  _M_negative_sign = L""; ++	  _M_frac_digits = 0; ++	  _M_pos_format = money_base::_S_default_pattern; ++	  _M_neg_format = money_base::_S_default_pattern; ++	} ++      else ++	{ ++	  // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++	  __c_locale __old = __uselocale(__cloc); ++#else ++	  // Switch to named locale so that mbsrtowcs will work. ++	  char* __old = strdup(setlocale(LC_ALL, NULL)); ++	  setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++	  _M_decimal_point = __cloc->decimal_point_wc; ++	  _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++	  _M_decimal_point = __global_locale->decimal_point_wc; ++	  _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++	  _M_decimal_point = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ ++	  _M_thousands_sep = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++	  _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ ++	  const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++	  const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++	  const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++	  mbstate_t __state; ++	  size_t __len = strlen(__cpossign); ++	  if (__len) ++	    { ++	      ++__len; ++	      memset(&__state, 0, sizeof(mbstate_t)); ++	      wchar_t* __wcs = new wchar_t[__len]; ++	      mbsrtowcs(__wcs, &__cpossign, __len, &__state); ++	      _M_positive_sign = __wcs; ++	    } ++	  else ++	    _M_positive_sign = L""; ++ ++	  char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++	  __len = strlen(__cnegsign); ++	  if (!__nposn) ++	    _M_negative_sign = L"()"; ++	  else if (__len) ++	    {  ++	      ++__len; ++	      memset(&__state, 0, sizeof(mbstate_t)); ++	      wchar_t* __wcs = new wchar_t[__len]; ++	      mbsrtowcs(__wcs, &__cnegsign, __len, &__state); ++	      _M_negative_sign = __wcs; ++	    } ++	  else ++	    _M_negative_sign = L""; ++ ++	  // _Intl == true. ++	  __len = strlen(__ccurr); ++	  if (__len) ++	    { ++	      ++__len; ++	      memset(&__state, 0, sizeof(mbstate_t)); ++	      wchar_t* __wcs = new wchar_t[__len]; ++	      mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++	      _M_curr_symbol = __wcs; ++	    } ++	  else ++	    _M_curr_symbol = L""; ++ ++	  _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc)); ++	  char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++	  char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++	  char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++	  _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++	  char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++	  char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++	  _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++	  __uselocale(__old); ++#else ++	  setlocale(LC_ALL, __old); ++	  free(__old); ++#endif ++	} ++    } ++ ++  template<>  ++    void ++    moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++							 const char*) ++#else ++							 const char* __name) ++#endif ++    { ++      if (!__cloc) ++	{ ++	  // "C" locale ++	  _M_decimal_point = L'.'; ++	  _M_thousands_sep = L','; ++	  _M_grouping = ""; ++	  _M_curr_symbol = L""; ++	  _M_positive_sign = L""; ++	  _M_negative_sign = L""; ++	  _M_frac_digits = 0; ++	  _M_pos_format = money_base::_S_default_pattern; ++	  _M_neg_format = money_base::_S_default_pattern; ++	} ++      else ++	{ ++	  // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++	  __c_locale __old = __uselocale(__cloc); ++#else ++	  // Switch to named locale so that mbsrtowcs will work. ++	  char* __old = strdup(setlocale(LC_ALL, NULL)); ++	  setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++	  _M_decimal_point = __cloc->decimal_point_wc; ++	  _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++	  _M_decimal_point = __global_locale->decimal_point_wc; ++	  _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++	  _M_decimal_point = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++	  _M_thousands_sep = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++	  _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ ++	  const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++	  const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++	  const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++	  mbstate_t __state; ++	  size_t __len; ++	  __len = strlen(__cpossign); ++	  if (__len) ++	    { ++	      ++__len; ++	      memset(&__state, 0, sizeof(mbstate_t)); ++	      wchar_t* __wcs = new wchar_t[__len]; ++	      mbsrtowcs(__wcs, &__cpossign, __len, &__state); ++	      _M_positive_sign = __wcs; ++	    } ++	  else ++	    _M_positive_sign = L""; ++ ++	  char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++	  __len = strlen(__cnegsign); ++	  if (!__nposn) ++	    _M_negative_sign = L"()"; ++	  else if (__len) ++	    {  ++	      ++__len; ++	      memset(&__state, 0, sizeof(mbstate_t)); ++	      wchar_t* __wcs = new wchar_t[__len]; ++	      mbsrtowcs(__wcs, &__cnegsign, __len, &__state); ++	      _M_negative_sign = __wcs; ++	    } ++	  else ++	    _M_negative_sign = L""; ++ ++	  // _Intl == true. ++	  __len = strlen(__ccurr); ++	  if (__len) ++	    { ++	      ++__len; ++	      memset(&__state, 0, sizeof(mbstate_t)); ++	      wchar_t* __wcs = new wchar_t[__len]; ++	      mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++	      _M_curr_symbol = __wcs; ++	    } ++	  else ++	    _M_curr_symbol = L""; ++ ++	  _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++	  char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++	  char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++	  char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++	  _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++	  char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++	  char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++	  _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++	  __uselocale(__old); ++#else ++	  setlocale(LC_ALL, __old); ++	  free(__old); ++#endif ++	} ++    } ++ ++  template<>  ++    moneypunct<wchar_t, true>::~moneypunct() ++    { ++      if (wcslen(_M_positive_sign)) ++	delete [] _M_positive_sign; ++      if (wcslen(_M_negative_sign) && (wcscmp(_M_negative_sign, L"()") != 0)) ++	delete [] _M_negative_sign; ++      if (wcslen(_M_curr_symbol)) ++	delete [] _M_curr_symbol; ++    } ++ ++  template<>  ++    moneypunct<wchar_t, false>::~moneypunct() ++    { ++      if (wcslen(_M_positive_sign)) ++	delete [] _M_positive_sign; ++      if (wcslen(_M_negative_sign) && (wcscmp(_M_negative_sign, L"()") != 0)) ++	delete [] _M_negative_sign; ++      if (wcslen(_M_curr_symbol)) ++	delete [] _M_curr_symbol; ++    } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/numeric_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/numeric_members.cc	2004-01-09 18:20:59.000000000 -0600 +@@ -0,0 +1,129 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library.  This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING.  If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction.  Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License.  This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2  numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L)         nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++  template<>  ++    void ++    numpunct<char>::_M_initialize_numpunct(__c_locale __cloc) ++    { ++      if (!__cloc) ++	{ ++	  // "C" locale ++	  _M_decimal_point = '.'; ++	  _M_thousands_sep = ','; ++	  _M_grouping = ""; ++	} ++      else ++	{ ++	  // Named locale. ++	  _M_decimal_point = *(__nl_langinfo_l(RADIXCHAR, __cloc)); ++	  _M_thousands_sep = *(__nl_langinfo_l(THOUSEP, __cloc)); ++	  // Check for NUL, which implies no grouping. ++	  if (_M_thousands_sep == '\0') ++	    _M_grouping = ""; ++	  else ++	    _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++	} ++      // NB: There is no way to extact this info from posix locales. ++      // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++      _M_truename = "true"; ++      // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++      _M_falsename = "false"; ++    } ++  ++  template<>  ++    numpunct<char>::~numpunct() ++    { } ++    ++#ifdef _GLIBCPP_USE_WCHAR_T ++  template<>  ++    void ++    numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc) ++    { ++      if (!__cloc) ++	{ ++	  // "C" locale ++	  _M_decimal_point = L'.'; ++	  _M_thousands_sep = L','; ++	  _M_grouping = ""; ++	} ++      else ++	{ ++	  // Named locale. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++	  _M_decimal_point = __cloc->decimal_point_wc; ++	  _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++	  _M_decimal_point = __global_locale->decimal_point_wc; ++	  _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++	  _M_decimal_point = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++	  _M_thousands_sep = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++	  if (_M_thousands_sep == L'\0') ++	    _M_grouping = ""; ++	  else ++	    _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++	} ++      // NB: There is no way to extact this info from posix locales. ++      // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++      _M_truename = L"true"; ++      // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++      _M_falsename = L"false"; ++    } ++ ++  template<>  ++    numpunct<wchar_t>::~numpunct() ++    { } ++ #endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.cc	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.cc	2004-01-09 08:25:03.000000000 -0600 +@@ -0,0 +1,341 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library.  This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING.  If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction.  Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License.  This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L)         nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++  template<> ++    void ++    __timepunct<char>:: ++    _M_put(char* __s, size_t __maxlen, const char* __format,  ++	   const tm* __tm) const ++    { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++      __strftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++      char* __old = strdup(setlocale(LC_ALL, NULL)); ++      setlocale(LC_ALL, _M_name_timepunct); ++      strftime(__s, __maxlen, __format, __tm); ++      setlocale(LC_ALL, __old); ++      free(__old); ++#endif ++    } ++ ++  template<>  ++    void ++    __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc) ++    { ++      if (!__cloc) ++	{ ++	  // "C" locale ++	  _M_c_locale_timepunct = _S_c_locale; ++ ++	  _M_date_format = "%m/%d/%y"; ++	  _M_date_era_format = "%m/%d/%y"; ++	  _M_time_format = "%H:%M:%S"; ++	  _M_time_era_format = "%H:%M:%S"; ++	  _M_date_time_format = ""; ++	  _M_date_time_era_format = ""; ++	  _M_am = "AM"; ++	  _M_pm = "PM"; ++	  _M_am_pm_format = ""; ++ ++	  // Day names, starting with "C"'s Sunday. ++	  _M_day1 = "Sunday"; ++	  _M_day2 = "Monday"; ++	  _M_day3 = "Tuesday"; ++	  _M_day4 = "Wednesday"; ++	  _M_day5 = "Thursday"; ++	  _M_day6 = "Friday"; ++	  _M_day7 = "Saturday"; ++ ++	  // Abbreviated day names, starting with "C"'s Sun. ++	  _M_day_a1 = "Sun"; ++	  _M_day_a2 = "Mon"; ++	  _M_day_a3 = "Tue"; ++	  _M_day_a4 = "Wed"; ++	  _M_day_a5 = "Thu"; ++	  _M_day_a6 = "Fri"; ++	  _M_day_a7 = "Sat"; ++ ++	  // Month names, starting with "C"'s January. ++	  _M_month01 = "January"; ++	  _M_month02 = "February"; ++	  _M_month03 = "March"; ++	  _M_month04 = "April"; ++	  _M_month05 = "May"; ++	  _M_month06 = "June"; ++	  _M_month07 = "July"; ++	  _M_month08 = "August"; ++	  _M_month09 = "September"; ++	  _M_month10 = "October"; ++	  _M_month11 = "November"; ++	  _M_month12 = "December"; ++ ++	  // Abbreviated month names, starting with "C"'s Jan. ++	  _M_month_a01 = "Jan"; ++	  _M_month_a02 = "Feb"; ++	  _M_month_a03 = "Mar"; ++	  _M_month_a04 = "Apr"; ++	  _M_month_a05 = "May"; ++	  _M_month_a06 = "Jun"; ++	  _M_month_a07 = "July"; ++	  _M_month_a08 = "Aug"; ++	  _M_month_a09 = "Sep"; ++	  _M_month_a10 = "Oct"; ++	  _M_month_a11 = "Nov"; ++	  _M_month_a12 = "Dec"; ++	} ++      else ++	{ ++	  _M_c_locale_timepunct = _S_clone_c_locale(__cloc);  ++ ++	  _M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++	  _M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++	  _M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++	  _M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++	  _M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++	  _M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, __cloc); ++	  _M_am = __nl_langinfo_l(AM_STR, __cloc); ++	  _M_pm = __nl_langinfo_l(PM_STR, __cloc); ++	  _M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++	  // Day names, starting with "C"'s Sunday. ++	  _M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++	  _M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++	  _M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++	  _M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++	  _M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++	  _M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++	  _M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++	  // Abbreviated day names, starting with "C"'s Sun. ++	  _M_day_a1 = __nl_langinfo_l(ABDAY_1, __cloc); ++	  _M_day_a2 = __nl_langinfo_l(ABDAY_2, __cloc); ++	  _M_day_a3 = __nl_langinfo_l(ABDAY_3, __cloc); ++	  _M_day_a4 = __nl_langinfo_l(ABDAY_4, __cloc); ++	  _M_day_a5 = __nl_langinfo_l(ABDAY_5, __cloc); ++	  _M_day_a6 = __nl_langinfo_l(ABDAY_6, __cloc); ++	  _M_day_a7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++	  // Month names, starting with "C"'s January. ++	  _M_month01 = __nl_langinfo_l(MON_1, __cloc); ++	  _M_month02 = __nl_langinfo_l(MON_2, __cloc); ++	  _M_month03 = __nl_langinfo_l(MON_3, __cloc); ++	  _M_month04 = __nl_langinfo_l(MON_4, __cloc); ++	  _M_month05 = __nl_langinfo_l(MON_5, __cloc); ++	  _M_month06 = __nl_langinfo_l(MON_6, __cloc); ++	  _M_month07 = __nl_langinfo_l(MON_7, __cloc); ++	  _M_month08 = __nl_langinfo_l(MON_8, __cloc); ++	  _M_month09 = __nl_langinfo_l(MON_9, __cloc); ++	  _M_month10 = __nl_langinfo_l(MON_10, __cloc); ++	  _M_month11 = __nl_langinfo_l(MON_11, __cloc); ++	  _M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++	  // Abbreviated month names, starting with "C"'s Jan. ++	  _M_month_a01 = __nl_langinfo_l(ABMON_1, __cloc); ++	  _M_month_a02 = __nl_langinfo_l(ABMON_2, __cloc); ++	  _M_month_a03 = __nl_langinfo_l(ABMON_3, __cloc); ++	  _M_month_a04 = __nl_langinfo_l(ABMON_4, __cloc); ++	  _M_month_a05 = __nl_langinfo_l(ABMON_5, __cloc); ++	  _M_month_a06 = __nl_langinfo_l(ABMON_6, __cloc); ++	  _M_month_a07 = __nl_langinfo_l(ABMON_7, __cloc); ++	  _M_month_a08 = __nl_langinfo_l(ABMON_8, __cloc); ++	  _M_month_a09 = __nl_langinfo_l(ABMON_9, __cloc); ++	  _M_month_a10 = __nl_langinfo_l(ABMON_10, __cloc); ++	  _M_month_a11 = __nl_langinfo_l(ABMON_11, __cloc); ++	  _M_month_a12 = __nl_langinfo_l(ABMON_12, __cloc); ++	} ++    } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++  template<> ++    void ++    __timepunct<wchar_t>:: ++    _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format,  ++	   const tm* __tm) const ++    { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++      __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++      char* __old = strdup(setlocale(LC_ALL, NULL)); ++      setlocale(LC_ALL, _M_name_timepunct); ++      wcsftime(__s, __maxlen, __format, __tm); ++      setlocale(LC_ALL, __old); ++      free(__old); ++#endif ++    } ++ ++  template<>  ++    void ++    __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc) ++    { ++#warning wide time stuff ++//       if (!__cloc) ++	{ ++	  // "C" locale ++	  _M_c_locale_timepunct = _S_c_locale; ++ ++	  _M_date_format = L"%m/%d/%y"; ++	  _M_date_era_format = L"%m/%d/%y"; ++	  _M_time_format = L"%H:%M:%S"; ++	  _M_time_era_format = L"%H:%M:%S"; ++	  _M_date_time_format = L""; ++	  _M_date_time_era_format = L""; ++	  _M_am = L"AM"; ++	  _M_pm = L"PM"; ++	  _M_am_pm_format = L""; ++ ++	  // Day names, starting with "C"'s Sunday. ++	  _M_day1 = L"Sunday"; ++	  _M_day2 = L"Monday"; ++	  _M_day3 = L"Tuesday"; ++	  _M_day4 = L"Wednesday"; ++	  _M_day5 = L"Thursday"; ++	  _M_day6 = L"Friday"; ++	  _M_day7 = L"Saturday"; ++ ++	  // Abbreviated day names, starting with "C"'s Sun. ++	  _M_day_a1 = L"Sun"; ++	  _M_day_a2 = L"Mon"; ++	  _M_day_a3 = L"Tue"; ++	  _M_day_a4 = L"Wed"; ++	  _M_day_a5 = L"Thu"; ++	  _M_day_a6 = L"Fri"; ++	  _M_day_a7 = L"Sat"; ++ ++	  // Month names, starting with "C"'s January. ++	  _M_month01 = L"January"; ++	  _M_month02 = L"February"; ++	  _M_month03 = L"March"; ++	  _M_month04 = L"April"; ++	  _M_month05 = L"May"; ++	  _M_month06 = L"June"; ++	  _M_month07 = L"July"; ++	  _M_month08 = L"August"; ++	  _M_month09 = L"September"; ++	  _M_month10 = L"October"; ++	  _M_month11 = L"November"; ++	  _M_month12 = L"December"; ++ ++	  // Abbreviated month names, starting with "C"'s Jan. ++	  _M_month_a01 = L"Jan"; ++	  _M_month_a02 = L"Feb"; ++	  _M_month_a03 = L"Mar"; ++	  _M_month_a04 = L"Apr"; ++	  _M_month_a05 = L"May"; ++	  _M_month_a06 = L"Jun"; ++	  _M_month_a07 = L"July"; ++	  _M_month_a08 = L"Aug"; ++	  _M_month_a09 = L"Sep"; ++	  _M_month_a10 = L"Oct"; ++	  _M_month_a11 = L"Nov"; ++	  _M_month_a12 = L"Dec"; ++	} ++#if 0 ++      else ++	{ ++	  _M_c_locale_timepunct = _S_clone_c_locale(__cloc);  ++ ++	  _M_date_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_FMT, __cloc)); ++	  _M_date_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc)); ++	  _M_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT, __cloc)); ++	  _M_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc)); ++	  _M_date_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_T_FMT, __cloc)); ++	  _M_date_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc)); ++	  _M_am = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WAM_STR, __cloc)); ++	  _M_pm = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WPM_STR, __cloc)); ++	  _M_am_pm_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc)); ++ ++	  // Day names, starting with "C"'s Sunday. ++	  _M_day1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_1, __cloc)); ++	  _M_day2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_2, __cloc)); ++	  _M_day3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_3, __cloc)); ++	  _M_day4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_4, __cloc)); ++	  _M_day5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_5, __cloc)); ++	  _M_day6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_6, __cloc)); ++	  _M_day7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_7, __cloc)); ++ ++	  // Abbreviated day names, starting with "C"'s Sun. ++	  _M_day_a1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_1, __cloc)); ++	  _M_day_a2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_2, __cloc)); ++	  _M_day_a3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_3, __cloc)); ++	  _M_day_a4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_4, __cloc)); ++	  _M_day_a5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_5, __cloc)); ++	  _M_day_a6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_6, __cloc)); ++	  _M_day_a7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_7, __cloc)); ++ ++	  // Month names, starting with "C"'s January. ++	  _M_month01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_1, __cloc)); ++	  _M_month02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_2, __cloc)); ++	  _M_month03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_3, __cloc)); ++	  _M_month04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_4, __cloc)); ++	  _M_month05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_5, __cloc)); ++	  _M_month06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_6, __cloc)); ++	  _M_month07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_7, __cloc)); ++	  _M_month08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_8, __cloc)); ++	  _M_month09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_9, __cloc)); ++	  _M_month10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_10, __cloc)); ++	  _M_month11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_11, __cloc)); ++	  _M_month12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_12, __cloc)); ++ ++	  // Abbreviated month names, starting with "C"'s Jan. ++	  _M_month_a01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_1, __cloc)); ++	  _M_month_a02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_2, __cloc)); ++	  _M_month_a03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_3, __cloc)); ++	  _M_month_a04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_4, __cloc)); ++	  _M_month_a05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_5, __cloc)); ++	  _M_month_a06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_6, __cloc)); ++	  _M_month_a07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_7, __cloc)); ++	  _M_month_a08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_8, __cloc)); ++	  _M_month_a09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_9, __cloc)); ++	  _M_month_a10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_10, __cloc)); ++	  _M_month_a11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_11, __cloc)); ++	  _M_month_a12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_12, __cloc)); ++	} ++#endif // 0 ++    } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.h	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.h	2004-01-09 04:26:21.000000000 -0600 +@@ -0,0 +1,68 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library.  This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING.  If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction.  Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License.  This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++  template<typename _CharT> ++    __timepunct<_CharT>::__timepunct(size_t __refs)  ++    : locale::facet(__refs) ++    {  ++#ifndef __UCLIBC_HAS_XLOCALE__ ++      _M_name_timepunct = _S_c_name; ++#endif ++      _M_initialize_timepunct();  ++    } ++ ++  template<typename _CharT> ++    __timepunct<_CharT>::__timepunct(__c_locale __cloc,  ++				     const char* __s, ++				     size_t __refs)  ++    : locale::facet(__refs) ++    {  ++#ifndef __UCLIBC_HAS_XLOCALE__ ++      _M_name_timepunct = new char[strlen(__s) + 1]; ++      strcpy(_M_name_timepunct, __s); ++#endif ++      _M_initialize_timepunct(__cloc);  ++    } ++ ++  template<typename _CharT> ++    __timepunct<_CharT>::~__timepunct() ++    {  ++#ifndef __UCLIBC_HAS_XLOCALE__ ++      if (_S_c_name != _M_name_timepunct) ++	delete [] _M_name_timepunct; ++#endif ++      _S_destroy_c_locale(_M_c_locale_timepunct);  ++    } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_base.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_base.h	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_base.h	2004-01-09 02:54:54.000000000 -0600 +@@ -0,0 +1,57 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library.  This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING.  If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction.  Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License.  This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1  Locales ++// ++   ++// Information as gleaned from /usr/include/ctype.h ++   ++  struct ctype_base ++  { ++    // Note: In uClibc, the following two types depend on configuration. ++ ++    // Non-standard typedefs. ++    typedef const __ctype_touplow_t* __to_type; ++    // NB: Offsets into ctype<char>::_M_table force a particular size ++    // on the mask type. Because of this, we don't use an enum. ++    typedef __ctype_mask_t	mask;    ++ ++    static const mask upper    	= _ISupper; ++    static const mask lower 	= _ISlower; ++    static const mask alpha 	= _ISalpha; ++    static const mask digit 	= _ISdigit; ++    static const mask xdigit 	= _ISxdigit; ++    static const mask space 	= _ISspace; ++    static const mask print 	= _ISprint; ++    static const mask graph 	= _ISgraph; ++    static const mask cntrl 	= _IScntrl; ++    static const mask punct 	= _ISpunct; ++    static const mask alnum 	= _ISalnum; ++  }; +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_inline.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_inline.h	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_inline.h	2002-06-24 00:49:19.000000000 -0500 +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library.  This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING.  If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction.  Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License.  This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1  Locales ++// ++   ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++   ++  bool ++  ctype<char>:: ++  is(mask __m, char __c) const ++  { return _M_table[static_cast<unsigned char>(__c)] & __m; } ++ ++  const char* ++  ctype<char>:: ++  is(const char* __low, const char* __high, mask* __vec) const ++  { ++    while (__low < __high) ++      *__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; ++    return __high; ++  } ++ ++  const char* ++  ctype<char>:: ++  scan_is(mask __m, const char* __low, const char* __high) const ++  { ++    while (__low < __high  ++	   && !(_M_table[static_cast<unsigned char>(*__low)] & __m)) ++      ++__low; ++    return __low; ++  } ++ ++  const char* ++  ctype<char>:: ++  scan_not(mask __m, const char* __low, const char* __high) const ++  { ++    while (__low < __high  ++	   && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0) ++      ++__low; ++    return __low; ++  } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_noninline.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_noninline.h	2004-01-09 03:34:53.000000000 -0600 +@@ -0,0 +1,90 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library.  This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING.  If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction.  Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License.  This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1  Locales ++// ++   ++// Information as gleaned from /usr/include/ctype.h ++ ++  const ctype_base::mask* ++  ctype<char>::classic_table() throw() ++  {  ++    return __C_ctype_b; ++  } ++ ++  ctype<char>::ctype(__c_locale, const mask* __table, bool __del,  ++		     size_t __refs)  ++  : __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del) ++  { ++    _M_toupper = __C_ctype_toupper; ++    _M_tolower = __C_ctype_tolower; ++    _M_table = __table ? __table : __C_ctype_b; ++    _M_c_locale_ctype = _S_c_locale; ++  } ++ ++  ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) :  ++  __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del) ++  { ++    _M_toupper = __C_ctype_toupper; ++    _M_tolower = __C_ctype_tolower; ++    _M_table = __table ? __table : __C_ctype_b; ++    _M_c_locale_ctype = _S_c_locale;  ++  } ++ ++  char ++  ctype<char>::do_toupper(char __c) const ++  { return _M_toupper[static_cast<unsigned char>(__c)]; } ++ ++  const char* ++  ctype<char>::do_toupper(char* __low, const char* __high) const ++  { ++    while (__low < __high) ++      { ++	*__low = _M_toupper[static_cast<unsigned char>(*__low)]; ++	++__low; ++      } ++    return __high; ++  } ++ ++  char ++  ctype<char>::do_tolower(char __c) const ++  { return _M_tolower[static_cast<unsigned char>(__c)]; } ++ ++  const char*  ++  ctype<char>::do_tolower(char* __low, const char* __high) const ++  { ++    while (__low < __high) ++      { ++	*__low = _M_tolower[static_cast<unsigned char>(*__low)]; ++	++__low; ++      } ++    return __high; ++  } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/os_defines.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/os_defines.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/os_defines.h	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/os_defines.h	2004-01-09 04:56:13.000000000 -0600 +@@ -0,0 +1,56 @@ ++// Specific definitions for GNU/Linux  -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library.  This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING.  If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction.  Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License.  This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCPP_OS_DEFINES ++#define _GLIBCPP_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here.  This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include <features.h> ++ ++// These systems have declarations mismatching those in libio.h by ++// omitting throw qualifiers.  Cleanest way out is to not provide ++// throw-qualifiers at all.  Defining it as empty here will make libio.h ++// not define it. ++#undef __THROW ++#define __THROW ++ ++// Tell Glibc not to try to provide its own inline versions of ++// some math functions.  Those cause assembly-time clashes with ++// our definitions. ++#define __NO_MATH_INLINES ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif diff --git a/sources/gcc2.95-uclibc-conf.patch b/sources/gcc2.95-uclibc-conf.patch new file mode 100644 index 000000000..bbf736210 --- /dev/null +++ b/sources/gcc2.95-uclibc-conf.patch @@ -0,0 +1,291 @@ +Warning!  The powerpc patch (rs6000/linux.h) is hack-ish and would +definitely need to be improved to be acceptable upstream.  Also, +this patch isn't complete as it only supports i386, arm, mips, and +powerpc (rs6000). +diff -urN gcc-20011006/config.sub gcc-20011006-new/config.sub +--- gcc-20011006/config.sub	2004-01-13 06:15:28.000000000 -0600 ++++ gcc-20011006-new/config.sub	2004-01-10 11:09:35.000000000 -0600 +@@ -68,7 +68,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +-  linux-gnu*) ++  linux-gnu* | linux-uclibc*) +     os=-$maybe_os +     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` +     ;; +@@ -936,7 +936,8 @@ + 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + 	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +-	      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++	      | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++	      | -uxpv* | -beos* | -mpeix* | -udk* \ + 	      | -interix* | -uwin* ) + 	# Remember, each alternative MUST END IN *, to match a version number. + 		;; +diff -urN gcc-20011006/gcc/config/arm/linux-elf.h gcc-20011006-new/gcc/config/arm/linux-elf.h +--- gcc-20011006/gcc/config/arm/linux-elf.h	2004-01-13 06:15:28.000000000 -0600 ++++ gcc-20011006-new/gcc/config/arm/linux-elf.h	2004-01-10 11:12:11.000000000 -0600 +@@ -90,6 +90,18 @@ + #define ENDFILE_SPEC \ +   "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" +  ++#ifdef USE_UCLIBC ++#define LINK_SPEC "%{h*} %{version:-v} \ ++   %{b} %{Wl,*:%*} \ ++   %{static:-Bstatic} \ ++   %{shared:-shared} \ ++   %{symbolic:-Bsymbolic} \ ++   %{rdynamic:-export-dynamic} \ ++   %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ ++   -X \ ++   %{mbig-endian:-EB}" \ ++   SUBTARGET_EXTRA_LINK_SPEC ++#else + #define LINK_SPEC "%{h*} %{version:-v} \ +    %{b} %{Wl,*:%*} \ +    %{static:-Bstatic} \ +@@ -100,6 +112,7 @@ +    -X \ +    %{mbig-endian:-EB}" \ +    SUBTARGET_EXTRA_LINK_SPEC ++#endif +  + #undef  CPP_PREDEFINES + #define CPP_PREDEFINES \ +diff -urN gcc-20011006/gcc/config/i386/linux.h gcc-20011006-new/gcc/config/i386/linux.h +--- gcc-20011006/gcc/config/i386/linux.h	2001-04-03 17:38:59.000000000 -0500 ++++ gcc-20011006-new/gcc/config/i386/linux.h	2004-01-10 11:15:38.000000000 -0600 +@@ -199,6 +199,15 @@ + 	%{static:-static}}}" + #endif + #else ++#if defined USE_UCLIBC ++#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ ++  %{!shared: \ ++    %{!ibcs: \ ++      %{!static: \ ++	%{rdynamic:-export-dynamic} \ ++	%{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++	%{static:-static}}}" ++#else + #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ +   %{!shared: \ +     %{!ibcs: \ +@@ -207,6 +216,7 @@ + 	%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + 	%{static:-static}}}" + #endif ++#endif +  + /* Get perform_* macros to build libgcc.a.  */ + #include "i386/perform.h" +diff -urN gcc-20011006/gcc/config/mips/linux.h gcc-20011006-new/gcc/config/mips/linux.h +--- gcc-20011006/gcc/config/mips/linux.h	2004-01-13 06:15:28.000000000 -0600 ++++ gcc-20011006-new/gcc/config/mips/linux.h	2004-01-10 11:16:39.000000000 -0600 +@@ -154,6 +154,17 @@ +  + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC \ ++ "%(endian_spec) \ ++  %{shared:-shared} \ ++  %{!shared: \ ++    %{!ibcs: \ ++      %{!static: \ ++        %{rdynamic:-export-dynamic} \ ++        %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++        %{static:-static}}}" ++#else + #define LINK_SPEC \ +  "%(endian_spec) \ +   %{shared:-shared} \ +@@ -163,6 +174,7 @@ +         %{rdynamic:-export-dynamic} \ +         %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ +         %{static:-static}}}" ++#endif +  +  + #undef SUBTARGET_ASM_SPEC +diff -urN old/gcc-20011006/gcc/config/mips/t-linux-uclibc gcc-20011006/gcc/config/mips/t-linux-uclibc +--- old/gcc-20011006/gcc/config/mips/t-linux-uclibc	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-20011006/gcc/config/mips/t-linux-uclibc	2004-01-14 02:51:10.000000000 -0600 +@@ -0,0 +1 @@ ++T_CFLAGS = -DUSE_UCLIBC +diff -urN gcc-20011006/gcc/config/rs6000/linux.h gcc-20011006-new/gcc/config/rs6000/linux.h +--- gcc-20011006/gcc/config/rs6000/linux.h	2001-04-03 17:38:59.000000000 -0500 ++++ gcc-20011006-new/gcc/config/rs6000/linux.h	2004-01-10 11:15:38.000000000 -0600 +@@ -36,12 +36,21 @@ + #define CPP_OS_DEFAULT_SPEC "%(cpp_os_linux)" +  + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC "-m elf32ppclinux %{G*} %{shared:-shared} \ ++  %{!shared: \ ++    %{!static: \ ++      %{rdynamic:-export-dynamic} \ ++      %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++    %{static:-static}}" ++#else + #define LINK_SPEC "-m elf32ppclinux %{G*} %{shared:-shared} \ +   %{!shared: \ +     %{!static: \ +       %{rdynamic:-export-dynamic} \ +       %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ +     %{static:-static}}" ++#endif +  + #undef	LIB_DEFAULT_SPEC + #define LIB_DEFAULT_SPEC "%(lib_linux)" +diff -urN gcc-20011006/gcc/config/t-linux-uclibc gcc-20011006-new/gcc/config/t-linux-uclibc +--- gcc-20011006/gcc/config/t-linux-uclibc	1969-12-31 18:00:00.000000000 -0600 ++++ gcc-20011006-new/gcc/config/t-linux-uclibc	2004-01-10 11:18:46.000000000 -0600 +@@ -0,0 +1,18 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Don't run fixproto ++STMP_FIXPROTO = ++ ++# Don't install "assert.h" in gcc. We use the one in glibc. ++INSTALL_ASSERT_H = ++ ++# Compile crtbeginS.o and crtendS.o with pic. ++CRTSTUFF_T_CFLAGS_S = -fPIC ++# Compile libgcc2.a with pic. ++TARGET_LIBGCC2_CFLAGS = -fPIC ++ ++# Do not build libgcc1. Let gcc generate those functions. The GNU/Linux ++# C library can handle them. ++LIBGCC1 =  ++CROSS_LIBGCC1 = ++LIBGCC1_TEST = +diff -urN gcc-20011006/gcc/configure gcc-20011006-new/gcc/configure +--- gcc-20011006/gcc/configure	2004-01-13 06:15:28.000000000 -0600 ++++ gcc-20011006-new/gcc/configure	2004-01-10 11:28:54.000000000 -0600 +@@ -3219,6 +3219,24 @@ + 			;; + 		esac + 		;; ++	arm*-*-linux-uclibc*)		# ARM GNU/Linux with ELF - uClibc ++		xm_file=arm/xm-linux.h ++		xmake_file=x-linux ++		tm_file="arm/linux-elf.h" ++		case $machine in ++		armv2*-*-*) ++			tm_file="arm/linux-elf26.h $tm_file" ++			;; ++		esac ++		tmake_file="t-linux arm/t-linux" ++		extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++		gnu_ld=yes ++		case x${enable_threads} in ++		x | xyes | xpthreads | xposix) ++			thread_file='posix' ++			;; ++		esac ++		;; + 	arm*-*-aout) + 		tm_file=arm/aout.h + 		tmake_file=arm/t-bare +@@ -3631,6 +3649,18 @@ +  			thread_file='single' +  		fi + 		;; ++	i[34567]86-*-linux*uclibc*)	# Intel 80386's running GNU/Linux ++					# with ELF format using uClibc ++		xmake_file=x-linux ++		tm_file=i386/linux.h ++		tmake_file="t-linux-uclibc i386/t-crtstuff" ++		extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++		gnu_ld=yes ++		float_format=i386 ++ 		if test x$enable_threads = xyes; then ++ 			thread_file='posix' ++ 		fi ++		;; + 	i[34567]86-*-linux-gnu*)	# Intel 80386's running GNU/Linux + 					# aka GNU/Linux C library 6 + 		xmake_file=x-linux +@@ -4696,7 +4726,19 @@ + 		# On NetBSD, the headers are already okay, except for math.h. + 		tmake_file=t-netbsd + 		;; +-       mips*-*-linux*)                         # Linux MIPS, either endian. ++	mips*-*-linux-uclibc*)          # Linux (uclibc) MIPS, either endian. ++		tmake_file=mips/t-linux-uclibc ++		xmake_file=x-linux ++		xm_file="xm-siglist.h ${xm_file}" ++               case $machine in ++                       mipsel-*)  tm_file="mips/elfl.h mips/linux.h" ;; ++                       *)         tm_file="mips/elf.h mips/linux.h" ;; ++               esac ++		extra_parts="crtbegin.o crtend.o" ++		gnu_ld=yes ++		gas=yes ++		;; ++	mips*-*-linux*)                         # Linux MIPS, either endian. + 		xmake_file=x-linux + 		xm_file="xm-siglist.h ${xm_file}" +                case $machine in +@@ -5159,6 +5201,24 @@ + 			thread_file='posix' + 		fi + 		;; ++	powerpc-*-linux-uclibc*) ++		tm_file=rs6000/linux.h ++		xm_file="xm-siglist.h rs6000/xm-sysv4.h" ++		xm_defines="USG ${xm_defines}" ++		out_file=rs6000/rs6000.c ++		if test x$gas = xyes ++		then ++			tmake_file="rs6000/t-ppcos t-linux-uclibc rs6000/t-ppccomm" ++		else ++			tmake_file="rs6000/t-ppc t-linux-uclibc rs6000/t-ppccomm" ++		fi ++		xmake_file=x-linux ++		extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++		extra_headers=ppc-asm.h ++		if test x$enable_threads = xyes; then ++			thread_file='posix' ++		fi ++		;; +         powerpc-wrs-vxworks*) +                 cpu_type=rs6000 + 		xm_file="xm-siglist.h rs6000/xm-sysv4.h" +diff -urN gcc-20011006/ltconfig gcc-20011006-new/ltconfig +--- gcc-20011006/ltconfig	1999-06-21 21:35:12.000000000 -0500 ++++ gcc-20011006-new/ltconfig	2004-01-10 11:34:23.000000000 -0600 +@@ -436,6 +436,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case "$host_os" in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +  +@@ -1773,6 +1774,22 @@ +   fi +   ;; +  ++linux-uclibc*) ++  version_type=linux ++  need_lib_prefix=no ++  need_version=no ++  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++  soname_spec='${libname}${release}.so$major' ++  finish_cmds='PATH="$PATH:/sbin" ldconfig -n $libdir' ++  shlibpath_var=LD_LIBRARY_PATH ++  shlibpath_overrides_runpath=no ++  deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ++  file_magic_cmd=/usr/bin/file ++  file_magic_test_file=`echo /lib/libuClibc-*.so` ++  # Assume using the uClibc dynamic linker. ++  dynamic_linker="uClibc ld.so" ++  ;; ++ + netbsd*) +   version_type=sunos +   if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then diff --git a/sources/uClibc.config b/sources/uClibc.config index ac47a7381..73a3b53f2 100644 --- a/sources/uClibc.config +++ b/sources/uClibc.config @@ -38,8 +38,10 @@ HAVE_DOT_CONFIG=y  DOPIC=y  HAVE_SHARED=y  BUILD_UCLIBC_LDSO=y +# UCLIBC_PIE_SUPPORT is not set  LDSO_LDD_SUPPORT=y  UCLIBC_CTOR_DTOR=y +# UCLIBC_PROPOLICE is not set  # UCLIBC_PROFILING is not set  UCLIBC_HAS_THREADS=y  PTHREADS_DEBUG_SUPPORT=y @@ -61,9 +63,9 @@ UCLIBC_TZ_FILE_PATH="/etc/TZ"  #  # Networking Support  # -# UCLIBC_HAS_IPV6 is not set +UCLIBC_HAS_IPV6=y  UCLIBC_HAS_RPC=y -# UCLIBC_HAS_FULL_RPC is not set +UCLIBC_HAS_FULL_RPC=y  #  # String and Stdio Support @@ -120,8 +122,9 @@ DEVEL_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc"  #  # uClibc development/debugging options  # -# DODEBUG is not set -# DOASSERTS is not set +DODEBUG=y +DOASSERTS=y  # SUPPORT_LD_DEBUG is not set  # SUPPORT_LD_DEBUG_EARLY is not set -# UCLIBC_MJN3_ONLY is not set +UCLIBC_MJN3_ONLY=y +UCLIBC_MJN3_DEVEL=y diff --git a/sources/uClibc.config-locale b/sources/uClibc.config-locale index 83e5b8ef6..f3219a245 100644 --- a/sources/uClibc.config-locale +++ b/sources/uClibc.config-locale @@ -38,18 +38,20 @@ HAVE_DOT_CONFIG=y  DOPIC=y  HAVE_SHARED=y  BUILD_UCLIBC_LDSO=y +# UCLIBC_PIE_SUPPORT is not set  LDSO_LDD_SUPPORT=y  UCLIBC_CTOR_DTOR=y +# UCLIBC_PROPOLICE is not set  # UCLIBC_PROFILING is not set  UCLIBC_HAS_THREADS=y  PTHREADS_DEBUG_SUPPORT=y  UCLIBC_HAS_LFS=y  # MALLOC is not set -MALLOC_930716=y +MALLOC_STANDARD=y  MALLOC_GLIBC_COMPAT=y  UCLIBC_DYNAMIC_ATEXIT=y  HAS_SHADOW=y -UNIX98PTY_ONLY=y +# UNIX98PTY_ONLY is not set  ASSUME_DEVPTS=y  UCLIBC_HAS_TM_EXTENSIONS=y  UCLIBC_HAS_TZ_CACHING=y @@ -60,9 +62,9 @@ UCLIBC_TZ_FILE_PATH="/etc/TZ"  #  # Networking Support  # -# UCLIBC_HAS_IPV6 is not set +UCLIBC_HAS_IPV6=y  UCLIBC_HAS_RPC=y -# UCLIBC_HAS_FULL_RPC is not set +UCLIBC_HAS_FULL_RPC=y  #  # String and Stdio Support @@ -111,7 +113,7 @@ UCLIBC_HAS_GNU_GETOPT=y  # Big and Tall  #  UCLIBC_HAS_REGEX=y -# UCLIBC_HAS_WORDEXP is not set +UCLIBC_HAS_WORDEXP=y  UCLIBC_HAS_FTW=y  UCLIBC_HAS_GLOB=y @@ -125,8 +127,9 @@ DEVEL_PREFIX="/usr/$(TARGET_ARCH)-linux-uclibc"  #  # uClibc development/debugging options  # -# DODEBUG is not set -# DOASSERTS is not set +DODEBUG=y +DOASSERTS=y  # SUPPORT_LD_DEBUG is not set  # SUPPORT_LD_DEBUG_EARLY is not set -# UCLIBC_MJN3_ONLY is not set +UCLIBC_MJN3_ONLY=y +UCLIBC_MJN3_DEVEL=y | 
