about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLluís Batlle i Rossell <viric@vicerveza.homeunix.net>2009-11-28 12:57:42 +0000
committerLluís Batlle i Rossell <viric@vicerveza.homeunix.net>2009-11-28 12:57:42 +0000
commit2b580b984614c17e14852ed702da4d6be5cae9c4 (patch)
tree68a0b2875adc3e08648c842e191ed0750557394c
parentf310356cbc4cebc9298b655d3cfcdf0d2c2b4bb0 (diff)
downloadnixlib-2b580b984614c17e14852ed702da4d6be5cae9c4.tar
nixlib-2b580b984614c17e14852ed702da4d6be5cae9c4.tar.gz
nixlib-2b580b984614c17e14852ed702da4d6be5cae9c4.tar.bz2
nixlib-2b580b984614c17e14852ed702da4d6be5cae9c4.tar.lz
nixlib-2b580b984614c17e14852ed702da4d6be5cae9c4.tar.xz
nixlib-2b580b984614c17e14852ed702da4d6be5cae9c4.tar.zst
nixlib-2b580b984614c17e14852ed702da4d6be5cae9c4.zip
Updating the perl-5.10 expression to support the bootstrapping stdenv better
- I still have not understood why it worked without this fix before, and I think
this has been triggered by the gcc-4.4, but I have not investigated this much. I
went with the trivial fix.

Adding a glibc-2.10.1 expression, because the glibc-2.11 still does not have
a ports release, so it cannot be used in arm. I'm using it only in native
compilation by now.

Making the default glibc to be 2.10 instead of 2.11 in armv5tel-linux.


svn path=/nixpkgs/branches/stdenv-updates/; revision=18688
-rw-r--r--pkgs/development/interpreters/perl-5.10/default.nix3
-rw-r--r--pkgs/development/libraries/glibc-2.10/binutils-2.20.patch42
-rw-r--r--pkgs/development/libraries/glibc-2.10/builder.sh33
-rw-r--r--pkgs/development/libraries/glibc-2.10/common.nix164
-rw-r--r--pkgs/development/libraries/glibc-2.10/default.nix51
-rw-r--r--pkgs/development/libraries/glibc-2.10/info.nix25
-rw-r--r--pkgs/development/libraries/glibc-2.10/locale-override.patch72
-rw-r--r--pkgs/development/libraries/glibc-2.10/locales.nix42
-rw-r--r--pkgs/development/libraries/glibc-2.10/localesbuilder.sh17
-rw-r--r--pkgs/development/libraries/glibc-2.10/nss-skip-unavail.patch25
-rw-r--r--pkgs/development/libraries/glibc-2.10/rpcgen-path.patch72
-rw-r--r--pkgs/development/libraries/glibc-2.10/stack-protector-link.patch12
-rw-r--r--pkgs/top-level/all-packages.nix11
13 files changed, 566 insertions, 3 deletions
diff --git a/pkgs/development/interpreters/perl-5.10/default.nix b/pkgs/development/interpreters/perl-5.10/default.nix
index 94fda842bb15..f5abffb26e22 100644
--- a/pkgs/development/interpreters/perl-5.10/default.nix
+++ b/pkgs/development/interpreters/perl-5.10/default.nix
@@ -57,7 +57,8 @@ stdenv.mkDerivation {
       ${if stdenv.system == "armv5tel-linux" then "-Dldflags=\"-lm -lrt\"" else ""};
     '';
 
-  preBuild = if (stdenv.gcc.nativeTools) then preBuildNative else preBuildNoNative;
+  preBuild = if (stdenv ? gcc && stdenv.gcc.nativeTools) then
+    preBuildNative else preBuildNoNative;
 
   setupHook = ./setup-hook.sh;
 }
