It's the eglibc packaging with a bit of spit-polishing. And testing. :-)

Signed-off-by: Jeff Waugh <j...@bethesignal.org>
---
 config/Config-build.in                             |  2 +-
 include/package-defaults.mk                        |  2 +-
 include/version.mk                                 |  1 +
 package/libs/toolchain/Makefile                    | 18 +++++
 .../libs/toolchain/glibc-files/etc/nsswitch.conf   | 13 +++
 toolchain/Config.in                                | 16 +++-
 toolchain/glibc/Config.in                          | 12 +++
 toolchain/glibc/Config.version                     | 21 +++++
 toolchain/glibc/Makefile                           | 31 ++++++++
 toolchain/glibc/common.mk                          | 93 ++++++++++++++++++++++
 toolchain/glibc/headers/Makefile                   | 27 +++++++
 toolchain/glibc/include/libintl.h                  |  6 ++
 12 files changed, 238 insertions(+), 4 deletions(-)
 create mode 100644 package/libs/toolchain/glibc-files/etc/nsswitch.conf
 create mode 100644 toolchain/glibc/Config.in
 create mode 100644 toolchain/glibc/Config.version
 create mode 100644 toolchain/glibc/Makefile
 create mode 100644 toolchain/glibc/common.mk
 create mode 100644 toolchain/glibc/headers/Makefile
 create mode 100644 toolchain/glibc/include/libintl.h

diff --git a/config/Config-build.in b/config/Config-build.in
index d184d1f..e4afe28 100644
--- a/config/Config-build.in
+++ b/config/Config-build.in
@@ -187,7 +187,7 @@ menu "Global build settings"
 
        choice
                prompt "Preferred standard C++ library"
-               default USE_LIBSTDCXX if USE_EGLIBC
+               default USE_LIBSTDCXX if USE_GLIBC || USE_EGLIBC
                default USE_UCLIBCXX
                help
                  Select the preferred standard C++ library for all packages 
that support this.
diff --git a/include/package-defaults.mk b/include/package-defaults.mk
index 6a345b6..a34252c 100644
--- a/include/package-defaults.mk
+++ b/include/package-defaults.mk
@@ -5,7 +5,7 @@
 # See /LICENSE for more information.
 #
 
-PKG_DEFAULT_DEPENDS = +libc +USE_EGLIBC:librt +USE_EGLIBC:libpthread
+PKG_DEFAULT_DEPENDS = +libc +USE_EGLIBC:librt +USE_EGLIBC:libpthread 
+USE_GLIBC:librt +USE_GLIBC:libpthread
 
 ifneq ($(PKG_NAME),toolchain)
   PKG_FIXUP_DEPENDS = $(if $(filter kmod-%,$(1)),$(2),$(PKG_DEFAULT_DEPENDS) 
$(filter-out $(PKG_DEFAULT_DEPENDS),$(2)))
diff --git a/include/version.mk b/include/version.mk
index 99af96e..b23fd12 100644
--- a/include/version.mk
+++ b/include/version.mk
@@ -55,6 +55,7 @@ endef
 VERSION_TAINT_SPECS := \
        -ALL:no-all \
        -IPV6:no-ipv6 \
+       +USE_GLIBC:glibc \
        +USE_EGLIBC:eglibc \
        +USE_MKLIBS:mklibs \
        +BUSYBOX_CUSTOM:busybox \
diff --git a/package/libs/toolchain/Makefile b/package/libs/toolchain/Makefile
index 42b9935..d3a4da6 100644
--- a/package/libs/toolchain/Makefile
+++ b/package/libs/toolchain/Makefile
@@ -420,6 +420,24 @@ ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),)
        $(CP) $(TOOLCHAIN_DIR)/lib/libstdc++.so.* $(1)/usr/lib/
   endef
 
