lib platform parsing: Fix windows
There is no more `cygwin` OS, but instead a `cygnus` abi. "win32" and "mingw32" parse as `windows`. Add a 3-part hack because autotools breaks on explicit abi with windows-like (e.g. "i686-pc-windows-gnu"). Also change cross triples to conform
This commit is contained in:
parent
7d546d7771
commit
fcde869e7e
@ -30,7 +30,7 @@ in rec {
|
||||
mips = filterDoubles (matchAttrs { cpu = { family = "mips"; }; });
|
||||
x86_64 = filterDoubles parse.isx86_64;
|
||||
|
||||
cygwin = filterDoubles (matchAttrs { kernel = parse.kernels.cygwin; });
|
||||
cygwin = filterDoubles parse.isCygwin;
|
||||
darwin = filterDoubles parse.isDarwin;
|
||||
freebsd = filterDoubles (matchAttrs { kernel = parse.kernels.freebsd; });
|
||||
gnu = filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnu; }); # Should be better
|
||||
|
@ -1,5 +1,9 @@
|
||||
# Define the list of system with their properties. Only systems tested for
|
||||
# Nixpkgs are listed below
|
||||
# Define the list of system with their properties.
|
||||
#
|
||||
# See https://clang.llvm.org/docs/CrossCompilation.html and
|
||||
# http://llvm.org/docs/doxygen/html/Triple_8cpp_source.html especially
|
||||
# Triple::normalize. Parsing should essentially act as a more conservative
|
||||
# version of that last function.
|
||||
|
||||
with import ../lists.nix;
|
||||
with import ../types.nix;
|
||||
@ -23,7 +27,6 @@ rec {
|
||||
littleEndian = {};
|
||||
};
|
||||
|
||||
|
||||
isCpuType = isType "cpu-type";
|
||||
cpuTypes = with significantBytes; setTypesAssert "cpu-type"
|
||||
(x: elem x.bits [8 16 32 64 128]
|
||||
@ -47,6 +50,7 @@ rec {
|
||||
vendors = setTypes "vendor" {
|
||||
apple = {};
|
||||
pc = {};
|
||||
|
||||
unknown = {};
|
||||
};
|
||||
|
||||
@ -56,6 +60,7 @@ rec {
|
||||
elf = {};
|
||||
macho = {};
|
||||
pe = {};
|
||||
|
||||
unknown = {};
|
||||
};
|
||||
|
||||
@ -63,15 +68,12 @@ rec {
|
||||
kernelFamilies = setTypes "kernel-family" {
|
||||
bsd = {};
|
||||
unix = {};
|
||||
windows-nt = {};
|
||||
dos = {};
|
||||
};
|
||||
|
||||
isKernel = x: isType "kernel" x;
|
||||
kernels = with execFormats; with kernelFamilies; setTypesAssert "kernel"
|
||||
(x: isExecFormat x.execFormat && all isKernelFamily (attrValues x.families))
|
||||
{
|
||||
cygwin = { execFormat = pe; families = { inherit /*unix*/ windows-nt; }; };
|
||||
darwin = { execFormat = macho; families = { inherit unix; }; };
|
||||
freebsd = { execFormat = elf; families = { inherit unix bsd; }; };
|
||||
linux = { execFormat = elf; families = { inherit unix; }; };
|
||||
@ -79,18 +81,21 @@ rec {
|
||||
none = { execFormat = unknown; families = { inherit unix; }; };
|
||||
openbsd = { execFormat = elf; families = { inherit unix bsd; }; };
|
||||
solaris = { execFormat = elf; families = { inherit unix; }; };
|
||||
win32 = { execFormat = pe; families = { inherit dos; }; };
|
||||
windows = { execFormat = pe; families = { }; };
|
||||
} // { # aliases
|
||||
win32 = kernels.windows;
|
||||
};
|
||||
|
||||
|
||||
isAbi = isType "abi";
|
||||
abis = setTypes "abi" {
|
||||
cygnus = {};
|
||||
gnu = {};
|
||||
msvc = {};
|
||||
eabi = {};
|
||||
androideabi = {};
|
||||
gnueabi = {};
|
||||
gnueabihf = {};
|
||||
|
||||
unknown = {};
|
||||
};
|
||||
|
||||
@ -109,19 +114,25 @@ rec {
|
||||
isDarwin = matchAttrs { kernel = kernels.darwin; };
|
||||
isLinux = matchAttrs { kernel = kernels.linux; };
|
||||
isUnix = matchAttrs { kernel = { families = { inherit (kernelFamilies) unix; }; }; };
|
||||
isWindows = s: matchAttrs { kernel = { families = { inherit (kernelFamilies) windows-nt; }; }; } s
|
||||
|| matchAttrs { kernel = { families = { inherit (kernelFamilies) dos; }; }; } s;
|
||||
isWindows = matchAttrs { kernel = kernels.windows; };
|
||||
isCygwin = matchAttrs { kernel = kernels.windows; abi = abis.cygnus; };
|
||||
isMinGW = matchAttrs { kernel = kernels.windows; abi = abis.gnu; };
|
||||
|
||||
|
||||
mkSkeletonFromList = l: {
|
||||
"2" = { cpu = elemAt l 0; kernel = elemAt l 1; };
|
||||
"4" = { cpu = elemAt l 0; vendor = elemAt l 1; kernel = elemAt l 2; abi = elemAt l 3; };
|
||||
"2" = # We only do 2-part hacks for things Nix already supports
|
||||
if elemAt l 1 == "cygwin"
|
||||
then { cpu = elemAt l 0; kernel = "windows"; abi = "cygnus"; }
|
||||
else { cpu = elemAt l 0; kernel = elemAt l 1; };
|
||||
"3" = # Awkwards hacks, beware!
|
||||
if elemAt l 1 == "apple"
|
||||
then { cpu = elemAt l 0; vendor = "apple"; kernel = elemAt l 2; }
|
||||
else if (elemAt l 1 == "linux") || (elemAt l 2 == "gnu")
|
||||
then { cpu = elemAt l 0; kernel = elemAt l 1; abi = elemAt l 2; }
|
||||
else if (elemAt l 2 == "mingw32") # autotools breaks on -gnu for window
|
||||
then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = "windows"; abi = "gnu"; }
|
||||
else throw "Target specification with 3 components is ambiguous";
|
||||
"4" = { cpu = elemAt l 0; vendor = elemAt l 1; kernel = elemAt l 2; abi = elemAt l 3; };
|
||||
}.${toString (length l)}
|
||||
or (throw "system string has invalid number of hyphen-separated components");
|
||||
|
||||
@ -134,18 +145,10 @@ rec {
|
||||
, # Also inferred below
|
||||
abi ? assert false; null
|
||||
} @ args: let
|
||||
getCpu = name:
|
||||
attrByPath [name] (throw "Unknown CPU type: ${name}")
|
||||
cpuTypes;
|
||||
getVendor = name:
|
||||
attrByPath [name] (throw "Unknown vendor: ${name}")
|
||||
vendors;
|
||||
getKernel = name:
|
||||
attrByPath [name] (throw "Unknown kernel: ${name}")
|
||||
kernels;
|
||||
getAbi = name:
|
||||
attrByPath [name] (throw "Unknown ABI: ${name}")
|
||||
abis;
|
||||
getCpu = name: cpuTypes.${name} or (throw "Unknown CPU type: ${name}");
|
||||
getVendor = name: vendors.${name} or (throw "Unknown vendor: ${name}");
|
||||
getKernel = name: kernels.${name} or (throw "Unknown kernel: ${name}");
|
||||
getAbi = name: abis.${name} or (throw "Unknown ABI: ${name}");
|
||||
|
||||
system = rec {
|
||||
cpu = getCpu args.cpu;
|
||||
@ -166,7 +169,10 @@ rec {
|
||||
|
||||
mkSystemFromString = s: mkSystemFromSkeleton (mkSkeletonFromList (lib.splitString "-" s));
|
||||
|
||||
doubleFromSystem = { cpu, vendor, kernel, abi, ... }: "${cpu.name}-${kernel.name}";
|
||||
doubleFromSystem = { cpu, vendor, kernel, abi, ... }:
|
||||
if vendor == kernels.windows && abi == abis.cygnus
|
||||
then "${cpu.name}-cygwin"
|
||||
else "${cpu.name}-${kernel.name}";
|
||||
|
||||
tripleFromSystem = { cpu, vendor, kernel, abi, ... } @ sys: assert isSystem sys; let
|
||||
optAbi = lib.optionalString (abi != abis.unknown) "-${abi.name}";
|
||||
|
@ -5010,7 +5010,8 @@ with pkgs;
|
||||
|
||||
# XXX: We have troubles cross-compiling libstdc++ on MinGW (see
|
||||
# <http://hydra.nixos.org/build/4268232>), so don't even try.
|
||||
langCC = targetPlatform.config != "i686-pc-mingw32";
|
||||
langCC = !(lib.systems.parse.isi686 targetPlatform.parsed &&
|
||||
lib.systems.parse.isMinGW targetPlatform.parsed);
|
||||
# Why is this needed?
|
||||
inherit (forcedNativePackages) binutils;
|
||||
};
|
||||
|
@ -20,12 +20,27 @@ let
|
||||
/* Basic list of packages to be natively built,
|
||||
but need a crossSystem defined to get meaning */
|
||||
basicNativeDrv = {
|
||||
buildPackages.binutils = nativePlatforms;
|
||||
buildPackages.gccCrossStageFinal = nativePlatforms;
|
||||
buildPackages.gdbCross = nativePlatforms;
|
||||
};
|
||||
|
||||
basic = basicCrossDrv // basicNativeDrv;
|
||||
|
||||
windows = {
|
||||
buildPackages.binutils = nativePlatforms;
|
||||
buildPackages.gccCrossStageFinal = nativePlatforms;
|
||||
|
||||
coreutils = nativePlatforms;
|
||||
boehmgc = nativePlatforms;
|
||||
gmp = nativePlatforms;
|
||||
guile_1_8 = nativePlatforms;
|
||||
libffi = nativePlatforms;
|
||||
libtool = nativePlatforms;
|
||||
libunistring = nativePlatforms;
|
||||
windows.wxMSW = nativePlatforms;
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
@ -89,42 +104,24 @@ in
|
||||
/* Test some cross builds on 32 bit mingw-w64 */
|
||||
crossMingw32 = let
|
||||
crossSystem = {
|
||||
config = "i686-w64-mingw32";
|
||||
config = "i686-pc-mingw32";
|
||||
arch = "x86"; # Irrelevant
|
||||
libc = "msvcrt"; # This distinguishes the mingw (non posix) toolchain
|
||||
platform = {};
|
||||
};
|
||||
in mapTestOnCross crossSystem {
|
||||
coreutils = nativePlatforms;
|
||||
boehmgc = nativePlatforms;
|
||||
gmp = nativePlatforms;
|
||||
guile_1_8 = nativePlatforms;
|
||||
libffi = nativePlatforms;
|
||||
libtool = nativePlatforms;
|
||||
libunistring = nativePlatforms;
|
||||
windows.wxMSW = nativePlatforms;
|
||||
};
|
||||
in mapTestOnCross crossSystem windows;
|
||||
|
||||
|
||||
/* Test some cross builds on 64 bit mingw-w64 */
|
||||
crossMingwW64 = let
|
||||
crossSystem = {
|
||||
# That's the triplet they use in the mingw-w64 docs.
|
||||
config = "x86_64-w64-mingw32";
|
||||
config = "x86_64-pc-mingw32";
|
||||
arch = "x86_64"; # Irrelevant
|
||||
libc = "msvcrt"; # This distinguishes the mingw (non posix) toolchain
|
||||
platform = {};
|
||||
};
|
||||
in mapTestOnCross crossSystem {
|
||||
coreutils = nativePlatforms;
|
||||
boehmgc = nativePlatforms;
|
||||
gmp = nativePlatforms;
|
||||
guile_1_8 = nativePlatforms;
|
||||
libffi = nativePlatforms;
|
||||
libtool = nativePlatforms;
|
||||
libunistring = nativePlatforms;
|
||||
windows.wxMSW = nativePlatforms;
|
||||
};
|
||||
in mapTestOnCross crossSystem windows;
|
||||
|
||||
|
||||
/* Linux on the fuloong */
|
||||
|
Loading…
Reference in New Issue
Block a user