From 4164de326abf88b35bbd3f2799599fa6f9f72446 Mon Sep 17 00:00:00 2001 From: LluĂ­s Batlle i Rossell Date: Fri, 4 Dec 2009 13:35:58 +0000 Subject: 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 --- pkgs/os-specific/linux/uclibc/default.nix | 53 ++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 11 deletions(-) (limited to 'pkgs/os-specific/linux/uclibc') 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 = { -- cgit 1.4.1