+  define Package/glibc/install
+       $(CP) ./glibc-files/* $(1)/
+       rm -f $(1)/etc/localtime
+       $(LN) /tmp/localtime $(1)/etc/localtime
+       $(INSTALL_DIR) $(1)/lib
+       $(CP) \
+               $(TOOLCHAIN_DIR)/lib/ld*.so.* \
+               $(TOOLCHAIN_DIR)/lib/ld-$(LIBC_SO_VERSION).so \
+               $(1)/lib/
+       for file in libanl libc libcidn libcrypt libdl libm libnsl libnss_dns 
libnss_files libresolv libutil; do \
+               for file in $(TOOLCHAIN_DIR)/lib/$$$$file.so.* 
$(TOOLCHAIN_DIR)/lib/$$$$file-$(LIBC_SO_VERSION).so; do \
+                       if [ -e "$$$$file" ]; then \
+                               $(CP) $$$$file $(1)/lib/; \
+                       fi; \
+               done; \
+       done
+  endef
+
   use_libutil=$(if $(CONFIG_EGLIBC_OPTION_EGLIBC_UTMP),libutil)
   use_libnsl=$(if $(CONFIG_EGLIBC_OPTION_EGLIBC_NIS),libnsl)
   use_nsswitch=$(if $(CONFIG_EGLIBC_OPTION_EGLIBC_NSSWITCH),libnss_dns 
libnss_files)
diff --git a/package/libs/toolchain/glibc-files/etc/nsswitch.conf 
b/package/libs/toolchain/glibc-files/etc/nsswitch.conf
new file mode 100644
index 0000000..981c425
--- /dev/null
+++ b/package/libs/toolchain/glibc-files/etc/nsswitch.conf
@@ -0,0 +1,13 @@
+passwd:files
+shadow:files
+group:files
+hosts:dns files
+bootparams:files
+ethers:files
+netmasks:files
+networks:files
+protocols:files
+rpc:files
+services:files
+automount:files
+aliases:files
diff --git a/toolchain/Config.in b/toolchain/Config.in
index ecd9d20..307343f 100644
--- a/toolchain/Config.in
+++ b/toolchain/Config.in
@@ -216,6 +216,11 @@ choice
        help
          Select the C library implementation.
 
+       config LIBC_USE_GLIBC
+               bool "Use glibc"
+               select USE_GLIBC
+               depends on !avr32
+
        config LIBC_USE_EGLIBC
                bool "Use eglibc"
                select USE_EGLIBC
@@ -233,6 +238,7 @@ choice
 
 endchoice
 
+source "toolchain/glibc/Config.in"
 source "toolchain/eglibc/Config.in"
 source "toolchain/uClibc/Config.in"
 source "toolchain/musl/Config.in"
@@ -256,6 +262,9 @@ config INSIGHT
        help
          Enable if you want to build insight-gdb.
 
+config USE_GLIBC
+       bool
+
 config USE_EGLIBC
        bool
        default y if !TOOLCHAINOPTS && !EXTERNAL_TOOLCHAIN && !NATIVE_TOOLCHAIN 
&& (aarch64 || aarch64_be || octeon)
@@ -273,26 +282,29 @@ config USE_EXTERNAL_LIBC
 
 source "toolchain/gcc/Config.version"
 
+source "toolchain/glibc/Config.version"
 source "toolchain/eglibc/Config.version"
 source "toolchain/uClibc/Config.version"
 source "toolchain/musl/Config.version"
 
 config LIBC
        string
+       default "glibc"   if USE_GLIBC
        default "eglibc"  if USE_EGLIBC
        default "uClibc"  if USE_UCLIBC
        default "musl"    if USE_MUSL
 
 config LIBC_VERSION
        string
+       default GLIBC_VERSION   if USE_GLIBC
        default EGLIBC_VERSION  if USE_EGLIBC
        default UCLIBC_VERSION  if USE_UCLIBC
        default MUSL_VERSION    if USE_MUSL
 
 config TARGET_SUFFIX
        string
-       default "gnueabi"         if USE_EGLIBC && (arm || armeb)
-       default "gnu"             if USE_EGLIBC && !(arm || armeb)
+       default "gnueabi"         if (USE_GLIBC || USE_EGLIBC) && (arm || armeb)
+       default "gnu"             if (USE_GLIBC || USE_EGLIBC) && !(arm || 
armeb)
        default "uclibcgnueabi"   if USE_UCLIBC && (arm || armeb)
        default "uclibc"          if USE_UCLIBC && !(arm || armeb)
        default "muslgnueabi"     if USE_MUSL && (arm || armeb)
diff --git a/toolchain/glibc/Config.in b/toolchain/glibc/Config.in
new file mode 100644
index 0000000..5aa55cf
--- /dev/null
+++ b/toolchain/glibc/Config.in
@@ -0,0 +1,12 @@
+choice
+       prompt "glibc version"
+       depends on TOOLCHAINOPTS && USE_GLIBC
+       default GLIBC_USE_VERSION_2_21
+       help
+         Select the version of glibc you wish to use.
+
+       config GLIBC_USE_VERSION_2_21
+               bool "glibc 2.21"
+               select GLIBC_VERSION_2_21
+
+endchoice
diff --git a/toolchain/glibc/Config.version b/toolchain/glibc/Config.version
new file mode 100644
index 0000000..9f81db9
--- /dev/null
+++ b/toolchain/glibc/Config.version
@@ -0,0 +1,21 @@
+if USE_GLIBC
+
+config GLIBC_VERSION
+       string
+       default "2.21" if GLIBC_VERSION_2_21
+
+config GLIBC_VERSION_2_21
+       default y if !TOOLCHAINOPTS
+       bool
+
+config GLIBC_REVISION
+       string
+       default "4e42b5b8f8" if GLIBC_VERSION_2_21
+       default ""
+
+endif
+
+#menu "glibc configuration"
+#      depends on !TOOLCHAINOPTS && USE_GLIBC
+#      source toolchain/glibc/config/Config.in
+#endmenu
diff --git a/toolchain/glibc/Makefile b/toolchain/glibc/Makefile
new file mode 100644
index 0000000..f880db8
--- /dev/null
+++ b/toolchain/glibc/Makefile
@@ -0,0 +1,31 @@
+PATH_PREFIX := .
+VARIANT:=final
+HOST_BUILD_PARALLEL:=0
+
+include ./common.mk
+
+define Host/Compile
+       $(MAKE) -C $(CUR_BUILD_DIR) \
+               PARALLELMFLAGS="$(HOST_JOBS)" \
+               BUILD_CFLAGS="$(HOST_CFLAGS)" \
+               all
+endef
+
+define Host/Install
+       $(call Host/SetToolchainInfo)
+       $(MAKE) -C $(CUR_BUILD_DIR) \
+               BUILD_CFLAGS="$(HOST_CFLAGS)" \
+               install_root="$(TOOLCHAIN_DIR)" \
+               install
+       ( cd $(TOOLCHAIN_DIR) ; \
+               for d in lib usr/lib ; do \
+                 for f in libc.so libpthread.so libgcc_s.so ; do \
+                   if [ -f $$$$d/$$$$f -a ! -L $$$$d/$$$$f ] ; then \
+                     $(SED) 's,/usr/lib/,,g;s,/lib/,,g' $$$$d/$$$$f ; \
+                   fi \
+                 done \
+               done \
+       )
+endef
+
+$(eval $(call HostBuild))
diff --git a/toolchain/glibc/common.mk b/toolchain/glibc/common.mk
new file mode 100644
index 0000000..4c6b12a
--- /dev/null
+++ b/toolchain/glibc/common.mk
@@ -0,0 +1,93 @@
+#
+# Copyright (C) 2006-2011 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:=glibc
+PKG_VERSION:=$(call qstrip,$(CONFIG_GLIBC_VERSION))
+PKG_REVISION:=$(call qstrip,$(CONFIG_GLIBC_REVISION))
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL:=git://sourceware.org/git/glibc.git
+PKG_SOURCE_VERSION:=$(PKG_REVISION)
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)-r$(PKG_REVISION)
+PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.xz
+
+PATCH_DIR:=$(PATH_PREFIX)/patches/$(PKG_VERSION)
+
+HOST_BUILD_DIR:=$(BUILD_DIR_TOOLCHAIN)/$(PKG_SOURCE_SUBDIR)
+CUR_BUILD_DIR:=$(HOST_BUILD_DIR)-$(VARIANT)
+
+include $(INCLUDE_DIR)/toolchain-build.mk
+
+HOST_STAMP_PREPARED:=$(HOST_BUILD_DIR)/.prepared
+HOST_STAMP_CONFIGURED:=$(CUR_BUILD_DIR)/.configured
+HOST_STAMP_BUILT:=$(CUR_BUILD_DIR)/.built
+HOST_STAMP_INSTALLED:=$(TOOLCHAIN_DIR)/stamp/.glibc_$(VARIANT)_installed
+
+ifeq ($(ARCH),mips64)
+  ifdef CONFIG_MIPS64_ABI_N64
+    TARGET_CFLAGS += -mabi=64
+  endif
+  ifdef CONFIG_MIPS64_ABI_N32
+    TARGET_CFLAGS += -mabi=n32
+  endif
+  ifdef CONFIG_MIPS64_ABI_O32
+    TARGET_CFLAGS += -mabi=32
+  endif
+endif
+
+GLIBC_CONFIGURE:= \
+       BUILD_CC="$(HOSTCC)" \
+       $(TARGET_CONFIGURE_OPTS) \
+       CFLAGS="$(TARGET_CFLAGS)" \
+       libc_cv_slibdir="/lib" \
+       use_ldconfig=no \
+       $(HOST_BUILD_DIR)/configure \
+               --prefix= \
+               --build=$(GNU_HOST_NAME) \
+               --host=$(REAL_GNU_TARGET_NAME) \
+               --with-headers=$(TOOLCHAIN_DIR)/include \
+               --disable-werror \
+               --disable-profile \
+               --without-gd \
+               --without-cvs \
+               --enable-add-ons \
+               --$(if $(CONFIG_SOFT_FLOAT),without,with)-fp
+
+export libc_cv_ssp=no
+export ac_cv_header_cpuid_h=yes
+export HOST_CFLAGS := $(HOST_CFLAGS) -idirafter 
$(CURDIR)/$(PATH_PREFIX)/include
+
+define Host/SetToolchainInfo
+       $(SED) 's,^\(LIBC_TYPE\)=.*,\1=$(PKG_NAME),' $(TOOLCHAIN_DIR)/info.mk
+       $(SED) 's,^\(LIBC_URL\)=.*,\1=http://www.gnu.org/software/libc/,' 
$(TOOLCHAIN_DIR)/info.mk
+       $(SED) 's,^\(LIBC_VERSION\)=.*,\1=$(PKG_VERSION),' 
$(TOOLCHAIN_DIR)/info.mk
+       $(SED) 's,^\(LIBC_SO_VERSION\)=.*,\1=$(PKG_VERSION),' 
$(TOOLCHAIN_DIR)/info.mk
+endef
+
+define Host/Configure
+       [ -f $(HOST_BUILD_DIR)/.autoconf ] || { \
+               cd $(HOST_BUILD_DIR); \
+               autoconf --force && \
+               touch $(HOST_BUILD_DIR)/.autoconf; \
+       }
+       mkdir -p $(CUR_BUILD_DIR)
+       ( cd $(CUR_BUILD_DIR); rm -f config.cache; \
+               $(GLIBC_CONFIGURE) \
+       );
+endef
+
+define Host/Prepare
+       $(call Host/Prepare/Default)
+       ln -snf $(PKG_SOURCE_SUBDIR) $(BUILD_DIR_TOOLCHAIN)/$(PKG_NAME)
+endef
+
+define Host/Clean
+       rm -rf $(CUR_BUILD_DIR)* \
+               $(BUILD_DIR_TOOLCHAIN)/$(LIBC)-dev \
+               $(BUILD_DIR_TOOLCHAIN)/$(PKG_NAME)
+endef
diff --git a/toolchain/glibc/headers/Makefile b/toolchain/glibc/headers/Makefile
new file mode 100644
index 0000000..f9f411b
--- /dev/null
+++ b/toolchain/glibc/headers/Makefile
@@ -0,0 +1,27 @@
+PATH_PREFIX:=..
+VARIANT:=headers
+
+include ../common.mk
+
+define Host/Compile
+
+endef
+
+define Host/Install
+       $(call Host/SetToolchainInfo)
+       mkdir -p $(BUILD_DIR_TOOLCHAIN)/$(LIBC)-dev/{include,lib}
+       $(MAKE) -C $(CUR_BUILD_DIR) \
+               BUILD_CFLAGS="$(HOST_CFLAGS)" \
+               install_root="$(BUILD_DIR_TOOLCHAIN)/$(LIBC)-dev" \
+               install-bootstrap-headers=yes \
+               install-headers
+       $(MAKE) -C $(CUR_BUILD_DIR) \
+               csu/subdir_lib
+       ( cd $(CUR_BUILD_DIR); \
+               $(CP) csu/crt1.o csu/crti.o csu/crtn.o 
$(BUILD_DIR_TOOLCHAIN)/$(LIBC)-dev/lib/ \
+       )
+       $(TARGET_CC) -nostdlib -nostartfiles -shared -x c /dev/null \
+               -o $(BUILD_DIR_TOOLCHAIN)/$(LIBC)-dev/lib/libc.so
+endef
+
+$(eval $(call HostBuild))
diff --git a/toolchain/glibc/include/libintl.h 
b/toolchain/glibc/include/libintl.h
new file mode 100644
index 0000000..69cb887
--- /dev/null
+++ b/toolchain/glibc/include/libintl.h
@@ -0,0 +1,6 @@
+#ifndef __FAKE_LIBINTL_H
+#define __FAKE_LIBINTL_H
+
+#define _(X) (X)
+
+#endif
-- 
1.9.1
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to