about summary refs log tree commit diff
path: root/lib/systems.nix
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2013-10-10 13:28:21 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2013-10-10 13:28:21 +0200
commit5fef92c4a0c91153e3edac3a61a232581765074a (patch)
tree291d684d0ef71e200e6d8ab5c33fc1aca467cbb3 /lib/systems.nix
parent2a537fb369d1479748fe233261eaadfa5c2fa930 (diff)
Move pkgs/lib/ to lib/
Diffstat (limited to 'lib/systems.nix')
-rw-r--r--lib/systems.nix126
1 files changed, 126 insertions, 0 deletions
diff --git a/lib/systems.nix b/lib/systems.nix
new file mode 100644
index 0000000000000..1ef869fb01208
--- /dev/null
+++ b/lib/systems.nix
@@ -0,0 +1,126 @@
+# Define the list of system with their properties.  Only systems tested for
+# Nixpkgs are listed below
+
+with import ./lists.nix;
+with import ./types.nix;
+with import ./attrsets.nix;
+
+let
+  lib = import ./default.nix;
+  setTypes = type:
+    mapAttrs (name: value:
+      setType type ({inherit name;} // value)
+    );
+in
+
+rec {
+
+  isSignificantByte = isType "significant-byte";
+  significantBytes = setTypes "significant-byte" {
+    bigEndian = {};
+    littleEndian = {};
+  };
+
+
+  isCpuType = x: typeOf x == "cpu-type"
+    && elem x.bits [8 16 32 64 128]
+    && (builtins.lessThan 8 x.bits -> isSignificantByte x.significantByte);
+
+  cpuTypes = with significantBytes;
+    setTypes "cpu-type" {
+      arm =      { bits = 32; significantByte = littleEndian; };
+      armv5tel = { bits = 32; significantByte = littleEndian; };
+      armv7l   = { bits = 32; significantByte = littleEndian; };
+      i686 =     { bits = 32; significantByte = littleEndian; };
+      powerpc =  { bits = 32; significantByte = bigEndian; };
+      x86_64 =   { bits = 64; significantByte = littleEndian; };
+    };
+
+
+  isExecFormat = isType "exec-format";
+  execFormats = setTypes "exec-format" {
+    aout = {}; # a.out
+    elf = {};
+    macho = {};
+    pe = {};
+    unknow = {};
+  };
+
+
+  isKernel = isType "kernel";
+  kernels = with execFormats;
+    setTypes "kernel" {
+      cygwin =  { execFormat = pe; };
+      darwin =  { execFormat = macho; };
+      freebsd = { execFormat = elf; };
+      linux =   { execFormat = elf; };
+      netbsd =  { execFormat = elf; };
+      none =    { execFormat = unknow; };
+      openbsd = { execFormat = elf; };
+      win32 =   { execFormat = pe; };
+    };
+
+
+  isArchitecture = isType "architecture";
+  architectures = setTypes "architecture" {
+    apple = {};
+    pc = {};
+    unknow = {};
+  };
+
+
+  isSystem = x: typeOf x == "system"
+    && isCpuType x.cpu
+    && isArchitecture x.arch
+    && isKernel x.kernel;
+
+  mkSystem = {
+    cpu ? cpuTypes.i686,
+    arch ? architectures.pc,
+    kernel ? kernels.linux,
+    name ? "${cpu.name}-${arch.name}-${kernel.name}"
+  }: setType "system" {
+    inherit name cpu arch kernel;
+  };
+
+
+  isDarwin = matchAttrs { kernel = kernels.darwin; };
+  isLinux = matchAttrs { kernel = kernels.linux; };
+  isi686 = matchAttrs { cpu = cpuTypes.i686; };
+  is64Bit = matchAttrs { cpu = { bits = 64; }; };
+
+
+  # This should revert the job done by config.guess from the gcc compiler.
+  mkSystemFromString = s: let
+    l = lib.splitString "-" s;
+
+    getCpu = name:
+      attrByPath [name] (throw "Unknow cpuType `${name}'.")
+        cpuTypes;
+    getArch = name:
+      attrByPath [name] (throw "Unknow architecture `${name}'.")
+        architectures;
+    getKernel = name:
+      attrByPath [name] (throw "Unknow kernel `${name}'.")
+        kernels;
+
+    system =
+      if builtins.length l == 2 then
+        mkSystem rec {
+          name = s;
+          cpu = getCpu (head l);
+          arch =
+            if isDarwin system
+            then architectures.apple
+            else architectures.pc;
+          kernel = getKernel (head (tail l));
+        }
+      else
+        mkSystem {
+          name = s;
+          cpu = getCpu (head l);
+          arch = getArch (head (tail l));
+          kernel = getKernel (head (tail (tail l)));
+        };
+  in assert isSystem system; system;
+}