summary refs log tree commit diff
diff options
context:
space:
mode:
authorLluís Batlle i Rossell <viric@vicerveza.homeunix.net>2009-12-04 13:35:58 +0000
committerLluís Batlle i Rossell <viric@vicerveza.homeunix.net>2009-12-04 13:35:58 +0000
commit4164de326abf88b35bbd3f2799599fa6f9f72446 (patch)
tree5f479447947c9075af16b33ede435fd938e1d7cd
parente9abf7bb0cdc5bb93c4641372f2ae907691b05a4 (diff)
downloadnixpkgs-4164de326abf88b35bbd3f2799599fa6f9f72446.tar
nixpkgs-4164de326abf88b35bbd3f2799599fa6f9f72446.tar.gz
nixpkgs-4164de326abf88b35bbd3f2799599fa6f9f72446.tar.bz2
nixpkgs-4164de326abf88b35bbd3f2799599fa6f9f72446.tar.lz
nixpkgs-4164de326abf88b35bbd3f2799599fa6f9f72446.tar.xz
nixpkgs-4164de326abf88b35bbd3f2799599fa6f9f72446.tar.zst
nixpkgs-4164de326abf88b35bbd3f2799599fa6f9f72446.zip
Making the cross-builds work with uclibc. There is no easy way of switching
between uclibc/glibc still.
I started the renaming from glibc to libc regarding the cross-toolchain, but I
still have to finish.


svn path=/nixpkgs/branches/stdenv-updates/; revision=18801
-rw-r--r--pkgs/development/compilers/gcc-4.3/default.nix2
-rw-r--r--pkgs/os-specific/linux/uclibc/default.nix53
-rw-r--r--pkgs/top-level/all-packages.nix16
3 files changed, 55 insertions, 16 deletions
diff --git a/pkgs/development/compilers/gcc-4.3/default.nix b/pkgs/development/compilers/gcc-4.3/default.nix
index 2fd4198d955..58c83f091f1 100644
--- a/pkgs/development/compilers/gcc-4.3/default.nix
+++ b/pkgs/development/compilers/gcc-4.3/default.nix
@@ -72,7 +72,7 @@ stdenv.mkDerivation ({
     });
     
   patches =
-    [./pass-cxxcpp.patch]
+    [./pass-cxxcpp.patch ./libmudflap-cpp.patch]
     ++ optional noSysDirs ./no-sys-dirs.patch
     ++ optional (noSysDirs && langFortran) ./no-sys-dirs-fortran.patch
     ++ optional langJava ./java-jvgenmain-link.patch;
diff --git a/pkgs/os-specific/linux/uclibc/default.nix b/pkgs/os-specific/linux/uclibc/default.nix
index 33914eea3d6..92cc4e99721 100644
--- a/pkgs/os-specific/linux/uclibc/default.nix
+++ b/pkgs/os-specific/linux/uclibc/default.nix
@@ -1,35 +1,66 @@
-{stdenv, fetchurl, kernelHeaders}:
+{stdenv, fetchurl, kernelHeaders, gccCross ? null}:
 
 assert stdenv.isLinux;
 
