From 2e7ec6fb702be66389405d48693b322565b27c69 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Sun, 21 May 2017 13:39:23 -0400 Subject: [PATCH] lib: Make platform predicates more ergonomic to use `hostPlatform.isDarwin` instead of `lib.system.parse.isDarwin hostPlatform.parsed` --- lib/systems/default.nix | 6 +++- lib/systems/doubles.nix | 36 +++++++++++++----------- lib/systems/inspect.nix | 36 ++++++++++++++++++++++++ lib/systems/parse.nix | 26 +++++------------ pkgs/os-specific/darwin/cctools/port.nix | 8 ++---- pkgs/top-level/all-packages.nix | 2 +- 6 files changed, 71 insertions(+), 43 deletions(-) create mode 100644 lib/systems/inspect.nix diff --git a/lib/systems/default.nix b/lib/systems/default.nix index d956969a18f..a61e4efc4ef 100644 --- a/lib/systems/default.nix +++ b/lib/systems/default.nix @@ -1,6 +1,9 @@ +let inherit (import ../attrsets.nix) mapAttrs; in + rec { doubles = import ./doubles.nix; parse = import ./parse.nix; + inspect = import ./inspect.nix; platforms = import ./platforms.nix; # Elaborate a `localSystem` or `crossSystem` so that it contains everything @@ -18,6 +21,7 @@ rec { config = parse.tripleFromSystem final.parsed; # Just a guess, based on `system` platform = platforms.selectBySystem final.system; - } // args; + } // mapAttrs (n: v: v final.parsed) inspect.predicates + // args; in final; } diff --git a/lib/systems/doubles.nix b/lib/systems/doubles.nix index 9b17a51531a..0168eb42f2f 100644 --- a/lib/systems/doubles.nix +++ b/lib/systems/doubles.nix @@ -1,8 +1,9 @@ -let lists = import ../lists.nix; in -let parse = import ./parse.nix; in -let inherit (import ../attrsets.nix) matchAttrs; in - let + lists = import ../lists.nix; + parse = import ./parse.nix; + inherit (import ./inspect.nix) predicates; + inherit (import ../attrsets.nix) matchAttrs; + all = [ "aarch64-linux" "armv5tel-linux" "armv6l-linux" "armv7l-linux" @@ -25,20 +26,21 @@ in rec { allBut = platforms: lists.filter (x: !(builtins.elem x platforms)) all; none = []; - arm = filterDoubles (matchAttrs { cpu = { family = "arm"; bits = 32; }; }); - i686 = filterDoubles parse.isi686; - mips = filterDoubles (matchAttrs { cpu = { family = "mips"; }; }); - x86_64 = filterDoubles parse.isx86_64; + arm = filterDoubles predicates.isArm32; + i686 = filterDoubles predicates.isi686; + mips = filterDoubles predicates.isMips; + x86_64 = filterDoubles predicates.isx86_64; - 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 - illumos = filterDoubles (matchAttrs { kernel = parse.kernels.solaris; }); - linux = filterDoubles parse.isLinux; - netbsd = filterDoubles (matchAttrs { kernel = parse.kernels.netbsd; }); - openbsd = filterDoubles (matchAttrs { kernel = parse.kernels.openbsd; }); - unix = filterDoubles parse.isUnix; + cygwin = filterDoubles predicates.isCygwin; + darwin = filterDoubles predicates.isDarwin; + freebsd = filterDoubles predicates.isFreeBSD; + # Should be better, but MinGW is unclear, and HURD is bit-rotted. + gnu = filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnu; }); + illumos = filterDoubles predicates.isSunOS; + linux = filterDoubles predicates.isLinux; + netbsd = filterDoubles predicates.isNetBSD; + 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"]; } diff --git a/lib/systems/inspect.nix b/lib/systems/inspect.nix new file mode 100644 index 00000000000..1dcb4af35e6 --- /dev/null +++ b/lib/systems/inspect.nix @@ -0,0 +1,36 @@ +with import ./parse.nix; +with import ../attrsets.nix; + +rec { + patterns = { + "32bit" = { cpu = { bits = 32; }; }; + "64bit" = { cpu = { bits = 64; }; }; + i686 = { cpu = cpuTypes.i686; }; + x86_64 = { cpu = cpuTypes.x86_64; }; + Arm = { cpu = { family = "arm"; }; }; + Mips = { cpu = { family = "mips"; }; }; + BigEndian = { cpu = { significantByte = significantBytes.bigEndian; }; }; + LittleEndian = { cpu = { significantByte = significantBytes.littleEndian; }; }; + + Unix = { kernel = { families = { inherit (kernelFamilies) unix; }; }; }; + BSD = { kernel = { families = { inherit (kernelFamilies) bsd; }; }; }; + + Darwin = { kernel = kernels.darwin; }; + Linux = { kernel = kernels.linux; }; + SunOS = { kernel = kernels.solaris; }; + FreeBSD = { kernel = kernels.freebsd; }; + NetBSD = { kernel = kernels.netbsd; }; + OpenBSD = { kernel = kernels.openbsd; }; + Windows = { kernel = kernels.windows; }; + Cygwin = { kernel = kernels.windows; abi = abis.cygnus; }; + MinGW = { kernel = kernels.windows; abi = abis.gnu; }; + + Arm32 = recursiveUpdate patterns.Arm patterns."32bit"; + Arm64 = recursiveUpdate patterns.Arm patterns."64bit"; + + }; + + predicates = mapAttrs' + (name: value: nameValuePair ("is" + name) (matchAttrs value)) + patterns; +} diff --git a/lib/systems/parse.nix b/lib/systems/parse.nix index b9758f44fc1..b94caeb5758 100644 --- a/lib/systems/parse.nix +++ b/lib/systems/parse.nix @@ -8,6 +8,7 @@ with import ../lists.nix; with import ../types.nix; with import ../attrsets.nix; +with (import ./inspect.nix).predicates; let lib = import ../default.nix; @@ -109,19 +110,6 @@ rec { inherit cpu vendor kernel abi; }; - is64Bit = matchAttrs { cpu = { bits = 64; }; }; - is32Bit = matchAttrs { cpu = { bits = 32; }; }; - isi686 = matchAttrs { cpu = cpuTypes.i686; }; - isx86_64 = matchAttrs { cpu = cpuTypes.x86_64; }; - - isDarwin = matchAttrs { kernel = kernels.darwin; }; - isLinux = matchAttrs { kernel = kernels.linux; }; - isUnix = matchAttrs { kernel = { families = { inherit (kernelFamilies) unix; }; }; }; - isWindows = matchAttrs { kernel = kernels.windows; }; - isCygwin = matchAttrs { kernel = kernels.windows; abi = abis.cygnus; }; - isMinGW = matchAttrs { kernel = kernels.windows; abi = abis.gnu; }; - - mkSkeletonFromList = l: { "2" = # We only do 2-part hacks for things Nix already supports if elemAt l 1 == "cygwin" @@ -153,22 +141,22 @@ rec { getKernel = name: kernels.${name} or (throw "Unknown kernel: ${name}"); getAbi = name: abis.${name} or (throw "Unknown ABI: ${name}"); - system = rec { + parsed = rec { cpu = getCpu args.cpu; vendor = /**/ if args ? vendor then getVendor args.vendor - else if isDarwin system then vendors.apple - else if isWindows system then vendors.pc + else if isDarwin parsed then vendors.apple + else if isWindows parsed then vendors.pc else vendors.unknown; kernel = getKernel args.kernel; abi = /**/ if args ? abi then getAbi args.abi - else if isLinux system then abis.gnu - else if isWindows system then abis.gnu + else if isLinux parsed then abis.gnu + else if isWindows parsed then abis.gnu else abis.unknown; }; - in mkSystem system; + in mkSystem parsed; mkSystemFromString = s: mkSystemFromSkeleton (mkSkeletonFromList (lib.splitString "-" s)); diff --git a/pkgs/os-specific/darwin/cctools/port.nix b/pkgs/os-specific/darwin/cctools/port.nix index 14c4c6e9973..222c51603fd 100644 --- a/pkgs/os-specific/darwin/cctools/port.nix +++ b/pkgs/os-specific/darwin/cctools/port.nix @@ -5,17 +5,15 @@ }: let - inherit (stdenv.lib.systems.parse) isDarwin; - prefix = stdenv.lib.optionalString (targetPlatform != hostPlatform) "${targetPlatform.config}-"; in -assert isDarwin targetPlatform.parsed; +assert targetPlatform.isDarwin; # Non-Darwin alternatives -assert (!isDarwin hostPlatform.parsed) -> (maloader != null && xctoolchain != null); +assert (!hostPlatform.isDarwin) -> (maloader != null && xctoolchain != null); let baseParams = rec { @@ -91,7 +89,7 @@ let ''; postInstall = - if isDarwin hostPlatform.parsed + if hostPlatform.isDarwin then '' cat >$out/bin/dsymutil << EOF #!${stdenv.shell} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 32c4f0f95c6..88f4bc04b9f 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -6397,7 +6397,7 @@ with pkgs; bin_replace_string = callPackage ../development/tools/misc/bin_replace_string { }; binutils = - if lib.systems.parse.isDarwin targetPlatform.parsed + if targetPlatform.isDarwin then darwin.binutils else binutils-raw;