diff --git a/pkgs/development/libraries/glibc-2.10/binutils-2.20.patch b/pkgs/development/libraries/glibc-2.10/binutils-2.20.patch
new file mode 100644
index 000000000000..ab3d6144d6ee
--- /dev/null
+++ b/pkgs/development/libraries/glibc-2.10/binutils-2.20.patch
@@ -0,0 +1,42 @@
+Support GNU Binutils 2.20 and beyond.  Patch from
+http://sourceware.org/ml/libc-alpha/2009-09/msg00009.html .
+
+diff --git a/configure b/configure
+index 48e6952..b1d84d7 100755
+--- a/configure
++++ b/configure
+@@ -4841,7 +4841,7 @@ $as_echo_n "checking version of $AS... " >&6; }
+   ac_prog_version=`$AS --version 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+   case $ac_prog_version in
+     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+-    2.1[3-9]*)
++    2.1[3-9]*|[2-9].[2-9]*)
+        ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+     *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+ 
+@@ -4904,7 +4904,7 @@ $as_echo_n "checking version of $LD... " >&6; }
+   ac_prog_version=`$LD --version 2>&1 | sed -n 's/^.*GNU ld.* \([0-9][0-9]*\.[0-9.]*\).*$/\1/p'`
+   case $ac_prog_version in
+     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+-    2.1[3-9]*)
++    2.1[3-9]*|[2-9].[2-9]*)
+        ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+     *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+ 
+diff --git a/configure.in b/configure.in
+index 4584afe..7c4f71f 100644
+--- a/configure.in
++++ b/configure.in
+@@ -897,10 +897,10 @@ AC_SUBST(MIG)dnl Needed by sysdeps/mach/configure.in
+ # Accept binutils 2.13 or newer.
+ AC_CHECK_PROG_VER(AS, $AS, --version,
+ 		  [GNU assembler.* \([0-9]*\.[0-9.]*\)],
+-		  [2.1[3-9]*], AS=: critic_missing="$critic_missing as")
++		  [2.1[3-9]*|[2-9].[2-9]*], AS=: critic_missing="$critic_missing as")
+ AC_CHECK_PROG_VER(LD, $LD, --version,
+ 		  [GNU ld.* \([0-9][0-9]*\.[0-9.]*\)],
+-		  [2.1[3-9]*], LD=: critic_missing="$critic_missing ld")
++		  [2.1[3-9]*|[2-9].[2-9]*], LD=: critic_missing="$critic_missing ld")
+ 
+ # We need the physical current working directory.  We cannot use the
+ # "pwd -P" shell builtin since that's not portable.  Instead we try to
diff --git a/pkgs/development/libraries/glibc-2.10/builder.sh b/pkgs/development/libraries/glibc-2.10/builder.sh
new file mode 100644
index 000000000000..fc1ea2f83eb8
--- /dev/null
+++ b/pkgs/development/libraries/glibc-2.10/builder.sh
@@ -0,0 +1,33 @@
+# Glibc cannot have itself in its RPATH.
+export NIX_NO_SELF_RPATH=1
+
+source $stdenv/setup
+
+postConfigure() {
+    # Hack: get rid of the `-static' flag set by the bootstrap stdenv.
+    # This has to be done *after* `configure' because it builds some
+    # test binaries.
+    export NIX_CFLAGS_LINK=
+    export NIX_LDFLAGS_BEFORE=
+
+    export NIX_DONT_SET_RPATH=1
+    unset CFLAGS
+}
+
+
+postInstall() {
+    if test -n "$installLocales"; then
+        make localedata/install-locales
+    fi
+    test -f $out/etc/ld.so.cache && rm $out/etc/ld.so.cache
+    (cd $out/include && ln -s $kernelHeaders/include/* .) || exit 1
+
+    # Fix for NIXOS-54 (ldd not working on x86_64).  Make a symlink
+    # "lib64" to "lib".
+    if test -n "$is64bit"; then
+        ln -s lib $out/lib64
+    fi
+}
+
+
+genericBuild
diff --git a/pkgs/development/libraries/glibc-2.10/common.nix b/pkgs/development/libraries/glibc-2.10/common.nix
new file mode 100644
index 000000000000..87fa4aea0f15
--- /dev/null
+++ b/pkgs/development/libraries/glibc-2.10/common.nix
@@ -0,0 +1,164 @@
+/* Build configuration used to build glibc, Info files, and locale
+   information.  */
+
+{ name, fetchurl, stdenv, installLocales ? false
+, cross ? null, gccCross ? null, kernelHeaders ? null
+, profilingLibraries ? false, meta, ... }@args :
+
+let version = "2.10.1";
+in
+assert (cross != null) -> (gccCross != null);
+
+stdenv.mkDerivation ({
+  inherit kernelHeaders installLocales;
+
+  # The host/target system.
+  crossConfig = if (cross != null) then cross.config else null;
+
+  inherit (stdenv) is64bit;
+
+  patches = [
+    /* Fix for NIXPKGS-79: when doing host name lookups, when
+       nsswitch.conf contains a line like
+
+         hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
+
+       don't return an error when mdns4_minimal can't be found.  This
+       is a bug in Glibc: when a service can't be found, NSS should
+       continue to the next service unless "UNAVAIL=return" is set.
+       ("NOTFOUND=return" refers to the service returning a NOTFOUND
+       error, not the service itself not being found.)  The reason is
+       that the "status" variable (while initialised to UNAVAIL) is
+       outside of the loop that iterates over the services, the
+       "files" service sets status to NOTFOUND.  So when the call to
+       find "mdns4_minimal" fails, "status" will still be NOTFOUND,
+       and it will return instead of continuing to "dns".  Thus, the
+       line
+
+         hosts: mdns4_minimal [NOTFOUND=return] dns mdns4
+
+       does work because "status" will contain UNAVAIL after the
+       failure to find mdns4_minimal. */
+    ./nss-skip-unavail.patch
+
+    /* Make it possible to override the locale-archive in NixOS. */
+    ./locale-override.patch
+
+    /* Have rpcgen(1) look for cpp(1) in $PATH.  */
+    ./rpcgen-path.patch
+
+    /* Make sure `nscd' et al. are linked against `libssp'.  */
+    ./stack-protector-link.patch
+
+    /* Allow binutils 2.20 to be used (patch on its version checking) */
+    ./binutils-2.20.patch
+  ];
+
+  configureFlags = [
+    "-C"
+    "--enable-add-ons"
+    (if kernelHeaders != null
+     then "--with-headers=${kernelHeaders}/include"
+     else "--without-headers")
+    (if profilingLibraries
+     then "--enable-profile"
+     else "--disable-profile")
+  ] ++ stdenv.lib.optionals (cross != null) [
+    "--with-tls"
+    "--enable-kernel=2.6.0"
+    "--without-fp"
+    "--with-__thread"
+  ] ++ (if (stdenv.system == "armv5tel-linux") then [
+    "--host=arm-linux-gnueabi"
+    "--build=arm-linux-gnueabi"
+    "--without-fp"
+  ] else []);
+
+  buildInputs = stdenv.lib.optionals (cross != null) [ gccCross ];
+
+  # Needed to install share/zoneinfo/zone.tab.  Set to impure /bin/sh to
+  # prevent a retained dependency on the bootstrap tools in the stdenv-linux
+  # bootstrap.
+  BASH_SHELL = "/bin/sh";
+}
+
+//
+
+(if (stdenv.system == "i686-linux")
+ then {
+   # Workaround for this bug:
+   #   http://sourceware.org/bugzilla/show_bug.cgi?id=411
+   # I.e. when gcc is compiled with --with-arch=i686, then the
+   # preprocessor symbol `__i686' will be defined to `1'.  This causes
+   # the symbol __i686.get_pc_thunk.dx to be mangled.
+   NIX_CFLAGS_COMPILE = "-U__i686";
+ }
+ else {})
+
+ //
+
+ args
+
+ //
+
+{
+  name = args.name + "-${version}" +
+    stdenv.lib.optionalString (cross != null) "-${cross.config}";
+
+  src = fetchurl {
+    url = "mirror://gnu/glibc/glibc-${version}.tar.bz2";
+    sha256 = "0rz67p3zy3hj1pbcx8qjwnh926d412zs51ss82232qdbgrikxbfb";
+  };
+
+  srcPorts = fetchurl {
+    url = "mirror://gnu/glibc/glibc-ports-${version}.tar.bz2";
+    sha256 = "0wa0mdsfv0b97a0vbmc3l1258lq2y7p7i14bb4rklsh342byrwdi";
+  };
+
+  # `fetchurl' is a function and thus should not be passed to the
+  # `derivation' primitive.
+  fetchurl = null;
+
+  # Remove absolute paths from `configure' & co.; build out-of-tree.
+  preConfigure = ''
+    export PWD_P=$(type -tP pwd)
+    for i in configure io/ftwtest-sh; do
+        # Can't use substituteInPlace here because replace hasn't been
+        # built yet in the bootstrap.
+        sed -i "$i" -e "s^/bin/pwd^$PWD_P^g"
+    done
+
+    tar xvjf "$srcPorts"
+
+    mkdir ../build
+    cd ../build
+
+    configureScript="../$sourceRoot/configure"
+
+    ${if args ? preConfigure
+      then args.preConfigure
+      else ""}
+  '';
+
+  meta = ({
+      homepage = http://www.gnu.org/software/libc/;
+      description = "The GNU C Library";
+
+      longDescription =
+        '' Any Unix-like operating system needs a C library: the library which
+           defines the "system calls" and other basic facilities such as
+           open, malloc, printf, exit...
+
+           The GNU C library is used as the C library in the GNU system and
+           most systems with the Linux kernel.
+        '';
+
+      license = "LGPLv2+";
+
+      maintainers = [ stdenv.lib.maintainers.ludo ];
+      platforms = stdenv.lib.platforms.linux;
+    }
+    //
+    args.meta
+  );
+})
diff --git a/pkgs/development/libraries/glibc-2.10/default.nix b/pkgs/development/libraries/glibc-2.10/default.nix
new file mode 100644
index 000000000000..48f1a12c058a
--- /dev/null
+++ b/pkgs/development/libraries/glibc-2.10/default.nix
@@ -0,0 +1,51 @@
+{ stdenv, fetchurl, kernelHeaders
+, installLocales ? true
+, profilingLibraries ? false
+, gccCross ? null
+}:
+
+let
+  build = import ./common.nix;
+  cross = if gccCross != null then gccCross.target else null;
+in
+  build ({
+    name = "glibc";
+
+    inherit fetchurl stdenv kernelHeaders installLocales profilingLibraries
+      cross;
+
+    builder = ./builder.sh;
+
+    preInstall = ''
+      ensureDir $out/lib
+      ln -s ${stdenv.gcc.gcc}/lib/libgcc_s.so.1 $out/lib/libgcc_s.so.1
+    '';
+
+    postInstall = ''
+      rm $out/lib/libgcc_s.so.1
+    '';
+
+    meta.description = "The GNU C Library";
+  }
+
+  //
+
+  (if cross != null
+   then {
+      preConfigure = ''
+        sed -i s/-lgcc_eh//g "../$sourceRoot/Makeconfig"
+
+        cat > config.cache << "EOF"
+libc_cv_forced_unwind=yes
+libc_cv_c_cleanup=yes
+libc_cv_gnu89_inline=yes
+EOF
+        export BUILD_CC=gcc
+        export CC="$crossConfig-gcc"
+        export AR="$crossConfig-ar"
+        export RANLIB="$crossConfig-ranlib"
+
+        dontStrip = 1
+      '';
+   }
+   else {}))
diff --git a/pkgs/development/libraries/glibc-2.10/info.nix b/pkgs/development/libraries/glibc-2.10/info.nix
new file mode 100644
index 000000000000..926598b37603
--- /dev/null
+++ b/pkgs/development/libraries/glibc-2.10/info.nix
@@ -0,0 +1,25 @@
+{ stdenv, fetchurl, texinfo, perl }:
+
+let build = import ./common.nix;
+in
+  build {
+    name = "glibc-info";
+
+    inherit fetchurl stdenv;
+
+    configureFlags = [ "--enable-add-ons" ];
+
+    buildInputs = [ texinfo perl ];
+
+    buildPhase = "make info";
+
+    # I don't know why the info is not generated in 'build'
+    # Somehow building the info still does not work, because the final
+    # libc.info hasn't a Top node.
+    installPhase = ''
+      ensureDir "$out/share/info"
+      cp -v "../$sourceRoot/manual/"*.info* "$out/share/info"
+    '';
+
+    meta.description = "GNU Info manual of the GNU C Library";
+  }
diff --git a/pkgs/development/libraries/glibc-2.10/locale-override.patch b/pkgs/development/libraries/glibc-2.10/locale-override.patch
new file mode 100644
index 000000000000..108d0e35dacf
--- /dev/null
+++ b/pkgs/development/libraries/glibc-2.10/locale-override.patch
@@ -0,0 +1,72 @@
+diff -rc glibc-2.9-20081208-orig/locale/loadarchive.c glibc-2.9-20081208/locale/loadarchive.c
+*** glibc-2.9-20081208-orig/locale/loadarchive.c	2005-09-09 18:56:52.000000000 +0200
+--- glibc-2.9-20081208/locale/loadarchive.c	2009-04-19 13:54:26.000000000 +0200
+***************
+*** 124,129 ****
+--- 124,142 ----
+  }
+  
+  
++ static int
++ open_locale_archive ()
++ {
++   int fd = -1;
++   char *path = getenv ("LOCALE_ARCHIVE");
++   if (path)
++     fd = open_not_cancel_2 (path, O_RDONLY|O_LARGEFILE);
++   if (fd < 0)
++     fd = open_not_cancel_2 (archfname, O_RDONLY|O_LARGEFILE);
++   return fd;
++ }
++ 
++ 
+  /* Find the locale *NAMEP in the locale archive, and return the
+     internalized data structure for its CATEGORY data.  If this locale has
+     already been loaded from the archive, just returns the existing data
+***************
+*** 203,209 ****
+        archmapped = &headmap;
+  
+        /* The archive has never been opened.  */
+!       fd = open_not_cancel_2 (archfname, O_RDONLY|O_LARGEFILE);
+        if (fd < 0)
+  	/* Cannot open the archive, for whatever reason.  */
+  	return NULL;
+--- 216,222 ----
+        archmapped = &headmap;
+  
+        /* The archive has never been opened.  */
+!       fd = open_locale_archive ();
+        if (fd < 0)
+  	/* Cannot open the archive, for whatever reason.  */
+  	return NULL;
+***************
+*** 394,400 ****
+  	  if (fd == -1)
+  	    {
+  	      struct stat64 st;
+! 	      fd = open_not_cancel_2 (archfname, O_RDONLY|O_LARGEFILE);
+  	      if (fd == -1)
+  		/* Cannot open the archive, for whatever reason.  */
+  		return NULL;
+--- 407,413 ----
+  	  if (fd == -1)
+  	    {
+  	      struct stat64 st;
+! 	      fd = open_locale_archive ();
+  	      if (fd == -1)
+  		/* Cannot open the archive, for whatever reason.  */
+  		return NULL;
+diff -rc glibc-2.9-20081208-orig/sysdeps/generic/unsecvars.h glibc-2.9-20081208/sysdeps/generic/unsecvars.h
+*** glibc-2.9-20081208-orig/sysdeps/generic/unsecvars.h	2006-10-11 18:24:05.000000000 +0200
+--- glibc-2.9-20081208/sysdeps/generic/unsecvars.h	2009-04-19 13:55:34.000000000 +0200
+***************
+*** 16,21 ****
+--- 16,22 ----
+    "LD_SHOW_AUXV\0"							      \
+    "LD_USE_LOAD_BIAS\0"							      \
+    "LOCALDOMAIN\0"							      \
++   "LOCALE_ARCHIVE\0"							      \
+    "LOCPATH\0"								      \
+    "MALLOC_TRACE\0"							      \
+    "NIS_PATH\0"								      \
diff --git a/pkgs/development/libraries/glibc-2.10/locales.nix b/pkgs/development/libraries/glibc-2.10/locales.nix
new file mode 100644
index 000000000000..64e6bd43a671
--- /dev/null
+++ b/pkgs/development/libraries/glibc-2.10/locales.nix
@@ -0,0 +1,42 @@
+/* This function builds just the `lib/locale/locale-archive' file from
+   Glibc and nothing else.  If `allLocales' is true, all supported
+   locales are included; otherwise, just the locales listed in
+   `locales'.  See localedata/SUPPORTED in the Glibc source tree for
+   the list of all supported locales:
+   http://sourceware.org/cgi-bin/cvsweb.cgi/libc/localedata/SUPPORTED?cvsroot=glibc
+*/
+
+{ stdenv, fetchurl, allLocales ? true, locales ? ["en_US.UTF-8/UTF-8"] }:
+
+let build = import ./common.nix;
+in
+  build {
+    name = "glibc-locales";
+
+    inherit fetchurl stdenv;
+    installLocales = true;
+
+    builder = ./localesbuilder.sh;
+
+    # Awful hack: `localedef' doesn't allow the path to `locale-archive'
+    # to be overriden, but you *can* specify a prefix, i.e. it will use
+    # <prefix>/<path-to-glibc>/lib/locale/locale-archive.  So we use
+    # $TMPDIR as a prefix, meaning that the locale-archive is placed in
+    # $TMPDIR/nix/store/...-glibc-.../lib/locale/locale-archive.
+    buildPhase =
+      ''
+        mkdir -p $TMPDIR/"$(dirname $(readlink -f $(type -p localedef)))/../lib/locale"
+        make localedata/install-locales \
+            LOCALEDEF="localedef --prefix=$TMPDIR" \
+            localedir=$out/lib/locale \
+            ${if allLocales then "" else "SUPPORTED-LOCALES=\"${toString locales}\""}
+      '';
+
+    installPhase =
+      ''
+        ensureDir "$out/lib/locale"
+        cp -v "$TMPDIR/nix/store/"*"/lib/locale/locale-archive" "$out/lib/locale"
+      '';
+
+    meta.description = "Locale information for the GNU C Library";
+  }
diff --git a/pkgs/development/libraries/glibc-2.10/localesbuilder.sh b/pkgs/development/libraries/glibc-2.10/localesbuilder.sh
new file mode 100644
index 000000000000..d732e208fa22
--- /dev/null
+++ b/pkgs/development/libraries/glibc-2.10/localesbuilder.sh
@@ -0,0 +1,17 @@
+# Glibc cannot have itself in its RPATH.
+export NIX_NO_SELF_RPATH=1
+
+source $stdenv/setup
+
+postConfigure() {
+    # Hack: get rid of the `-static' flag set by the bootstrap stdenv.
+    # This has to be done *after* `configure' because it builds some
+    # test binaries.
+    export NIX_CFLAGS_LINK=
+    export NIX_LDFLAGS_BEFORE=
+
+    export NIX_DONT_SET_RPATH=1
+    unset CFLAGS
+}
+
+genericBuild
diff --git a/pkgs/development/libraries/glibc-2.10/nss-skip-unavail.patch b/pkgs/development/libraries/glibc-2.10/nss-skip-unavail.patch
new file mode 100644
index 000000000000..dc09b5098707
--- /dev/null
+++ b/pkgs/development/libraries/glibc-2.10/nss-skip-unavail.patch
@@ -0,0 +1,25 @@
+diff -rc glibc-2.9-20081208-orig/sysdeps/posix/getaddrinfo.c glibc-2.9-20081208/sysdeps/posix/getaddrinfo.c
+*** glibc-2.9-20081208-orig/sysdeps/posix/getaddrinfo.c	2008-07-30 21:14:22.000000000 +0200
+--- glibc-2.9-20081208/sysdeps/posix/getaddrinfo.c	2008-12-10 11:39:32.000000000 +0100
+***************
+*** 505,512 ****
+  	  int no_data = 0;
+  	  int no_inet6_data = 0;
+  	  service_user *nip = NULL;
+- 	  enum nss_status inet6_status = NSS_STATUS_UNAVAIL;
+- 	  enum nss_status status = NSS_STATUS_UNAVAIL;
+  	  int no_more;
+  	  int old_res_options;
+  
+--- 505,510 ----
+***************
+*** 702,707 ****
+--- 700,707 ----
+  
+  	  while (!no_more)
+  	    {
++ 	      enum nss_status inet6_status = NSS_STATUS_UNAVAIL;
++ 	      enum nss_status status = NSS_STATUS_UNAVAIL;
+  	      nss_gethostbyname4_r fct4
+  		= __nss_lookup_function (nip, "gethostbyname4_r");
+  	      if (fct4 != NULL)
diff --git a/pkgs/development/libraries/glibc-2.10/rpcgen-path.patch b/pkgs/development/libraries/glibc-2.10/rpcgen-path.patch
new file mode 100644
index 000000000000..fbb03dd5fade
--- /dev/null
+++ b/pkgs/development/libraries/glibc-2.10/rpcgen-path.patch
@@ -0,0 +1,72 @@
+By default, rpcgen(1) looks for cpp(1) from a list of fixed absolute paths
+(`/lib/cpp', etc.), which may only be overrided with the `-Y' option.  This
+patch makes it run any `cpp' command found in $PATH.
+
+--- glibc-2.7/sunrpc/rpc_main.c	2006-11-10 21:54:46.000000000 +0100
++++ glibc-2.7/sunrpc/rpc_main.c	2009-04-22 14:32:10.000000000 +0200
+@@ -79,7 +79,7 @@ static const char *cmdname;
+ 
+ static const char *svcclosetime = "120";
+ static int cppDefined;	/* explicit path for C preprocessor */
+-static const char *CPP = SUNOS_CPP;
++static const char *CPP = "cpp";
+ static const char CPPFLAGS[] = "-C";
+ static char *pathbuf;
+ static int cpp_pid;
+@@ -108,7 +108,6 @@ static char *extendfile (const char *fil
+ static void open_output (const char *infile, const char *outfile);
+ static void add_warning (void);
+ static void clear_args (void);
+-static void find_cpp (void);
+ static void open_input (const char *infile, const char *define);
+ static int check_nettype (const char *name, const char *list_to_check[]);
+ static void c_output (const char *infile, const char *define,
+@@ -327,31 +326,6 @@ clear_args (void)
+   argcount = FIXEDARGS;
+ }
+ 
+-/* make sure that a CPP exists */
+-static void
+-find_cpp (void)
+-{
+-  struct stat buf;
+-
+-  if (stat (CPP, &buf) < 0)
+-    {				/* /lib/cpp or explicit cpp does not exist */
+-      if (cppDefined)
+-	{
+-	  fprintf (stderr, _ ("cannot find C preprocessor: %s \n"), CPP);
+-	  crash ();
+-	}
+-      else
+-	{			/* try the other one */
+-	  CPP = SVR4_CPP;
+-	  if (stat (CPP, &buf) < 0)
+-	    {			/* can't find any cpp */
+-	      fputs (_ ("cannot find any C preprocessor (cpp)\n"), stdout);
+-	      crash ();
+-	    }
+-	}
+-    }
+-}
+-
+ /*
+  * Open input file with given define for C-preprocessor
+  */
+@@ -370,7 +344,6 @@ open_input (const char *infile, const ch
+   switch (cpp_pid)
+     {
+     case 0:
+-      find_cpp ();
+       putarg (0, CPP);
+       putarg (1, CPPFLAGS);
+       addarg (define);
+@@ -380,7 +353,7 @@ open_input (const char *infile, const ch
+       close (1);
+       dup2 (pd[1], 1);
+       close (pd[0]);
+-      execv (arglist[0], (char **) arglist);
++      execvp (arglist[0], (char **) arglist);
+       perror ("execv");
+       exit (1);
+     case -1:
diff --git a/pkgs/development/libraries/glibc-2.10/stack-protector-link.patch b/pkgs/development/libraries/glibc-2.10/stack-protector-link.patch
new file mode 100644
index 000000000000..d200ece52df7
--- /dev/null
+++ b/pkgs/development/libraries/glibc-2.10/stack-protector-link.patch
@@ -0,0 +1,12 @@
+Make sure `nscd' et al. are linked against `libssp'.
+
+--- glibc-2.11/nscd/Makefile	2009-10-30 18:17:08.000000000 +0100
++++ glibc-2.11/nscd/Makefile	2009-11-22 01:19:37.000000000 +0100
+@@ -126,6 +126,7 @@ CFLAGS-res_hconf.c += $(nscd-cflags)
+ ifeq (yesyes,$(have-fpie)$(build-shared))
+ relro-LDFLAGS += -Wl,-z,now
+ 
++$(objpfx)nscd: LDFLAGS += -lssp
+ $(objpfx)nscd: $(addprefix $(objpfx),$(nscd-modules:=.o))
+ 	$(+link-pie)
+ endif
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index f08bcc3c6474..f1c2953a4b77 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -3417,7 +3417,9 @@ let
     let haveRedHatKernel       = system == "i686-linux" || system == "x86_64-linux";
         haveBrokenRedHatKernel = haveRedHatKernel && getConfig ["brokenRedHatKernel"] false;
     in
-    useFromStdenv "glibc" (if haveBrokenRedHatKernel then glibc25 else glibc211);
+    useFromStdenv "glibc" (if haveBrokenRedHatKernel then glibc25 else
+      # glibc211 does not have ports still.
+      if (system == "armv5tel-linux") then glibc210 else glibc211);
 
   glibc25 = import ../development/libraries/glibc-2.5 {
     inherit fetchurl stdenv kernelHeaders;
@@ -3443,6 +3445,11 @@ let
 
   glibcCross = cross: glibc29Cross cross;
 
+  glibc210 = makeOverridable (import ../development/libraries/glibc-2.10) {
+    inherit fetchurl stdenv kernelHeaders;
+    installLocales = getPkgConfig "glibc" "locales" false;
+  };
+
   glibc211 = makeOverridable (import ../development/libraries/glibc-2.11) {
     inherit fetchurl stdenv kernelHeaders;
     installLocales = getPkgConfig "glibc" "locales" false;
@@ -3462,7 +3469,7 @@ let
     installLocales = getPkgConfig "glibc" "locales" false;
   };
 
-  glibcLocales = makeOverridable (import ../development/libraries/glibc-2.11/locales.nix) {
+  glibcLocales = makeOverridable (import ../development/libraries/glibc-2.10/locales.nix) {
     inherit fetchurl stdenv;
   };