From 9ea33a2ff1f06f1353573ddd26260caf096362d6 Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@openwrt.org>
Date: Thu, 14 Jun 2012 20:25:57 +0000
Subject: [PATCH] add uclibc++ (from packages)

SVN-Revision: 32367
---
 package/uclibc++/Makefile                     |  87 ++++++++++++
 package/uclibc++/files/config.default         |  58 ++++++++
 .../uclibc++/patches/002-path_to_bash.patch   |  12 ++
 package/uclibc++/patches/003-cp_command.patch |  19 +++
 .../uclibc++/patches/004-ccache_fixes.patch   |  24 ++++
 package/uclibc++/patches/005-wrapper.patch    |  12 ++
 package/uclibc++/patches/006-eabi_fix.patch   |  42 ++++++
 .../uclibc++/patches/010-gcc47x_support.patch | 126 ++++++++++++++++++
 8 files changed, 380 insertions(+)
 create mode 100644 package/uclibc++/Makefile
 create mode 100644 package/uclibc++/files/config.default
 create mode 100644 package/uclibc++/patches/002-path_to_bash.patch
 create mode 100644 package/uclibc++/patches/003-cp_command.patch
 create mode 100644 package/uclibc++/patches/004-ccache_fixes.patch
 create mode 100644 package/uclibc++/patches/005-wrapper.patch
 create mode 100644 package/uclibc++/patches/006-eabi_fix.patch
 create mode 100644 package/uclibc++/patches/010-gcc47x_support.patch

