summary refs log tree commit diff
path: root/lib
diff options
context:
space:
mode:
authorFrederik Rietdijk <freddyrietdijk@fridh.nl>2019-03-01 09:22:21 +0100
committerFrederik Rietdijk <freddyrietdijk@fridh.nl>2019-03-01 09:22:21 +0100
commit205e0fc5bd49dcd21c14083246610f608e7b50c6 (patch)
treeb3c621ab8ea0f89f5dc4ea8c4bae5b8e7fbc90cf /lib
parent6d61a0b312f9277debf88a9f85feef5fd313f3d4 (diff)
parent3c77acbcd50156d300011e7a826dfcd41403e3f3 (diff)
downloadnixpkgs-205e0fc5bd49dcd21c14083246610f608e7b50c6.tar
nixpkgs-205e0fc5bd49dcd21c14083246610f608e7b50c6.tar.gz
nixpkgs-205e0fc5bd49dcd21c14083246610f608e7b50c6.tar.bz2
nixpkgs-205e0fc5bd49dcd21c14083246610f608e7b50c6.tar.lz
nixpkgs-205e0fc5bd49dcd21c14083246610f608e7b50c6.tar.xz
nixpkgs-205e0fc5bd49dcd21c14083246610f608e7b50c6.tar.zst
nixpkgs-205e0fc5bd49dcd21c14083246610f608e7b50c6.zip
Merge staging-next into staging
Diffstat (limited to 'lib')
-rw-r--r--lib/systems/default.nix9
-rw-r--r--lib/systems/parse.nix60
-rw-r--r--lib/trivial.nix2
3 files changed, 67 insertions, 4 deletions
diff --git a/lib/systems/default.nix b/lib/systems/default.nix
index 6e83546ae8e..090a3f700d4 100644
--- a/lib/systems/default.nix
+++ b/lib/systems/default.nix
@@ -24,6 +24,8 @@ rec {
       config = parse.tripleFromSystem final.parsed;
       # Just a guess, based on `system`
       platform = platforms.selectBySystem final.system;
+      # Determine whether we are compatible with the provided CPU
+      isCompatible = platform: parse.isCompatible final.parsed.cpu platform.parsed.cpu;
       # Derived meta-data
       libc =
         /**/ if final.isDarwin              then "libSystem"
@@ -99,13 +101,14 @@ rec {
         wine = (pkgs.winePackagesFor wine-name).minimal;
       in
         if final.parsed.kernel.name == pkgs.stdenv.hostPlatform.parsed.kernel.name &&
-           (final.parsed.cpu.name == pkgs.stdenv.hostPlatform.parsed.cpu.name ||
-            (final.isi686 && pkgs.stdenv.hostPlatform.isx86_64))
-        then pkgs.runtimeShell
+           pkgs.stdenv.hostPlatform.isCompatible final
+        then "${pkgs.runtimeShell} -c"
         else if final.isWindows
         then "${wine}/bin/${wine-name}"
         else if final.isLinux && pkgs.stdenv.hostPlatform.isLinux
         then "${qemu-user}/bin/qemu-${final.qemuArch}"
+        else if final.isWasm
+        then "${pkgs.v8}/bin/d8"
         else throw "Don't know how to run ${final.config} executables.";
 
     } // mapAttrs (n: v: v final.parsed) inspect.predicates
diff --git a/lib/systems/parse.nix b/lib/systems/parse.nix
index 6947d41419e..fab50bc0ebd 100644
--- a/lib/systems/parse.nix
+++ b/lib/systems/parse.nix
@@ -112,6 +112,66 @@ rec {
     avr      = { bits = 8; family = "avr"; };
   };
 
+  # Determine where two CPUs are compatible with each other. That is,
+  # can we run code built for system b on system a? For that to
+  # happen, then the set of all possible possible programs that system
+  # b accepts must be a subset of the set of all programs that system
+  # a accepts. This compatibility relation forms a category where each
+  # CPU is an object and each arrow from a to b represents
+  # compatibility. CPUs with multiple modes of Endianness are
+  # isomorphic while all CPUs are endomorphic because any program
+  # built for a CPU can run on that CPU.
+  isCompatible = a: b: with cpuTypes; lib.any lib.id [
+    # x86
+    (b == i386 && isCompatible a i486)
+    (b == i486 && isCompatible a i586)
+    (b == i586 && isCompatible a i686)
+    # NOTE: Not true in some cases. Like in WSL mode.
+    (b == i686 && isCompatible a x86_64)
+
+    # ARM
+    (b == arm && isCompatible a armv5tel)
+    (b == armv5tel && isCompatible a armv6m)
+    (b == armv6m && isCompatible a armv6l)
+    (b == armv6l && isCompatible a armv7a)
+    (b == armv7a && isCompatible a armv7r)
+    (b == armv7r && isCompatible a armv7m)
+    (b == armv7m && isCompatible a armv7l)
+    (b == armv7l && isCompatible a armv8a)
+    (b == armv8a && isCompatible a armv8r)
+    (b == armv8r && isCompatible a armv8m)
+    # NOTE: not always true! Some arm64 cpus don’t support arm32 mode.
+    (b == armv8m && isCompatible a aarch64)
+    (b == aarch64 && a == aarch64_be)
+    (b == aarch64_be && isCompatible a aarch64)
+
+    # PowerPC
+    (b == powerpc && isCompatible a powerpc64)
+    (b == powerpcle && isCompatible a powerpc)
+    (b == powerpc && a == powerpcle)
+    (b == powerpc64le && isCompatible a powerpc64)
+    (b == powerpc64 && a == powerpc64le)
+
+    # MIPS
+    (b == mips && isCompatible a mips64)
+    (b == mips && a == mipsel)
+    (b == mipsel && isCompatible a mips)
+    (b == mips64 && a == mips64el)
+    (b == mips64el && isCompatible a mips64)
+
+    # RISCV
+    (b == riscv32 && isCompatible a riscv64)
+
+    # SPARC
+    (b == sparc && isCompatible a sparc64)
+
+    # WASM
+    (b == wasm32 && isCompatible a wasm64)
+
+    # identity
+    (b == a)
+  ];
+
   ################################################################################
 
   types.openVendor = mkOptionType {
diff --git a/lib/trivial.nix b/lib/trivial.nix
index 17489311236..3f0816b5540 100644
--- a/lib/trivial.nix
+++ b/lib/trivial.nix
@@ -134,7 +134,7 @@ rec {
      On each release the first letter is bumped and a new animal is chosen
      starting with that new letter.
   */
-  codeName = "Koi";
+  codeName = "Loris";
 
   /* Returns the current nixpkgs version suffix as string. */
   versionSuffix =