diff --git a/lib/systems/doubles.nix b/lib/systems/doubles.nix index c6618083ce7..adc454406b8 100644 --- a/lib/systems/doubles.nix +++ b/lib/systems/doubles.nix @@ -44,5 +44,5 @@ in rec { openbsd = filterDoubles predicates.isOpenBSD; unix = filterDoubles predicates.isUnix; - mesaPlatforms = ["i686-linux" "x86_64-linux" "x86_64-darwin" "armv5tel-linux" "armv6l-linux" "armv7l-linux" "aarch64-linux"]; + mesaPlatforms = ["i686-linux" "x86_64-linux" "x86_64-darwin" "armv5tel-linux" "armv6l-linux" "armv7l-linux" "aarch64-linux" "powerpc64le-linux"]; } diff --git a/lib/systems/examples.nix b/lib/systems/examples.nix index 31772ba0054..3828b2f84c6 100644 --- a/lib/systems/examples.nix +++ b/lib/systems/examples.nix @@ -8,6 +8,14 @@ rec { # # Linux # + powernv = { + config = "powerpc64le-unknown-linux-gnu"; + platform = platforms.powernv; + }; + musl-power = { + config = "powerpc64le-unknown-linux-musl"; + platform = platforms.powernv; + }; sheevaplug = rec { config = "armv5tel-unknown-linux-gnueabi"; diff --git a/lib/systems/inspect.nix b/lib/systems/inspect.nix index 0c70f2a7cd5..ac34ed45695 100644 --- a/lib/systems/inspect.nix +++ b/lib/systems/inspect.nix @@ -11,6 +11,7 @@ rec { isi686 = { cpu = cpuTypes.i686; }; isx86_64 = { cpu = cpuTypes.x86_64; }; isPowerPC = { cpu = cpuTypes.powerpc; }; + isPower = { cpu = { family = "power"; }; }; isx86 = { cpu = { family = "x86"; }; }; isAarch32 = { cpu = { family = "arm"; bits = 32; }; }; isAarch64 = { cpu = { family = "arm"; bits = 64; }; }; diff --git a/lib/systems/parse.nix b/lib/systems/parse.nix index b07396a9dfd..7ee3479c333 100644 --- a/lib/systems/parse.nix +++ b/lib/systems/parse.nix @@ -90,6 +90,8 @@ rec { mips64el = { bits = 64; significantByte = littleEndian; family = "mips"; }; powerpc = { bits = 32; significantByte = bigEndian; family = "power"; }; + powerpc64 = { bits = 64; significantByte = bigEndian; family = "power"; }; + powerpc64le = { bits = 64; significantByte = littleEndian; family = "power"; }; riscv32 = { bits = 32; significantByte = littleEndian; family = "riscv"; }; riscv64 = { bits = 64; significantByte = littleEndian; family = "riscv"; }; diff --git a/lib/systems/platforms.nix b/lib/systems/platforms.nix index 8027f6b9fc1..56783d99e3d 100644 --- a/lib/systems/platforms.nix +++ b/lib/systems/platforms.nix @@ -20,6 +20,22 @@ rec { kernelAutoModules = false; }; + powernv = { + name = "PowerNV"; + kernelArch = "powerpc"; + kernelBaseConfig = "powernv_defconfig"; + kernelTarget = "zImage"; + kernelInstallTarget = "install"; + kernelFile = "vmlinux"; + kernelAutoModules = true; + # avoid driver/FS trouble arising from unusual page size + kernelExtraConfig = '' + PPC_64K_PAGES n + PPC_4K_PAGES y + IPV6 y + ''; + }; + ## ## ARM ## @@ -458,5 +474,6 @@ rec { "armv7l-linux" = armv7l-hf-multiplatform; "aarch64-linux" = aarch64-multiplatform; "mipsel-linux" = fuloong2f_n32; + "powerpc64le-linux" = powernv; }.${system} or pcBase; } diff --git a/pkgs/build-support/bintools-wrapper/default.nix b/pkgs/build-support/bintools-wrapper/default.nix index 3635b0ef046..7948f726c62 100644 --- a/pkgs/build-support/bintools-wrapper/default.nix +++ b/pkgs/build-support/bintools-wrapper/default.nix @@ -171,7 +171,7 @@ stdenv.mkDerivation { else if targetPlatform.isWindows then "pe" else "elf" + toString targetPlatform.parsed.cpu.bits; endianPrefix = if targetPlatform.isBigEndian then "big" else "little"; - sep = optionalString (!targetPlatform.isMips) "-"; + sep = optionalString (!targetPlatform.isMips && !targetPlatform.isPower) "-"; arch = /**/ if targetPlatform.isAarch64 then endianPrefix + "aarch64" else if targetPlatform.isAarch32 then endianPrefix + "arm" @@ -183,7 +183,7 @@ stdenv.mkDerivation { "mips64" = "btsmip"; "mips64el" = "ltsmip"; }.${targetPlatform.parsed.cpu.name} - else if targetPlatform.isPowerPC then "powerpc" + else if targetPlatform.isPower then if targetPlatform.isBigEndian then "ppc" else "lppc" else if targetPlatform.isSparc then "sparc" else throw "unknown emulation for platform: " + targetPlatform.config; in targetPlatform.platform.bfdEmulation or (fmt + sep + arch); diff --git a/pkgs/development/compilers/gcc/7/default.nix b/pkgs/development/compilers/gcc/7/default.nix index 0c51868aef8..c5541da0790 100644 --- a/pkgs/development/compilers/gcc/7/default.nix +++ b/pkgs/development/compilers/gcc/7/default.nix @@ -54,7 +54,8 @@ let version = "7.3.0"; url = "https://git.busybox.net/buildroot/plain/package/gcc/7.1.0/0900-remove-selftests.patch?id=11271540bfe6adafbc133caf6b5b902a816f5f02"; sha256 = "0mrvxsdwip2p3l17dscpc1x8vhdsciqw1z5q9i6p5g9yg1cqnmgs"; }) - ++ optional langFortran ../gfortran-driving.patch; + ++ optional langFortran ../gfortran-driving.patch + ++ optional (targetPlatform.libc == "musl" && targetPlatform.isPower) ../ppc-musl.patch; /* Cross-gcc settings (build == host != target) */ crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt"; diff --git a/pkgs/development/compilers/gcc/8/default.nix b/pkgs/development/compilers/gcc/8/default.nix index fa19e9c533d..5d7be163783 100644 --- a/pkgs/development/compilers/gcc/8/default.nix +++ b/pkgs/development/compilers/gcc/8/default.nix @@ -49,7 +49,8 @@ let version = "8.2.0"; url = "https://git.busybox.net/buildroot/plain/package/gcc/${version}/0900-remove-selftests.patch?id=11271540bfe6adafbc133caf6b5b902a816f5f02"; sha256 = ""; # TODO: uncomment and check hash when available. }) */ - ++ optional langFortran ../gfortran-driving.patch; + ++ optional langFortran ../gfortran-driving.patch + ++ optional (targetPlatform.libc == "musl" && targetPlatform.isPower) ../ppc-musl.patch; /* Cross-gcc settings (build == host != target) */ crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt"; diff --git a/pkgs/development/compilers/gcc/common/platform-flags.nix b/pkgs/development/compilers/gcc/common/platform-flags.nix index 9a6d3f8f620..ba6d5912fe8 100644 --- a/pkgs/development/compilers/gcc/common/platform-flags.nix +++ b/pkgs/development/compilers/gcc/common/platform-flags.nix @@ -10,4 +10,7 @@ in lib.concatLists [ (lib.optional (p ? fpu) "--with-fpu=${p.fpu}") (lib.optional (p ? float) "--with-float=${p.float}") (lib.optional (p ? mode) "--with-mode=${p.mode}") + (lib.optional + (let tp = targetPlatform; in tp.isPower && tp.libc == "glibc" && tp.is64bit && tp.isLittleEndian) + "--with-long-double-128") ] diff --git a/pkgs/development/compilers/gcc/ppc-musl.patch b/pkgs/development/compilers/gcc/ppc-musl.patch new file mode 100644 index 00000000000..bc90888a379 --- /dev/null +++ b/pkgs/development/compilers/gcc/ppc-musl.patch @@ -0,0 +1,18 @@ +diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h +index cbee89140dd..e1f26b0a096 100644 +--- a/gcc/config/rs6000/sysv4.h ++++ b/gcc/config/rs6000/sysv4.h +@@ -996,13 +996,7 @@ ncrtn.o%s" + { GPLUSPLUS_BACKWARD_INCLUDE_DIR, "G++", 1, 1, \ + GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 0 }, + +-#ifdef LOCAL_INCLUDE_DIR +-#define INCLUDE_DEFAULTS_MUSL_LOCAL \ +- { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 2 }, \ +- { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 0 }, +-#else + #define INCLUDE_DEFAULTS_MUSL_LOCAL +-#endif + + #ifdef PREFIX_INCLUDE_DIR + #define INCLUDE_DEFAULTS_MUSL_PREFIX \ diff --git a/pkgs/os-specific/linux/kernel/manual-config.nix b/pkgs/os-specific/linux/kernel/manual-config.nix index 80721c4b401..33aa22abaf2 100644 --- a/pkgs/os-specific/linux/kernel/manual-config.nix +++ b/pkgs/os-specific/linux/kernel/manual-config.nix @@ -98,6 +98,7 @@ let sed -i "$mf" -e 's|/usr/bin/||g ; s|/bin/||g ; s|/sbin/||g' done sed -i Makefile -e 's|= depmod|= ${buildPackages.kmod}/bin/depmod|' + sed -i scripts/ld-version.sh -e "s|/usr/bin/awk|${buildPackages.gawk}/bin/awk|" ''; configurePhase = '' @@ -145,9 +146,12 @@ let ++ optional installsFirmware "INSTALL_FW_PATH=$(out)/lib/firmware"; # Some image types need special install targets (e.g. uImage is installed with make uinstall) - installTargets = [ (if platform.kernelTarget == "uImage" then "uinstall" else - if platform.kernelTarget == "zImage" || platform.kernelTarget == "Image.gz" then "zinstall" else - "install") ]; + installTargets = [ ( + if platform ? kernelInstallTarget then platform.kernelInstallTarget + else if platform.kernelTarget == "uImage" then "uinstall" + else if platform.kernelTarget == "zImage" || platform.kernelTarget == "Image.gz" then "zinstall" + else "install" + ) ]; postInstall = (optionalString installsFirmware '' mkdir -p $out/lib/firmware diff --git a/pkgs/os-specific/linux/musl/default.nix b/pkgs/os-specific/linux/musl/default.nix index d6936ccd650..e586539db08 100644 --- a/pkgs/os-specific/linux/musl/default.nix +++ b/pkgs/os-specific/linux/musl/default.nix @@ -1,4 +1,4 @@ -{ stdenv, lib, fetchurl +{ stdenv, lib, fetchurl, hostPlatform , linuxHeaders ? null , useBSDCompatHeaders ? true }: @@ -61,11 +61,12 @@ stdenv.mkDerivation rec { configureFlagsArray+=("--syslibdir=$out/lib") ''; + CFLAGS="-fstack-protector-strong" + lib.optionalString hostPlatform.isPower " -mlong-double-64"; + configureFlags = [ "--enable-shared" "--enable-static" "--enable-debug" - "CFLAGS=-fstack-protector-strong" "--enable-wrapper=all" ]; diff --git a/pkgs/stdenv/default.nix b/pkgs/stdenv/default.nix index 203cf545940..210e0439c0b 100644 --- a/pkgs/stdenv/default.nix +++ b/pkgs/stdenv/default.nix @@ -47,6 +47,7 @@ in "aarch64-linux" = stagesLinux; "mipsel-linux" = stagesLinux; "powerpc-linux" = /* stagesLinux */ stagesNative; + "powerpc64le-linux" = stagesLinux; "x86_64-darwin" = stagesDarwin; "x86_64-solaris" = stagesNix; "i686-cygwin" = stagesNative; diff --git a/pkgs/stdenv/linux/bootstrap-tools/scripts/unpack-bootstrap-tools.sh b/pkgs/stdenv/linux/bootstrap-tools/scripts/unpack-bootstrap-tools.sh index 85e74aea89e..64583f80fa8 100644 --- a/pkgs/stdenv/linux/bootstrap-tools/scripts/unpack-bootstrap-tools.sh +++ b/pkgs/stdenv/linux/bootstrap-tools/scripts/unpack-bootstrap-tools.sh @@ -9,6 +9,9 @@ echo Patching the bootstrap tools... if test -f $out/lib/ld.so.?; then # MIPS case LD_BINARY=$out/lib/ld.so.? +elif test -f $out/lib/ld64.so.?; then + # ppc64(le) + LD_BINARY=$out/lib/ld64.so.? else # i686, x86_64 and armv5tel LD_BINARY=$out/lib/ld-*so.? diff --git a/pkgs/stdenv/linux/default.nix b/pkgs/stdenv/linux/default.nix index bd0be1c9f9d..c7fc2ebac35 100644 --- a/pkgs/stdenv/linux/default.nix +++ b/pkgs/stdenv/linux/default.nix @@ -16,11 +16,13 @@ "armv7l-linux" = import ./bootstrap-files/armv7l.nix; "aarch64-linux" = import ./bootstrap-files/aarch64.nix; "mipsel-linux" = import ./bootstrap-files/loongson2f.nix; + "powerpc64le-linux" = import ./bootstrap-files/ppc64le.nix; }; "musl" = { "aarch64-linux" = import ./bootstrap-files/aarch64-musl.nix; "armv6l-linux" = import ./bootstrap-files/armv6l-musl.nix; "x86_64-linux" = import ./bootstrap-files/x86_64-musl.nix; + "powerpc64le-linux" = import ./bootstrap-files/ppc64le-musl.nix; }; }; archLookupTable = table.${localSystem.libc} diff --git a/pkgs/stdenv/linux/make-bootstrap-tools-cross.nix b/pkgs/stdenv/linux/make-bootstrap-tools-cross.nix index 0dd65bd2478..d1ee317a2bc 100644 --- a/pkgs/stdenv/linux/make-bootstrap-tools-cross.nix +++ b/pkgs/stdenv/linux/make-bootstrap-tools-cross.nix @@ -5,16 +5,18 @@ let localSystem = { inherit system; }; inherit crossSystem; }; - -in with (import ../../../lib).systems.examples; { - armv5tel = make sheevaplug; - scaleway = make scaleway-c1; - pogoplug4 = make pogoplug4; - armv6l = make raspberryPi; - armv7l = make armv7l-hf-multiplatform; - aarch64 = make aarch64-multiplatform; - x86_64-musl = make musl64; - armv6l-musl = make muslpi; - aarch64-musl = make aarch64-multiplatform-musl; - riscv64 = make riscv64; -} + lib = import ../../../lib; +in lib.mapAttrs (n: make) (with lib.systems.examples; { + armv5tel = sheevaplug; + scaleway = scaleway-c1; + pogoplug4 = pogoplug4; + armv6l = raspberryPi; + armv7l = armv7l-hf-multiplatform; + aarch64 = aarch64-multiplatform; + x86_64-musl = musl64; + armv6l-musl = muslpi; + aarch64-musl = aarch64-multiplatform-musl; + riscv64 = riscv64; + powerpc64le = powernv; + powerpc64le-musl = musl-power; +})