[RFC] ppc64le enablement (#45340)

* ppc64le enablement

* gcc, glibc: properly handle __float128

* lib/systems, stdenv: syntax cleanup

* gcc7: remove ugly hack

* gcc: add/update __float128 flags

* stdenv: add another pair of quotes for consistency

* gcc: move __float128 flag for ppc64le-glibc into common/platform-flags.nix

Changed files
+87 -23
lib
pkgs
build-support
bintools-wrapper
development
os-specific
linux
stdenv
+1 -1
lib/systems/doubles.nix
···
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"];
}
+8
lib/systems/examples.nix
···
#
# 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";
+1
lib/systems/inspect.nix
···
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; }; };
+2
lib/systems/parse.nix
···
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"; };
+17
lib/systems/platforms.nix
···
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
##
···
"armv7l-linux" = armv7l-hf-multiplatform;
"aarch64-linux" = aarch64-multiplatform;
"mipsel-linux" = fuloong2f_n32;
+
"powerpc64le-linux" = powernv;
}.${system} or pcBase;
}
+2 -2
pkgs/build-support/bintools-wrapper/default.nix
···
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"
···
"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);
+2 -1
pkgs/development/compilers/gcc/7/default.nix
···
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";
+2 -1
pkgs/development/compilers/gcc/8/default.nix
···
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";
+3
pkgs/development/compilers/gcc/common/platform-flags.nix
···
(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")
]
+18
pkgs/development/compilers/gcc/ppc-musl.patch
···
+
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 \
+7 -3
pkgs/os-specific/linux/kernel/manual-config.nix
···
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 = ''
···
++ 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
+3 -2
pkgs/os-specific/linux/musl/default.nix
···
-
{ stdenv, lib, fetchurl
+
{ stdenv, lib, fetchurl, hostPlatform
, linuxHeaders ? null
, useBSDCompatHeaders ? true
}:
···
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"
];
+1
pkgs/stdenv/default.nix
···
"aarch64-linux" = stagesLinux;
"mipsel-linux" = stagesLinux;
"powerpc-linux" = /* stagesLinux */ stagesNative;
+
"powerpc64le-linux" = stagesLinux;
"x86_64-darwin" = stagesDarwin;
"x86_64-solaris" = stagesNix;
"i686-cygwin" = stagesNative;
+3
pkgs/stdenv/linux/bootstrap-tools/scripts/unpack-bootstrap-tools.sh
···
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.?
+2
pkgs/stdenv/linux/default.nix
···
"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}
+15 -13
pkgs/stdenv/linux/make-bootstrap-tools-cross.nix
···
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;
+
})