diff --git a/package/uclibc++/Makefile b/package/uclibc++/Makefile
new file mode 100644
index 000000000000..b73e8bdd803f
--- /dev/null
+++ b/package/uclibc++/Makefile
@@ -0,0 +1,87 @@
+#
+# Copyright (C) 2006-2012 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=uclibc++
+PKG_VERSION:=0.2.3
+PKG_RELEASE:=1
+
+PKG_SOURCE:=uClibc++-$(PKG_VERSION).tar.bz2
+PKG_SOURCE_URL:=http://cxx.uclibc.org/src/
+PKG_MD5SUM:=fd71a433ce1de85885d658f47885ab30
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/uClibc++-$(PKG_VERSION)
+PKG_BUILD_PARALLEL:=1
+
+PKG_INSTALL:=1
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/uclibcxx
+  NAME:=uclibc++
+  SECTION:=libs
+  CATEGORY:=Libraries
+  TITLE:=C++ library for embedded systems
+  URL:=http://cxx.uclibc.org/src/
+endef
+
+UCLIBC_TARGET_ARCH:=$(shell echo $(ARCH) | sed -e s'/-.*//' \
+	-e 's/i.86/i386/' \
+	-e 's/sparc.*/sparc/' \
+	-e 's/m68k.*/m68k/' \
+	-e 's/ppc/powerpc/g' \
+	-e 's/v850.*/v850/g' \
+	-e 's/sh64/sh/' \
+	-e 's/sh[234].*/sh/' \
+	-e 's/mips.*/mips/' \
+	-e 's/mipsel.*/mips/' \
+	-e 's/cris.*/cris/' \
+)
+
+TARGET_CFLAGS += $(FPIC)
+
+MAKE_FLAGS:= \
+	TOPDIR="$(PKG_BUILD_DIR)/" \
+	$(TARGET_CONFIGURE_OPTS) \
+	CPU_CFLAGS="$(TARGET_CFLAGS)" \
+	CROSS="$(TARGET_CROSS)" \
+	CP="$(CP)" \
+	GEN_LIBS="-lc $(LIBGCC_S)" \
+	check_as_needed=
+
+# check_as_needed overrides dependency on libgcc_s
+
+define Build/Configure
+	if [ -f ./files/config.$(UCLIBC_TARGET_ARCH) ]; then \
+		cp ./files/config.$(UCLIBC_TARGET_ARCH) $(PKG_BUILD_DIR)/.config; \
+	else \
+		cp ./files/config.default $(PKG_BUILD_DIR)/.config; \
+	fi
+endef
+
+define Build/InstallDev
+	$(INSTALL_DIR) $(2)/bin $(1)/usr/include/uClibc++ $(1)/usr/lib
+	$(INSTALL_BIN) $(PKG_INSTALL_DIR)/bin/g++-uc $(2)/bin/
+	$(CP) $(PKG_INSTALL_DIR)/include/* $(1)/usr/include/uClibc++/
+	$(CP) $(PKG_INSTALL_DIR)/lib/libuClibc++*.{a,so}* $(1)/usr/lib/
+	$(SED) 's|-I/include/|-I$(STAGING_DIR)/usr/include/uClibc++/|g' $(2)/bin/g++-uc
+	$(SED) 's|-L/lib/|-L$(STAGING_DIR)/usr/lib/|g' $(2)/bin/g++-uc
+# add another wrapper which links against both uClibc++ and libstdc++ 
+	$(INSTALL_BIN) $(2)/bin/g++-uc $(2)/bin/g++-uc+std
+	$(SED) 's|^WRAPPER_INCLUDEDIR=.*||g' $(2)/bin/g++-uc+std
+	$(SED) 's|-luClibc++|-Wl,-Bdynamic,-luClibc++,-Bstatic,-lstdc++,-Bdynamic|g' $(2)/bin/g++-uc+std
+	$(SED) 's|-nostdinc++||g' $(2)/bin/g++-uc+std
+endef
+
+define Package/uclibcxx/install
+	$(INSTALL_DIR) $(1)/usr/lib
+	$(CP) $(PKG_INSTALL_DIR)/lib/libuClibc++.so.* $(1)/usr/lib/
+	$(CP) $(PKG_INSTALL_DIR)/lib/libuClibc++-*.so $(1)/usr/lib/
+endef
+
+$(eval $(call BuildPackage,uclibcxx))
diff --git a/package/uclibc++/files/config.default b/package/uclibc++/files/config.default
new file mode 100644
index 000000000000..944e1a6cfb21
--- /dev/null
+++ b/package/uclibc++/files/config.default
@@ -0,0 +1,58 @@
+#
+# Automatically generated make config: don't edit
+#
+
+#
+# Target Features and Options
+#
+UCLIBCXX_HAS_FLOATS=y
+# UCLIBCXX_HAS_LONG_DOUBLE is not set
+# UCLIBCXX_HAS_TLS is not set
+WARNINGS="-Wall"
+BUILD_EXTRA_LIBRARIES=""
+HAVE_DOT_CONFIG=y
+
+#
+# String and I/O Stream Support
+#
+UCLIBCXX_HAS_WCHAR=y
+UCLIBCXX_IOSTREAM_BUFSIZE=32
+UCLIBCXX_HAS_LFS=y
+UCLIBCXX_SUPPORT_CDIR=y
+UCLIBCXX_SUPPORT_CIN=y
+UCLIBCXX_SUPPORT_COUT=y
+UCLIBCXX_SUPPORT_CERR=y
+UCLIBCXX_SUPPORT_CLOG=y
+UCLIBCXX_SUPPORT_WCIN=y
+UCLIBCXX_SUPPORT_WCOUT=y
+UCLIBCXX_SUPPORT_WCERR=y
+UCLIBCXX_SUPPORT_WCLOG=y
+
+#
+# STL and Code Expansion
+#
+UCLIBCXX_STL_BUFFER_SIZE=32
+UCLIBCXX_CODE_EXPANSION=y
+UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS=y
+UCLIBCXX_EXPAND_STRING_CHAR=y
+UCLIBCXX_EXPAND_VECTOR_BASIC=y
+UCLIBCXX_EXPAND_IOS_CHAR=y
+UCLIBCXX_EXPAND_STREAMBUF_CHAR=y
+UCLIBCXX_EXPAND_ISTREAM_CHAR=y
+UCLIBCXX_EXPAND_OSTREAM_CHAR=y
+UCLIBCXX_EXPAND_FSTREAM_CHAR=y
+UCLIBCXX_EXPAND_SSTREAM_CHAR=y
+
+#
+# Library Installation Options
+#
+UCLIBCXX_RUNTIME_PREFIX=""
+UCLIBCXX_RUNTIME_INCLUDE_SUBDIR="/include"
+UCLIBCXX_RUNTIME_LIB_SUBDIR="/lib"
+UCLIBCXX_RUNTIME_BIN_SUBDIR="/bin"
+UCLIBCXX_EXCEPTION_SUPPORT=y
+IMPORT_LIBSUP=y
+# IMPORT_LIBGCC_EH is not set
+BUILD_STATIC_LIB=y
+# BUILD_ONLY_STATIC_LIB is not set
+# DODEBUG is not set
diff --git a/package/uclibc++/patches/002-path_to_bash.patch b/package/uclibc++/patches/002-path_to_bash.patch
new file mode 100644
index 000000000000..05d0e6ff42bd
--- /dev/null
+++ b/package/uclibc++/patches/002-path_to_bash.patch
@@ -0,0 +1,12 @@
+diff -ur old/bin/Makefile dev/bin/Makefile
+--- old/bin/Makefile	Sat Oct 14 17:49:54 2006
++++ dev/bin/Makefile	Sat Oct 14 17:57:33 2006
+@@ -13,7 +13,7 @@
+ 	$(INSTALL) -m 755 $(WRAPPER) $(PREFIX)$(UCLIBCXX_RUNTIME_BINDIR)
+ 
+ $(WRAPPER):
+-	echo '#!/bin/sh' > $(WRAPPER)
++	echo '#!/usr/bin/env bash' > $(WRAPPER)
+ 	echo '' >> $(WRAPPER)
+ 	echo 'WRAPPER_INCLUDEDIR="$${WRAPPER_INCLUDEDIR:=-I$(UCLIBCXX_RUNTIME_INCLUDEDIR)}"' >> $(WRAPPER)
+ 	echo 'WRAPPER_LIBDIR="$${WRAPPER_LIBDIR:=-L$(UCLIBCXX_RUNTIME_LIBDIR)}"' >> $(WRAPPER)
diff --git a/package/uclibc++/patches/003-cp_command.patch b/package/uclibc++/patches/003-cp_command.patch
new file mode 100644
index 000000000000..53d0ed7af92d
--- /dev/null
+++ b/package/uclibc++/patches/003-cp_command.patch
@@ -0,0 +1,19 @@
+diff -ur old/src/Makefile dev/src/Makefile
+--- old/src/Makefile	Sat Oct 14 17:49:54 2006
++++ dev/src/Makefile	Sat Oct 14 18:02:30 2006
+@@ -25,12 +25,14 @@
+ 
+ all:	libgcc_eh libsupc $(EXOBJS) $(ALLBIN)
+ 
++CP = cp -fPR
++
+ install:
+ 	$(INSTALL) -d $(PREFIX)$(UCLIBCXX_RUNTIME_LIBDIR)
+ ifneq ($(BUILD_ONLY_STATIC_LIB),y)
+ 	$(INSTALL) -m 755 $(SHARED_FULLNAME) \
+ 		$(PREFIX)$(UCLIBCXX_RUNTIME_LIBDIR)
+-	cp -fa $(SHARED_MAJORNAME) $(LIBNAME).so $(PREFIX)$(UCLIBCXX_RUNTIME_LIBDIR)
++	$(CP) $(SHARED_MAJORNAME) $(LIBNAME).so $(PREFIX)$(UCLIBCXX_RUNTIME_LIBDIR)
+ endif
+ ifeq ($(BUILD_STATIC_LIB),y)
+ 	$(INSTALL) -m 644 $(LIBNAME).a $(PREFIX)$(UCLIBCXX_RUNTIME_LIBDIR)
diff --git a/package/uclibc++/patches/004-ccache_fixes.patch b/package/uclibc++/patches/004-ccache_fixes.patch
new file mode 100644
index 000000000000..10ceb792baa7
--- /dev/null
+++ b/package/uclibc++/patches/004-ccache_fixes.patch
@@ -0,0 +1,24 @@
+diff -ruN uClibc++-0.2.2-old/src/abi/libgcc_eh/Makefile uClibc++-0.2.2-new/src/abi/libgcc_eh/Makefile
+--- uClibc++-0.2.2-old/src/abi/libgcc_eh/Makefile	2007-06-04 00:51:13.000000000 +0200
++++ uClibc++-0.2.2-new/src/abi/libgcc_eh/Makefile	2007-09-03 21:51:07.000000000 +0200
+@@ -16,7 +16,7 @@
+ #
+ #else
+ #	echo Binary
+-	$(AR) x $(shell CC=$(CC) $(TOPDIR)/scripts/find_libgcc_eh.sh)
++	$(AR) x $(shell CC="$(CC)" $(TOPDIR)/scripts/find_libgcc_eh.sh)
+ #endif
+ #endif
+ 
+diff -ruN uClibc++-0.2.2-old/src/abi/libsupc/Makefile uClibc++-0.2.2-new/src/abi/libsupc/Makefile
+--- uClibc++-0.2.2-old/src/abi/libsupc/Makefile	2007-06-04 00:51:13.000000000 +0200
++++ uClibc++-0.2.2-new/src/abi/libsupc/Makefile	2007-09-03 21:51:17.000000000 +0200
+@@ -14,7 +14,7 @@
+ #
+ #else
+ #	echo Binary
+-	$(AR) x $(shell CC=$(CC) $(TOPDIR)/scripts/find_libsupc.sh)
++	$(AR) x $(shell CC="$(CC)" $(TOPDIR)/scripts/find_libsupc.sh)
+ 	$(RM) -f new_op*.o del_op*.o pure.o new_handler.o eh_alloc.o eh_globals.o
+ #
+ #endif
diff --git a/package/uclibc++/patches/005-wrapper.patch b/package/uclibc++/patches/005-wrapper.patch
new file mode 100644
index 000000000000..b526a901f901
--- /dev/null
+++ b/package/uclibc++/patches/005-wrapper.patch
@@ -0,0 +1,12 @@
+diff -ruN uClibc++-0.2.2-old/bin/Makefile uClibc++-0.2.2-new/bin/Makefile
+--- uClibc++-0.2.2-old/bin/Makefile	2007-09-23 13:46:10.000000000 +0200
++++ uClibc++-0.2.2-new/bin/Makefile	2007-09-23 13:47:03.000000000 +0200
+@@ -25,7 +25,7 @@
+ 	echo 'while [ -n "$$1" ]' >> $(WRAPPER)
+ 	echo 'do' >> $(WRAPPER)
+ 	echo '	WRAPPER_OPTIONS="$$WRAPPER_OPTIONS $$1"' >> $(WRAPPER)
+-	echo '	if [ "$$1" = "-c" -o "$$1" = "-E" -o "$$1" = "-S" ]' >> $(WRAPPER)
++	echo '	if [ "$$1" = "-c" -o "$$1" = "-E" -o "$$1" = "-S" -o "$$1" = "-MF" ]' >> $(WRAPPER)
+ 	echo '	then' >> $(WRAPPER)
+ 	echo '		WRAPPER_INCLIB="N"' >> $(WRAPPER)
+ 	echo '	fi' >> $(WRAPPER)
diff --git a/package/uclibc++/patches/006-eabi_fix.patch b/package/uclibc++/patches/006-eabi_fix.patch
new file mode 100644
index 000000000000..1f5ebcb9d070
--- /dev/null
+++ b/package/uclibc++/patches/006-eabi_fix.patch
@@ -0,0 +1,42 @@
+Index: uClibc++-0.2.2/include/typeinfo
+===================================================================
+--- uClibc++-0.2.2.orig/include/typeinfo	2008-02-13 00:37:04.000000000 +0100
++++ uClibc++-0.2.2/include/typeinfo	2008-02-13 00:37:34.000000000 +0100
+@@ -44,6 +44,7 @@
+   class __class_type_info;
+ } // namespace __cxxabiv1
+ 
++#ifndef __GXX_MERGED_TYPEINFO_NAMES
+ #if !__GXX_WEAK__
+   // If weak symbols are not supported, typeinfo names are not merged.
+   #define __GXX_MERGED_TYPEINFO_NAMES 0
+@@ -51,6 +52,7 @@
+   // On platforms that support weak symbols, typeinfo names are merged.
+   #define __GXX_MERGED_TYPEINFO_NAMES 1
+ #endif
++#endif
+ 
+ namespace std 
+ {
+Index: uClibc++-0.2.2/include/unwind-cxx.h
+===================================================================
+--- uClibc++-0.2.2.orig/include/unwind-cxx.h	2008-02-13 00:38:04.000000000 +0100
++++ uClibc++-0.2.2/include/unwind-cxx.h	2008-02-13 00:40:32.000000000 +0100
+@@ -135,6 +135,7 @@
+ 
+ // This is the exception class we report -- "GNUCC++\0".
+ const _Unwind_Exception_Class __gxx_exception_class
++#ifndef __ARM_EABI_UNWINDER__
+ = ((((((((_Unwind_Exception_Class) 'G' 
+ 	 << 8 | (_Unwind_Exception_Class) 'N')
+ 	<< 8 | (_Unwind_Exception_Class) 'U')
+@@ -143,6 +144,9 @@
+      << 8 | (_Unwind_Exception_Class) '+')
+     << 8 | (_Unwind_Exception_Class) '+')
+    << 8 | (_Unwind_Exception_Class) '\0');
++#else
++= "GNUC++";
++#endif
+ 
+ // GNU C++ personality routine, Version 0.
+ extern "C" _Unwind_Reason_Code __gxx_personality_v0
diff --git a/package/uclibc++/patches/010-gcc47x_support.patch b/package/uclibc++/patches/010-gcc47x_support.patch
new file mode 100644
index 000000000000..a000813b4c1e
--- /dev/null
+++ b/package/uclibc++/patches/010-gcc47x_support.patch
@@ -0,0 +1,126 @@
+--- a/include/associative_base
++++ b/include/associative_base
+@@ -511,7 +511,7 @@
+ 
+ 	pair<iterator, bool> insert(const value_type& x){
+ 		pair<iterator, bool> retval;
+-		iterator location = lower_bound(value_to_key(x));
++		iterator location = lower_bound(this->value_to_key(x));
+ 		retval.second = true;
+ 		//Empty list or need to insert at end
+ 		if(end() == location){
+@@ -520,7 +520,7 @@
+ 			return retval;
+ 		}
+ 		//Something in the list
+-		if(c(value_to_key(x), value_to_key(*location))){
++		if(c(this->value_to_key(x), this->value_to_key(*location))){
+ 			location = backing.insert(location.base_iterator(), x);
+ 			retval.first = location;
+ 		}else{
+@@ -604,7 +604,7 @@
+ 	}
+ 
+ 	iterator insert(const value_type& x){
+-		iterator location = lower_bound(value_to_key(x));
++		iterator location = lower_bound(this->value_to_key(x));
+ 
+ 		if(location == begin()){
+ 			backing.push_front(x);
+--- a/include/fstream
++++ b/include/fstream
+@@ -72,9 +72,9 @@
+ 			pbuffer = new char_type[__UCLIBCXX_IOSTREAM_BUFSIZE__];
+ 			gbuffer = new char_type[__UCLIBCXX_IOSTREAM_BUFSIZE__];
+ 
+-			setp(pbuffer, pbuffer + __UCLIBCXX_IOSTREAM_BUFSIZE__);
++			this->setp(pbuffer, pbuffer + __UCLIBCXX_IOSTREAM_BUFSIZE__);
+ 			//Position get buffer so that there is no data available
+-			setg(gbuffer, gbuffer + __UCLIBCXX_IOSTREAM_BUFSIZE__,
++			this->setg(gbuffer, gbuffer + __UCLIBCXX_IOSTREAM_BUFSIZE__,
+ 				gbuffer + __UCLIBCXX_IOSTREAM_BUFSIZE__);
+ 		}
+ 
+--- a/include/string
++++ b/include/string
+@@ -426,7 +426,7 @@
+ 	}
+ 	_UCXXEXPORT size_type find (Ch c, size_type pos = 0) const{
+ 		for(size_type i = pos; i < length(); ++i){
+-			if(operator[](i) == c){
++			if(this->operator[](i) == c){
+ 				return i;
+ 			}
+ 		}
+@@ -456,7 +456,7 @@
+ 	_UCXXEXPORT size_type find_first_of(const basic_string& str, size_type pos = 0) const{
+ 		for(size_type i = pos; i < length(); ++i){
+ 			for(size_type j = 0; j < str.length() ; ++j){
+-				if( Tr::eq(str[j], operator[](i)) ){
++				if( Tr::eq(str[j], this->operator[](i)) ){
+ 					return i;
+ 				}
+ 			}
+@@ -472,7 +472,7 @@
+ 	}
+ 	_UCXXEXPORT size_type find_first_of(Ch c, size_type pos = 0) const{
+ 		for(size_type i = pos; i< length(); ++i){
+-			if( Tr::eq(operator[](i), c) ){
++			if( Tr::eq(this->operator[](i), c) ){
+ 				return i;
+ 			}
+ 		}
+@@ -485,7 +485,7 @@
+ 		}
+ 		for(size_type i = pos; i >0 ; --i){
+ 			for(size_type j = 0 ; j < str.length(); ++j){
+-				if( Tr::eq(operator[](i-1), str[j]) ){
++				if( Tr::eq(this->operator[](i-1), str[j]) ){
+ 					return i-1;
+ 				}
+ 			}
+@@ -503,7 +503,7 @@
+ 			pos = length();
+ 		}
+ 		for(size_type i = pos; i >0 ; --i){
+-			if( Tr::eq(operator[](i-1), c) ){
++			if( Tr::eq(this->operator[](i-1), c) ){
+ 				return i-1;
+ 			}
+ 		}
+@@ -515,7 +515,7 @@
+ 		for(size_type i = pos; i < length(); ++i){
+ 			foundCharacter = false;
+                         for(size_type j = 0; j < str.length() ; ++j){
+-                                if( Tr::eq(str[j], operator[](i)) ){
++                                if( Tr::eq(str[j], this->operator[](i)) ){
+ 					foundCharacter = true;
+                                 }
+                         }
+@@ -534,7 +534,7 @@
+ 	}
+ 	_UCXXEXPORT size_type find_first_not_of(Ch c, size_type pos = 0) const{
+ 		for(size_type i = pos; i < length() ; ++i){
+-			if(operator[](i) != c){
++			if(this->operator[](i) != c){
+ 				return i;
+ 			}
+ 		}
+@@ -546,7 +546,7 @@
+ 			xpos = pos;
+ 		}
+ 		
+-		while(xpos != npos && npos != str.find_first_of(at(xpos))){
++		while(xpos != npos && npos != str.find_first_of(this->at(xpos))){
+ 			--xpos;
+ 		}
+ 
+@@ -564,7 +564,7 @@
+ 		if(xpos > pos){
+ 			xpos = pos;
+ 		}
+-		while(xpos != npos && Tr::eq(at(xpos), c)){
++		while(xpos != npos && Tr::eq(this->at(xpos), c)){
+ 			--xpos;
+ 		}
+ 		return xpos;
-- 
2.30.2