+let
+    target = if (gccCross != null) then gccCross.target else null;
+    enableArmEABI = (target == null && stdenv.system "armv5tel-linux")
+      || (target != null && target.arch == "arm");
+
+    configArmEABI = if enableArmEABI then
+        ''-e 's/.*CONFIG_ARM_OABI.*//' \
+        -e 's/.*CONFIG_ARM_EABI.*/CONFIG_ARM_EABI=y/' '' else "";
+
+    enableBigEndian = (target != null && target.bigEndian);
+    
+    configBigEndian = if enableBigEndian then ""
+      else
+        ''-e 's/.*ARCH_BIG_ENDIAN.*/#ARCH_BIG_ENDIAN=y/' \
+        -e 's/.*ARCH_WANTS_BIG_ENDIAN.*/#ARCH_WANTS_BIG_ENDIAN=y/' \
+        -e 's/.*ARCH_WANTS_LITTLE_ENDIAN.*/ARCH_WANTS_LITTLE_ENDIAN=y/' '';
+
+    archMakeFlag = if (target != null) then "ARCH=${target.arch}" else "";
+    crossMakeFlag = if (target != null) then "CROSS=${target.config}-" else "";
+in
 stdenv.mkDerivation {
-  name = "uclibc-0.9.30.1";
+  name = "uclibc-0.9.30.1" + stdenv.lib.optionalString (target != null)
+    ("-" + target.config);
+
   src = fetchurl {
     url = http://www.uclibc.org/downloads/uClibc-0.9.30.1.tar.bz2;
     sha256 = "132cf27hkgi0q4qlwbiyj4ffj76sja0jcxm0aqzzgks65jh6k5rd";
   };
 
   configurePhase = ''
-    make defconfig
-    sed -e s@/usr/include@${kernelHeaders}@ \
+    make defconfig ${archMakeFlag}
+    sed -e s@/usr/include@${kernelHeaders}/include@ \
       -e 's@^RUNTIME_PREFIX.*@RUNTIME_PREFIX="/"@' \
       -e 's@^DEVEL_PREFIX.*@DEVEL_PREFIX="/"@' \
-      ${if stdenv.system=="armv5tel-linux" then
-      ''-e 's/.*CONFIG_ARM_OABI.*//' \
-        -e 's/.*CONFIG_ARM_EABI.*/CONFIG_ARM_EABI=y/' \
-        -e 's/.*ARCH_BIG_ENDIAN.*/#ARCH_BIG_ENDIAN=y/' \
-        -e 's/.*ARCH_WANTS_BIG_ENDIAN.*/#ARCH_WANTS_BIG_ENDIAN=y/' \
-        -e 's/.*ARCH_WANTS_LITTLE_ENDIAN.*/ARCH_WANTS_LITTLE_ENDIAN=y/' '' else ""} \
+      -e 's@.*UCLIBC_HAS_WCHAR.*@UCLIBC_HAS_WCHAR=y@' \
+      -e 's@.*DO_C99_MATH.*@DO_C99_MATH=y@' \
+      ${configArmEABI} \
+      ${configBigEndian} \
       -i .config
     make oldconfig
   '';
 
+  # Cross stripping hurts.
+  dontStrip = if (target != null) then true else false;
+
+  makeFlags = [ crossMakeFlag "VERBOSE=1" ];
+
+  buildInputs = stdenv.lib.optional (gccCross != null) gccCross;
+
   patches = [ ./unifdef-getline.patch ];
 
+  # This will allow the usual gcc-cross-wrapper strip phase work as usual
+  crossConfig = if (target != null) then target.config else null;
+
   installPhase = ''
     mkdir -p $out
-    make PREFIX=$out install
+    make PREFIX=$out VERBOSE=1 install ${crossMakeFlag}
     (cd $out/include && ln -s ${kernelHeaders}/include/* .) || exit 1
+    sed -i s@/lib/@$out/lib/@g $out/lib/libc.so
   '';
   
   meta = {
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 0413a0af217..18cd0c90651 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -1784,7 +1784,7 @@ let
   gcc43_realCross = cross : makeOverridable (import ../development/compilers/gcc-4.3) {
     inherit stdenv fetchurl texinfo gmp mpfr noSysDirs cross;
     binutilsCross = binutilsCross cross;
-    glibcCross = glibcCross cross;
+    glibcCross = libcCross cross;
     profiledCompiler = false;
     enableMultilib = true;
     crossStageStatic = false;
@@ -1794,7 +1794,7 @@ let
     inherit stdenv fetchurl texinfo gmp mpfr ppl cloogppl noSysDirs cross
         gettext which;
     binutilsCross = binutilsCross cross;
-    glibcCross = glibcCross cross;
+    glibcCross = libcCross cross;
     profiledCompiler = false;
     enableMultilib = true;
     crossStageStatic = false;
@@ -1813,7 +1813,7 @@ let
 
   gccCrossStageFinal = cross: wrapGCCCross {
     gcc = forceBuildDrv (gcc43_realCross cross);
-    libc = glibcCross cross;
+    libc = libcCross cross;
     binutils = binutilsCross cross;
     inherit cross;
   };
@@ -3483,7 +3483,9 @@ let
     installLocales = getPkgConfig "glibc" "locales" false;
   });
 
-  glibcCross = cross: glibc211Cross cross;
+  # We can choose:
+  # glibcCross = cross: glibc211Cross cross;
+  libcCross = cross: uclibcCross cross;
 
   eglibc = import ../development/libraries/eglibc {
     inherit fetchsvn stdenv kernelHeaders;
@@ -6029,6 +6031,12 @@ let
     inherit fetchurl stdenv kernelHeaders;
   };
 
+  uclibcCross = target: import ../os-specific/linux/uclibc {
+    inherit fetchurl stdenv;
+    kernelHeaders = kernelHeadersCross target;
+    gccCross = gccCrossStageStatic target;
+  };
+
   udev = makeOverridable (import ../os-specific/linux/udev) {
     inherit fetchurl stdenv gperf pkgconfig acl libusb usbutils pciutils glib;
   };