From b1b7266aa3d2e7023ad1b55ee7edc6a93f87ea53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Llu=C3=ADs=20Batlle=20i=20Rossell?= Date: Sat, 27 Feb 2010 00:52:48 +0000 Subject: [PATCH] After some testing with an ultrasparc cross-compiler: Updating the cross-build expressions, adding some flexibility. Updated the linux headers used cross building, as 2.6.28 had bugs on endianness in sparc64. There were, as usual some bugs in gcc. Maybe not many make a cross compiler to ultrasparc. For the record, I could build an ultrasparc kernel with this base nix: import /etc/nixos/nixpkgs/default.nix # The root nixpkgs default.nix { crossSystem = { config = "sparc64-unknown-linux"; bigEndian = true; arch = "sparc64"; float = "soft"; withTLS = true; cpu = "ultrasparc"; }; config = pkgs: { packageOverrides = pkgs : { platform = { name = "sparc64"; kernelHeadersBaseConfig = "sparc64_defconfig"; kernelBaseConfig = "sparc64_defconfig"; kernelArch = "sparc"; kernelAutoModules = false; kernelTarget = "zImage"; uboot = null; }; }; }; } Although it did not boot directly in qemu-system-sparc64: [sparc64] Kernel already loaded Unhandled Exception 0x0000000000000020 PC = 0x0000000000404000 NPC = 0x0000000000404004 svn path=/nixpkgs/trunk/; revision=20269 --- pkgs/development/compilers/gcc-4.4/default.nix | 3 +++ pkgs/development/libraries/glibc-2.11/common.nix | 4 ++-- pkgs/development/libraries/glibc-2.11/default.nix | 2 ++ pkgs/os-specific/linux/kernel-headers/2.6.32.nix | 11 ++++++----- pkgs/top-level/all-packages.nix | 9 ++++++--- pkgs/top-level/release.nix | 1 + 6 files changed, 20 insertions(+), 10 deletions(-) diff --git a/pkgs/development/compilers/gcc-4.4/default.nix b/pkgs/development/compilers/gcc-4.4/default.nix index 3ae45592fd5..358e5212407 100644 --- a/pkgs/development/compilers/gcc-4.4/default.nix +++ b/pkgs/development/compilers/gcc-4.4/default.nix @@ -57,8 +57,11 @@ let version = "4.4.3"; javaAwtGtk = langJava && gtk != null; + withCPU = if cross ? cpu then " --with-cpu=${cross.cpu}" else ""; + crossConfigureFlags = "--target=${cross.config}" + + withCPU + (if crossStageStatic then " --disable-libssp --disable-nls" + " --without-headers" + diff --git a/pkgs/development/libraries/glibc-2.11/common.nix b/pkgs/development/libraries/glibc-2.11/common.nix index 2fd3fbcbab9..77a89f74490 100644 --- a/pkgs/development/libraries/glibc-2.11/common.nix +++ b/pkgs/development/libraries/glibc-2.11/common.nix @@ -67,9 +67,9 @@ stdenv.mkDerivation ({ then "--enable-profile" else "--disable-profile") ] ++ stdenv.lib.optionals (cross != null) [ - "--with-tls" + (if cross.withTLS then "--with-tls" else "--without-tls") + (if cross.float == "float" then "--without-fp" else "--with-fp") "--enable-kernel=2.6.0" - "--without-fp" "--with-__thread" ] ++ stdenv.lib.optionals (stdenv.system == "armv5tel-linux") [ "--host=arm-linux-gnueabi" diff --git a/pkgs/development/libraries/glibc-2.11/default.nix b/pkgs/development/libraries/glibc-2.11/default.nix index c638e0bcf70..32c37aaac34 100644 --- a/pkgs/development/libraries/glibc-2.11/default.nix +++ b/pkgs/development/libraries/glibc-2.11/default.nix @@ -46,6 +46,8 @@ in libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes libc_cv_gnu89_inline=yes + # Only due to a problem in gcc configure scripts: + libc_cv_sparc64_tls=${if cross.withTLS then "yes" else "no"} EOF export BUILD_CC=gcc export CC="$crossConfig-gcc" diff --git a/pkgs/os-specific/linux/kernel-headers/2.6.32.nix b/pkgs/os-specific/linux/kernel-headers/2.6.32.nix index a09ad98c85c..dbc6797934d 100644 --- a/pkgs/os-specific/linux/kernel-headers/2.6.32.nix +++ b/pkgs/os-specific/linux/kernel-headers/2.6.32.nix @@ -1,21 +1,21 @@ -{stdenv, fetchurl, perl, cross ? null}: +{stdenv, fetchurl, perl, cross ? null, platform}: -assert stdenv.isLinux; +assert cross == null -> stdenv.isLinux; -let version = "2.6.32.4"; in +let version = "2.6.32.9"; in stdenv.mkDerivation { name = "linux-headers-${version}"; src = fetchurl { url = "mirror://kernel/linux/kernel/v2.6/linux-${version}.tar.bz2"; - sha256 = "1n8pj05sazxv1dgi68q61lrvrnzvvx61qqw6kx80vqizqanz97z1"; + sha256 = "1g6hs7j5kmifb3phbnckdmrnxd0cpqrijnnbry86z26npsh9my7l"; }; targetConfig = if (cross != null) then cross.config else null; platform = - if cross != null then cross.arch else + if cross != null then platform.kernelArch else if stdenv.system == "i686-linux" then "i386" else if stdenv.system == "x86_64-linux" then "x86_64" else if stdenv.system == "powerpc-linux" then "powerpc" else @@ -33,6 +33,7 @@ stdenv.mkDerivation { if test -n "$targetConfig"; then export ARCH=$platform fi + make ${platform.kernelHeadersBaseConfig} make mrproper headers_check ''; diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index d4ec90bfae1..bec3c8aeaef 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -1967,7 +1967,9 @@ let binutilsCross = binutilsCross cross; libcCross = libcCross cross; profiledCompiler = false; - enableMultilib = true; + enableMultilib = false; + # cross-building for ultrasparc in 4.4.3 will require disabling shared due to a gcc bug. + # enableShared = false; crossStageStatic = false; }; @@ -1976,6 +1978,7 @@ let crossStageStatic = true; langCC = false; libcCross = null; + enableShared = true; }); libc = null; binutils = binutilsCross cross; @@ -5841,8 +5844,8 @@ let linuxHeaders = linuxHeaders_2_6_28; - linuxHeadersCross = cross : forceBuildDrv (import ../os-specific/linux/kernel-headers/2.6.28.nix { - inherit stdenv fetchurl cross perl; + linuxHeadersCross = cross : forceBuildDrv (import ../os-specific/linux/kernel-headers/2.6.32.nix { + inherit stdenv fetchurl cross perl platform; }); linuxHeaders_2_6_18 = import ../os-specific/linux/kernel-headers/2.6.18.5.nix { diff --git a/pkgs/top-level/release.nix b/pkgs/top-level/release.nix index dbcb4003e2d..b957096cb08 100644 --- a/pkgs/top-level/release.nix +++ b/pkgs/top-level/release.nix @@ -708,6 +708,7 @@ let bigEndian = false; arch = "arm"; float = "soft"; + withTLS = true; }; nativePlatforms = linux; in {