diff options
Diffstat (limited to 'pkgs/os-specific')
-rw-r--r-- | pkgs/os-specific/linux/uclibc/default.nix | 93 |
1 files changed, 57 insertions, 36 deletions
diff --git a/pkgs/os-specific/linux/uclibc/default.nix b/pkgs/os-specific/linux/uclibc/default.nix index 5c941f064109..09b86d589b33 100644 --- a/pkgs/os-specific/linux/uclibc/default.nix +++ b/pkgs/os-specific/linux/uclibc/default.nix @@ -1,54 +1,75 @@ -{stdenv, fetchurl, linuxHeaders, libiconv, cross ? null, gccCross ? null}: +{stdenv, fetchurl, linuxHeaders, libiconv, cross ? null, gccCross ? null, +extraConfig ? ""}: assert stdenv.isLinux; assert cross != null -> gccCross != null; let - enableArmEABI = (cross == null && stdenv.platform.kernelArch == "arm") - || (cross != null && cross.arch == "arm"); - - configArmEABI = if enableArmEABI then - ''-e 's/.*CONFIG_ARM_OABI.*//' \ - -e 's/.*CONFIG_ARM_EABI.*/CONFIG_ARM_EABI=y/' '' else ""; - - enableBigEndian = (cross != null && cross.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 (cross != null) then "ARCH=${cross.arch}" else ""; - crossMakeFlag = if (cross != null) then "CROSS=${cross.config}-" else ""; + configParser = '' + function parseconfig { + set -x + while read LINE; do + NAME=`echo "$LINE" | cut -d \ -f 1` + OPTION=`echo "$LINE" | cut -d \ -f 2` + + if test -z "$NAME"; then + continue + fi + + if test "$NAME" == "CLEAR"; then + echo "parseconfig: CLEAR" + echo > .config + fi + + echo "parseconfig: removing $NAME" + sed -i /^$NAME=/d .config + + if test "$OPTION" != n; then + echo "parseconfig: setting $NAME=$OPTION" + echo "$NAME=$OPTION" >> .config + fi + done + set +x + } + ''; + + archMakeFlag = if (cross != null) then "ARCH=${cross.arch}" else ""; + crossMakeFlag = if (cross != null) then "CROSS=${cross.config}-" else ""; + + nixConfig = '' + RUNTIME_PREFIX "/" + DEVEL_PREFIX "/" + UCLIBC_HAS_WCHAR y + UCLIBC_HAS_FTW y + UCLIBC_HAS_RPC y + DO_C99_MATH y + UCLIBC_HAS_PROGRAM_INVOCATION_NAME y + KERNEL_HEADERS "${linuxHeaders}/include" + + UCLIBC_SUSV3_LEGACY y + UCLIBC_SUSV4_LEGACY y + ''; + in stdenv.mkDerivation { - name = "uclibc-0.9.30.3" + stdenv.lib.optionalString (cross != null) + name = "uclibc-0.9.31" + stdenv.lib.optionalString (cross != null) ("-" + cross.config); src = fetchurl { - url = http://www.uclibc.org/downloads/uClibc-0.9.30.3.tar.bz2; - sha256 = "0f1fpdwampbw7pf79i64ipj0azk4kbc9wl81ynlp19p92k4klz0h"; + url = http://www.uclibc.org/downloads/uClibc-0.9.31.tar.bz2; + sha256 = "1yk328fnz0abgh2vm2r68y65ckfkx97rdp8hbg4xvmx5s94kblw0"; }; # 'ftw' needed to build acl, a coreutils dependency configurePhase = '' make defconfig ${archMakeFlag} - sed -e s@/usr/include@${linuxHeaders}/include@ \ - -e 's@^RUNTIME_PREFIX.*@RUNTIME_PREFIX="/"@' \ - -e 's@^DEVEL_PREFIX.*@DEVEL_PREFIX="/"@' \ - -e 's@.*UCLIBC_HAS_WCHAR.*@UCLIBC_HAS_WCHAR=y@' \ - -e 's@.*UCLIBC_HAS_FTW.*@UCLIBC_HAS_FTW=y@' \ - -e 's@.*UCLIBC_HAS_RPC.*@UCLIBC_HAS_RPC=y@' \ - -e 's@.*DO_C99_MATH.*@DO_C99_MATH=y@' \ - -e 's@.*UCLIBC_HAS_PROGRAM_INVOCATION_NAME.*@UCLIBC_HAS_PROGRAM_INVOCATION_NAME=y@' \ - -e 's@.*CONFIG_MIPS_ISA_1.*@#CONFIG_MIPS_ISA_1=y@' \ - -e 's@.*CONFIG_MIPS_ISA_3.*@CONFIG_MIPS_ISA_3=y@' \ - -e 's@.*CONFIG_MIPS_O32_ABI.*@#CONFIG_MIPS_O32_ABI=y@' \ - -e 's@.*CONFIG_MIPS_N32_ABI.*@CONFIG_MIPS_N32_ABI=y@' \ - ${configArmEABI} \ - ${configBigEndian} \ - -i .config + ${configParser} + cat << EOF | parseconfig + ${nixConfig} + ${extraConfig} + ${if cross != null then cross.uclibc.extraConfig else ""} + $extraCrossConfig + EOF make oldconfig ''; |