summaryrefslogtreecommitdiffstats
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 000000000000..1ef869fb0120
--- /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;
+}