Merge pull request #24610 from Ericson2314/platform-normalization
Platform normalization
This commit is contained in:
		
						commit
						f0b634c7e8
					
				@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
let
 | 
			
		||||
  inherit (builtins) head tail length;
 | 
			
		||||
  inherit (import ./trivial.nix) or;
 | 
			
		||||
  inherit (import ./trivial.nix) and or;
 | 
			
		||||
  inherit (import ./default.nix) fold;
 | 
			
		||||
  inherit (import ./strings.nix) concatStringsSep;
 | 
			
		||||
  inherit (import ./lists.nix) concatMap concatLists all deepSeqList;
 | 
			
		||||
@ -417,18 +417,15 @@ rec {
 | 
			
		||||
 | 
			
		||||
  /* Returns true if the pattern is contained in the set. False otherwise.
 | 
			
		||||
 | 
			
		||||
     FIXME(zimbatm): this example doesn't work !!!
 | 
			
		||||
 | 
			
		||||
     Example:
 | 
			
		||||
       sys = mkSystem { }
 | 
			
		||||
       matchAttrs { cpu = { bits = 64; }; } sys
 | 
			
		||||
       matchAttrs { cpu = {}; } { cpu = { bits = 64; }; }
 | 
			
		||||
       => true
 | 
			
		||||
   */
 | 
			
		||||
  matchAttrs = pattern: attrs:
 | 
			
		||||
    fold or false (attrValues (zipAttrsWithNames (attrNames pattern) (n: values:
 | 
			
		||||
  matchAttrs = pattern: attrs: assert isAttrs pattern;
 | 
			
		||||
    fold and true (attrValues (zipAttrsWithNames (attrNames pattern) (n: values:
 | 
			
		||||
      let pat = head values; val = head (tail values); in
 | 
			
		||||
      if length values == 1 then false
 | 
			
		||||
      else if isAttrs pat then isAttrs val && matchAttrs head values
 | 
			
		||||
      else if isAttrs pat then isAttrs val && matchAttrs pat val
 | 
			
		||||
      else pat == val
 | 
			
		||||
    ) [pattern attrs]));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -27,8 +27,7 @@ let
 | 
			
		||||
 | 
			
		||||
  # constants
 | 
			
		||||
  licenses = import ./licenses.nix;
 | 
			
		||||
  platforms = import ./platforms.nix;
 | 
			
		||||
  systems = import ./systems.nix;
 | 
			
		||||
  systems = import ./systems;
 | 
			
		||||
 | 
			
		||||
  # misc
 | 
			
		||||
  debug = import ./debug.nix;
 | 
			
		||||
@ -47,13 +46,15 @@ in
 | 
			
		||||
            attrsets lists strings stringsWithDeps
 | 
			
		||||
            customisation maintainers meta sources
 | 
			
		||||
            modules options types
 | 
			
		||||
            licenses platforms systems
 | 
			
		||||
            licenses systems
 | 
			
		||||
            debug generators misc
 | 
			
		||||
            sandbox fetchers filesystem;
 | 
			
		||||
 | 
			
		||||
    # back-compat aliases
 | 
			
		||||
    platforms = systems.doubles;
 | 
			
		||||
  }
 | 
			
		||||
  # !!! don't include everything at top-level; perhaps only the most
 | 
			
		||||
  # commonly used functions.
 | 
			
		||||
  // trivial // lists // strings // stringsWithDeps // attrsets // sources
 | 
			
		||||
  // options // types // meta // debug // misc // modules
 | 
			
		||||
  // systems
 | 
			
		||||
  // customisation
 | 
			
		||||
 | 
			
		||||
@ -1,24 +0,0 @@
 | 
			
		||||
let lists = import ./lists.nix; in
 | 
			
		||||
 | 
			
		||||
rec {
 | 
			
		||||
  all = linux ++ darwin ++ cygwin ++ freebsd ++ openbsd ++ netbsd ++ illumos;
 | 
			
		||||
  allBut = platforms: lists.filter (x: !(builtins.elem x platforms)) all;
 | 
			
		||||
  none = [];
 | 
			
		||||
 | 
			
		||||
  arm = ["armv5tel-linux" "armv6l-linux" "armv7l-linux" ];
 | 
			
		||||
  i686 = ["i686-linux" "i686-freebsd" "i686-netbsd" "i686-cygwin"];
 | 
			
		||||
  mips = [ "mips64el-linux" ];
 | 
			
		||||
  x86_64 = ["x86_64-linux" "x86_64-darwin" "x86_64-freebsd" "x86_64-openbsd" "x86_64-netbsd" "x86_64-cygwin"];
 | 
			
		||||
 | 
			
		||||
  cygwin = ["i686-cygwin" "x86_64-cygwin"];
 | 
			
		||||
  darwin = ["x86_64-darwin"];
 | 
			
		||||
  freebsd = ["i686-freebsd" "x86_64-freebsd"];
 | 
			
		||||
  gnu = linux; /* ++ hurd ++ kfreebsd ++ ... */
 | 
			
		||||
  illumos = ["x86_64-solaris"];
 | 
			
		||||
  linux = ["i686-linux" "x86_64-linux" "armv5tel-linux" "armv6l-linux" "armv7l-linux" "aarch64-linux" "mips64el-linux"];
 | 
			
		||||
  netbsd = ["i686-netbsd" "x86_64-netbsd"];
 | 
			
		||||
  openbsd = ["i686-openbsd" "x86_64-openbsd"];
 | 
			
		||||
  unix = linux ++ darwin ++ freebsd ++ openbsd ++ netbsd ++ illumos;
 | 
			
		||||
 | 
			
		||||
  mesaPlatforms = ["i686-linux" "x86_64-linux" "x86_64-darwin" "armv5tel-linux" "armv6l-linux" "armv7l-linux" "aarch64-linux"];
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										126
									
								
								lib/systems.nix
									
									
									
									
									
								
							
							
						
						
									
										126
									
								
								lib/systems.nix
									
									
									
									
									
								
							@ -1,126 +0,0 @@
 | 
			
		||||
# 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: isType "cpu-type" x
 | 
			
		||||
    && elem x.bits [8 16 32 64 128]
 | 
			
		||||
    && (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: isType "system" x
 | 
			
		||||
    && 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;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  is64Bit = matchAttrs { cpu = { bits = 64; }; };
 | 
			
		||||
  isDarwin = matchAttrs { kernel = kernels.darwin; };
 | 
			
		||||
  isi686 = matchAttrs { cpu = cpuTypes.i686; };
 | 
			
		||||
  isLinux = matchAttrs { kernel = kernels.linux; };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  # 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;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								lib/systems/default.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								lib/systems/default.nix
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
rec {
 | 
			
		||||
  doubles = import ./doubles.nix;
 | 
			
		||||
  parse = import ./parse.nix;
 | 
			
		||||
  platforms = import ./platforms.nix;
 | 
			
		||||
 | 
			
		||||
  # Elaborate a `localSystem` or `crossSystem` so that it contains everything
 | 
			
		||||
  # necessary.
 | 
			
		||||
  #
 | 
			
		||||
  # `parsed` is inferred from args, both because there are two options with one
 | 
			
		||||
  # clearly prefered, and to prevent cycles. A simpler fixed point where the RHS
 | 
			
		||||
  # always just used `final.*` would fail on both counts.
 | 
			
		||||
  elaborate = args: let
 | 
			
		||||
    final = {
 | 
			
		||||
      # Prefer to parse `config` as it is strictly more informative.
 | 
			
		||||
      parsed = parse.mkSystemFromString (if args ? config then args.config else args.system);
 | 
			
		||||
      # Either of these can be losslessly-extracted from `parsed` iff parsing succeeds.
 | 
			
		||||
      system = parse.doubleFromSystem final.parsed;
 | 
			
		||||
      config = parse.tripleFromSystem final.parsed;
 | 
			
		||||
      # Just a guess, based on `system`
 | 
			
		||||
      platform = platforms.selectBySystem final.system;
 | 
			
		||||
    } // args;
 | 
			
		||||
  in final;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										44
									
								
								lib/systems/doubles.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								lib/systems/doubles.nix
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,44 @@
 | 
			
		||||
let lists = import ../lists.nix; in
 | 
			
		||||
let parse = import ./parse.nix; in
 | 
			
		||||
let inherit (import ../attrsets.nix) matchAttrs; in
 | 
			
		||||
 | 
			
		||||
let
 | 
			
		||||
  all = [
 | 
			
		||||
    "aarch64-linux"
 | 
			
		||||
    "armv5tel-linux" "armv6l-linux" "armv7l-linux"
 | 
			
		||||
 | 
			
		||||
    "mips64el-linux"
 | 
			
		||||
 | 
			
		||||
    "i686-cygwin" "i686-freebsd" "i686-linux" "i686-netbsd" "i686-openbsd"
 | 
			
		||||
 | 
			
		||||
    "x86_64-cygwin" "x86_64-darwin" "x86_64-freebsd" "x86_64-linux"
 | 
			
		||||
    "x86_64-netbsd" "x86_64-openbsd" "x86_64-solaris"
 | 
			
		||||
  ];
 | 
			
		||||
 | 
			
		||||
  allParsed = map parse.mkSystemFromString all;
 | 
			
		||||
 | 
			
		||||
  filterDoubles = f: map parse.doubleFromSystem (lists.filter f allParsed);
 | 
			
		||||
 | 
			
		||||
in rec {
 | 
			
		||||
  inherit all;
 | 
			
		||||
 | 
			
		||||
  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;
 | 
			
		||||
 | 
			
		||||
  cygwin = filterDoubles (matchAttrs { kernel = parse.kernels.cygwin; });
 | 
			
		||||
  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;
 | 
			
		||||
 | 
			
		||||
  mesaPlatforms = ["i686-linux" "x86_64-linux" "x86_64-darwin" "armv5tel-linux" "armv6l-linux" "armv7l-linux" "aarch64-linux"];
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										173
									
								
								lib/systems/parse.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								lib/systems/parse.nix
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,173 @@
 | 
			
		||||
# 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;
 | 
			
		||||
  setTypesAssert = type: pred:
 | 
			
		||||
    mapAttrs (name: value:
 | 
			
		||||
      #assert pred value;
 | 
			
		||||
      setType type ({ inherit name; } // value));
 | 
			
		||||
  setTypes = type: setTypesAssert type (_: true);
 | 
			
		||||
 | 
			
		||||
in
 | 
			
		||||
 | 
			
		||||
rec {
 | 
			
		||||
 | 
			
		||||
  isSignificantByte = isType "significant-byte";
 | 
			
		||||
  significantBytes = setTypes "significant-byte" {
 | 
			
		||||
    bigEndian = {};
 | 
			
		||||
    littleEndian = {};
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  isCpuType = isType "cpu-type";
 | 
			
		||||
  cpuTypes = with significantBytes; setTypesAssert "cpu-type"
 | 
			
		||||
    (x: elem x.bits [8 16 32 64 128]
 | 
			
		||||
        && (if 8 < x.bits
 | 
			
		||||
            then isSignificantByte x.significantByte
 | 
			
		||||
            else !(x ? significantByte)))
 | 
			
		||||
  {
 | 
			
		||||
    arm      = { bits = 32; significantByte = littleEndian; family = "arm"; };
 | 
			
		||||
    armv5tel = { bits = 32; significantByte = littleEndian; family = "arm"; };
 | 
			
		||||
    armv6l   = { bits = 32; significantByte = littleEndian; family = "arm"; };
 | 
			
		||||
    armv7a   = { bits = 32; significantByte = littleEndian; family = "arm"; };
 | 
			
		||||
    armv7l   = { bits = 32; significantByte = littleEndian; family = "arm"; };
 | 
			
		||||
    aarch64  = { bits = 64; significantByte = littleEndian; family = "arm"; };
 | 
			
		||||
    i686     = { bits = 32; significantByte = littleEndian; family = "x86"; };
 | 
			
		||||
    x86_64   = { bits = 64; significantByte = littleEndian; family = "x86"; };
 | 
			
		||||
    mips64el = { bits = 32; significantByte = littleEndian; family = "mips"; };
 | 
			
		||||
    powerpc  = { bits = 32; significantByte = bigEndian;    family = "powerpc"; };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  isVendor = isType "vendor";
 | 
			
		||||
  vendors = setTypes "vendor" {
 | 
			
		||||
    apple = {};
 | 
			
		||||
    pc = {};
 | 
			
		||||
    unknown = {};
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  isExecFormat = isType "exec-format";
 | 
			
		||||
  execFormats = setTypes "exec-format" {
 | 
			
		||||
    aout = {}; # a.out
 | 
			
		||||
    elf = {};
 | 
			
		||||
    macho = {};
 | 
			
		||||
    pe = {};
 | 
			
		||||
    unknown = {};
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  isKernelFamily = isType "kernel-family";
 | 
			
		||||
  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; }; };
 | 
			
		||||
    netbsd  = { execFormat = elf;     families = { inherit unix bsd; }; };
 | 
			
		||||
    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; }; };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  isAbi = isType "abi";
 | 
			
		||||
  abis = setTypes "abi" {
 | 
			
		||||
    gnu = {};
 | 
			
		||||
    msvc = {};
 | 
			
		||||
    eabi = {};
 | 
			
		||||
    androideabi = {};
 | 
			
		||||
    unknown = {};
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  isSystem = isType "system";
 | 
			
		||||
  mkSystem = { cpu, vendor, kernel, abi }:
 | 
			
		||||
    assert isCpuType cpu && isVendor vendor && isKernel kernel && isAbi abi;
 | 
			
		||||
    setType "system" {
 | 
			
		||||
      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 = s: matchAttrs { kernel = { families = { inherit (kernelFamilies) windows-nt; }; }; } s
 | 
			
		||||
              || matchAttrs { kernel = { families = { inherit (kernelFamilies) dos; }; }; } s;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  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; };
 | 
			
		||||
    "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 throw "Target specification with 3 components is ambiguous";
 | 
			
		||||
  }.${toString (length l)}
 | 
			
		||||
    or (throw "system string has invalid number of hyphen-separated components");
 | 
			
		||||
 | 
			
		||||
  # This should revert the job done by config.guess from the gcc compiler.
 | 
			
		||||
  mkSystemFromSkeleton = { cpu
 | 
			
		||||
                         , # Optional, but fallback too complex for here.
 | 
			
		||||
                           # Inferred below instead.
 | 
			
		||||
                           vendor ? assert false; null
 | 
			
		||||
                         , kernel
 | 
			
		||||
                         , # 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;
 | 
			
		||||
 | 
			
		||||
    system = 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                     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                     abis.unknown;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
  in mkSystem system;
 | 
			
		||||
 | 
			
		||||
  mkSystemFromString = s: mkSystemFromSkeleton (mkSkeletonFromList (lib.splitString "-" s));
 | 
			
		||||
 | 
			
		||||
  doubleFromSystem = { cpu, vendor, kernel, abi, ... }: "${cpu.name}-${kernel.name}";
 | 
			
		||||
 | 
			
		||||
  tripleFromSystem = { cpu, vendor, kernel, abi, ... } @ sys: assert isSystem sys; let
 | 
			
		||||
    optAbi = lib.optionalString (abi != abis.unknown) "-${abi.name}";
 | 
			
		||||
  in "${cpu.name}-${vendor.name}-${kernel.name}${optAbi}";
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -474,7 +474,7 @@ rec {
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  selectPlatformBySystem = system: {
 | 
			
		||||
  selectBySystem = system: {
 | 
			
		||||
      "i686-linux" = pc32;
 | 
			
		||||
      "x86_64-linux" = pc64;
 | 
			
		||||
      "armv5tel-linux" = sheevaplug;
 | 
			
		||||
@ -1,31 +1,40 @@
 | 
			
		||||
{ nixpkgs }:
 | 
			
		||||
{ nixpkgs ? { outPath = (import ../.).cleanSource ../..; revCount = 1234; shortRev = "abcdef"; }
 | 
			
		||||
, # The platforms for which we build Nixpkgs.
 | 
			
		||||
  supportedSystems ? [ builtins.currentSystem ]
 | 
			
		||||
, # Strip most of attributes when evaluating to spare memory usage
 | 
			
		||||
  scrubJobs ? true
 | 
			
		||||
}:
 | 
			
		||||
 | 
			
		||||
with import ../.. { };
 | 
			
		||||
with import ../../pkgs/top-level/release-lib.nix { inherit supportedSystems scrubJobs; };
 | 
			
		||||
with lib;
 | 
			
		||||
 | 
			
		||||
stdenv.mkDerivation {
 | 
			
		||||
  name = "nixpkgs-lib-tests";
 | 
			
		||||
  buildInputs = [ nix ];
 | 
			
		||||
  NIX_PATH="nixpkgs=${nixpkgs}";
 | 
			
		||||
{
 | 
			
		||||
  systems = import ./systems.nix { inherit lib assertTrue; };
 | 
			
		||||
 | 
			
		||||
  buildCommand = ''
 | 
			
		||||
    datadir="${nix}/share"
 | 
			
		||||
    export TEST_ROOT=$(pwd)/test-tmp
 | 
			
		||||
    export NIX_BUILD_HOOK=
 | 
			
		||||
    export NIX_CONF_DIR=$TEST_ROOT/etc
 | 
			
		||||
    export NIX_DB_DIR=$TEST_ROOT/db
 | 
			
		||||
    export NIX_LOCALSTATE_DIR=$TEST_ROOT/var
 | 
			
		||||
    export NIX_LOG_DIR=$TEST_ROOT/var/log/nix
 | 
			
		||||
    export NIX_MANIFESTS_DIR=$TEST_ROOT/var/nix/manifests
 | 
			
		||||
    export NIX_STATE_DIR=$TEST_ROOT/var/nix
 | 
			
		||||
    export NIX_STORE_DIR=$TEST_ROOT/store
 | 
			
		||||
    export PAGER=cat
 | 
			
		||||
    cacheDir=$TEST_ROOT/binary-cache
 | 
			
		||||
    nix-store --init
 | 
			
		||||
  moduleSystem = pkgs.stdenv.mkDerivation {
 | 
			
		||||
    name = "nixpkgs-lib-tests";
 | 
			
		||||
    buildInputs = [ pkgs.nix ];
 | 
			
		||||
    NIX_PATH="nixpkgs=${nixpkgs}";
 | 
			
		||||
 | 
			
		||||
    cd ${nixpkgs}/lib/tests
 | 
			
		||||
    ./modules.sh
 | 
			
		||||
    buildCommand = ''
 | 
			
		||||
      datadir="${pkgs.nix}/share"
 | 
			
		||||
      export TEST_ROOT=$(pwd)/test-tmp
 | 
			
		||||
      export NIX_BUILD_HOOK=
 | 
			
		||||
      export NIX_CONF_DIR=$TEST_ROOT/etc
 | 
			
		||||
      export NIX_DB_DIR=$TEST_ROOT/db
 | 
			
		||||
      export NIX_LOCALSTATE_DIR=$TEST_ROOT/var
 | 
			
		||||
      export NIX_LOG_DIR=$TEST_ROOT/var/log/nix
 | 
			
		||||
      export NIX_MANIFESTS_DIR=$TEST_ROOT/var/nix/manifests
 | 
			
		||||
      export NIX_STATE_DIR=$TEST_ROOT/var/nix
 | 
			
		||||
      export NIX_STORE_DIR=$TEST_ROOT/store
 | 
			
		||||
      export PAGER=cat
 | 
			
		||||
      cacheDir=$TEST_ROOT/binary-cache
 | 
			
		||||
      nix-store --init
 | 
			
		||||
 | 
			
		||||
    touch $out
 | 
			
		||||
  '';
 | 
			
		||||
      cd ${nixpkgs}/lib/tests
 | 
			
		||||
      ./modules.sh
 | 
			
		||||
 | 
			
		||||
      touch $out
 | 
			
		||||
    '';
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										31
									
								
								lib/tests/systems.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								lib/tests/systems.nix
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,31 @@
 | 
			
		||||
# We assert that the new algorithmic way of generating these lists matches the
 | 
			
		||||
# way they were hard-coded before.
 | 
			
		||||
#
 | 
			
		||||
# One might think "if we exhaustively test, what's the point of procedurally
 | 
			
		||||
# calculating the lists anyway?". The answer is one can mindlessly update these
 | 
			
		||||
# tests as new platforms become supported, and then just give the diff a quick
 | 
			
		||||
# sanity check before committing :).
 | 
			
		||||
{ lib, assertTrue }:
 | 
			
		||||
 | 
			
		||||
with lib.systems.doubles;
 | 
			
		||||
 | 
			
		||||
let mseteq = x: y: lib.sort lib.lessThan x == lib.sort lib.lessThan y; in
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
  all = assertTrue (mseteq all (linux ++ darwin ++ cygwin ++ freebsd ++ openbsd ++ netbsd ++ illumos));
 | 
			
		||||
 | 
			
		||||
  arm = assertTrue (mseteq arm [ "armv5tel-linux" "armv6l-linux" "armv7l-linux" ]);
 | 
			
		||||
  i686 = assertTrue (mseteq i686 [ "i686-linux" "i686-freebsd" "i686-netbsd" "i686-openbsd" "i686-cygwin" ]);
 | 
			
		||||
  mips = assertTrue (mseteq mips [ "mips64el-linux" ]);
 | 
			
		||||
  x86_64 = assertTrue (mseteq x86_64 [ "x86_64-linux" "x86_64-darwin" "x86_64-freebsd" "x86_64-openbsd" "x86_64-netbsd" "x86_64-cygwin" "x86_64-solaris" ]);
 | 
			
		||||
 | 
			
		||||
  cygwin = assertTrue (mseteq cygwin [ "i686-cygwin" "x86_64-cygwin" ]);
 | 
			
		||||
  darwin = assertTrue (mseteq darwin [ "x86_64-darwin" ]);
 | 
			
		||||
  freebsd = assertTrue (mseteq freebsd [ "i686-freebsd" "x86_64-freebsd" ]);
 | 
			
		||||
  gnu = assertTrue (mseteq gnu (linux /* ++ hurd ++ kfreebsd ++ ... */));
 | 
			
		||||
  illumos = assertTrue (mseteq illumos [ "x86_64-solaris" ]);
 | 
			
		||||
  linux = assertTrue (mseteq linux [ "i686-linux" "x86_64-linux" "armv5tel-linux" "armv6l-linux" "armv7l-linux" "aarch64-linux" "mips64el-linux" ]);
 | 
			
		||||
  netbsd = assertTrue (mseteq netbsd [ "i686-netbsd" "x86_64-netbsd" ]);
 | 
			
		||||
  openbsd = assertTrue (mseteq openbsd [ "i686-openbsd" "x86_64-openbsd" ]);
 | 
			
		||||
  unix = assertTrue (mseteq unix (linux ++ darwin ++ freebsd ++ openbsd ++ netbsd ++ illumos));
 | 
			
		||||
}
 | 
			
		||||
@ -303,7 +303,7 @@ with pkgs;
 | 
			
		||||
 | 
			
		||||
  composableDerivation = callPackage ../../lib/composable-derivation.nix { };
 | 
			
		||||
 | 
			
		||||
  platforms = import ./platforms.nix;
 | 
			
		||||
  inherit (lib.systems) platforms;
 | 
			
		||||
 | 
			
		||||
  setJavaClassPath = makeSetupHook { } ../build-support/setup-hooks/set-java-classpath.sh;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -40,6 +40,7 @@
 | 
			
		||||
 | 
			
		||||
let # Rename the function arguments
 | 
			
		||||
  configExpr = config;
 | 
			
		||||
  crossSystem0 = crossSystem;
 | 
			
		||||
 | 
			
		||||
in let
 | 
			
		||||
  lib = import ../../lib;
 | 
			
		||||
@ -52,12 +53,15 @@ in let
 | 
			
		||||
    then configExpr { inherit pkgs; }
 | 
			
		||||
    else configExpr;
 | 
			
		||||
 | 
			
		||||
  # Allow setting the platform in the config file. Otherwise, let's use a
 | 
			
		||||
  # reasonable default.
 | 
			
		||||
  localSystem =
 | 
			
		||||
    { platform = (import ./platforms.nix).selectPlatformBySystem args.localSystem.system; }
 | 
			
		||||
    // builtins.intersectAttrs { platform = null; } config
 | 
			
		||||
    // args.localSystem;
 | 
			
		||||
  # From a minimum of `system` or `config` (actually a target triple, *not*
 | 
			
		||||
  # nixpkgs configuration), infer the other one and platform as needed.
 | 
			
		||||
  localSystem = lib.systems.elaborate (
 | 
			
		||||
    # Allow setting the platform in the config file. This take precedence over
 | 
			
		||||
    # the inferred platform, but not over an explicitly passed-in onw.
 | 
			
		||||
    builtins.intersectAttrs { platform = null; } config
 | 
			
		||||
    // args.localSystem);
 | 
			
		||||
 | 
			
		||||
  crossSystem = lib.mapNullable lib.systems.elaborate crossSystem0;
 | 
			
		||||
 | 
			
		||||
  # A few packages make a new package set to draw their dependencies from.
 | 
			
		||||
  # (Currently to get a cross tool chain, or forced-i686 package.) Rather than
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,3 @@
 | 
			
		||||
 | 
			
		||||
{ # The platforms for which we build Nixpkgs.
 | 
			
		||||
  supportedSystems ? [ builtins.currentSystem ]
 | 
			
		||||
, # Strip most of attributes when evaluating to spare memory usage
 | 
			
		||||
@ -8,8 +7,6 @@
 | 
			
		||||
with import ./release-lib.nix { inherit supportedSystems scrubJobs; };
 | 
			
		||||
 | 
			
		||||
let
 | 
			
		||||
  inherit (pkgs) lib;
 | 
			
		||||
 | 
			
		||||
  nativePlatforms = linux;
 | 
			
		||||
 | 
			
		||||
  /* Basic list of packages to cross-build */
 | 
			
		||||
@ -50,11 +47,11 @@ in
 | 
			
		||||
    # cause false negatives.
 | 
			
		||||
    testEqualOne = path: system: let
 | 
			
		||||
      f = path: attrs: builtins.toString (lib.getAttrFromPath path (allPackages attrs));
 | 
			
		||||
    in assert
 | 
			
		||||
    in assertTrue (
 | 
			
		||||
        f path { inherit system; }
 | 
			
		||||
        ==
 | 
			
		||||
        f (["buildPackages"] ++ path) { inherit system crossSystem; };
 | 
			
		||||
      true;
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
    testEqual = path: systems: forAllSupportedSystems systems (testEqualOne path);
 | 
			
		||||
 | 
			
		||||
@ -139,16 +136,7 @@ in
 | 
			
		||||
      float = "hard";
 | 
			
		||||
      withTLS = true;
 | 
			
		||||
      libc = "glibc";
 | 
			
		||||
      platform = {
 | 
			
		||||
        name = "fuloong-minipc";
 | 
			
		||||
        kernelMajor = "2.6";
 | 
			
		||||
        kernelBaseConfig = "lemote2f_defconfig";
 | 
			
		||||
        kernelHeadersBaseConfig = "fuloong2e_defconfig";
 | 
			
		||||
        uboot = null;
 | 
			
		||||
        kernelArch = "mips";
 | 
			
		||||
        kernelAutoModules = false;
 | 
			
		||||
        kernelTarget = "vmlinux";
 | 
			
		||||
      };
 | 
			
		||||
      platform = lib.platforms.fuloong2f_n32;
 | 
			
		||||
      openssl.system = "linux-generic32";
 | 
			
		||||
      gcc = {
 | 
			
		||||
        arch = "loongson2f";
 | 
			
		||||
@ -172,7 +160,7 @@ in
 | 
			
		||||
      fpu = "vfp";
 | 
			
		||||
      withTLS = true;
 | 
			
		||||
      libc = "glibc";
 | 
			
		||||
      platform = pkgs.platforms.raspberrypi;
 | 
			
		||||
      platform = lib.platforms.raspberrypi;
 | 
			
		||||
      openssl.system = "linux-generic32";
 | 
			
		||||
      gcc = {
 | 
			
		||||
        arch = "armv6";
 | 
			
		||||
 | 
			
		||||
@ -5,13 +5,16 @@
 | 
			
		||||
  nixpkgsArgs ? { config = { allowUnfree = false; inHydra = true; }; }
 | 
			
		||||
}:
 | 
			
		||||
 | 
			
		||||
with import ../../lib;
 | 
			
		||||
let
 | 
			
		||||
  lib = import ../../lib;
 | 
			
		||||
in with lib;
 | 
			
		||||
 | 
			
		||||
rec {
 | 
			
		||||
 | 
			
		||||
  allPackages = args: packageSet (args // nixpkgsArgs);
 | 
			
		||||
 | 
			
		||||
  pkgs = pkgsFor "x86_64-linux";
 | 
			
		||||
  inherit lib;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  hydraJob' = if scrubJobs then hydraJob else id;
 | 
			
		||||
@ -41,6 +44,11 @@ rec {
 | 
			
		||||
  pkgs_x86_64_cygwin = allPackages { system = "x86_64-cygwin"; };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  assertTrue = bool:
 | 
			
		||||
    if bool
 | 
			
		||||
    then pkgs.runCommand "evaluated-to-true" {} "touch $out"
 | 
			
		||||
    else pkgs.runCommand "evaluated-to-false" {} "false";
 | 
			
		||||
 | 
			
		||||
  /* The working or failing mails for cross builds will be sent only to
 | 
			
		||||
     the following maintainers, as most package maintainers will not be
 | 
			
		||||
     interested in the result of cross building a package. */
 | 
			
		||||
 | 
			
		||||
@ -3,14 +3,14 @@
 | 
			
		||||
   $ hydra-eval-jobs pkgs/top-level/release-python.nix
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
{ nixpkgs ? { outPath = (import ../.. {}).lib.cleanSource ../..; revCount = 1234; shortRev = "abcdef"; }
 | 
			
		||||
{ nixpkgs ? { outPath = (import ../../lib).cleanSource ../..; revCount = 1234; shortRev = "abcdef"; }
 | 
			
		||||
, officialRelease ? false
 | 
			
		||||
, # The platforms for which we build Nixpkgs.
 | 
			
		||||
  supportedSystems ? [ "x86_64-linux" ]
 | 
			
		||||
}:
 | 
			
		||||
 | 
			
		||||
with import ../../lib;
 | 
			
		||||
with import ./release-lib.nix {inherit supportedSystems; };
 | 
			
		||||
with lib;
 | 
			
		||||
 | 
			
		||||
let
 | 
			
		||||
  packagePython = mapAttrs (name: value:
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
/* A small release file, with few packages to be built.  The aim is to reduce
 | 
			
		||||
   the load on Hydra when testing the `stdenv-updates' branch. */
 | 
			
		||||
 | 
			
		||||
{ nixpkgs ? { outPath = (import ../.. {}).lib.cleanSource ../..; revCount = 1234; shortRev = "abcdef"; }
 | 
			
		||||
{ nixpkgs ? { outPath = (import ../../lib).cleanSource ../..; revCount = 1234; shortRev = "abcdef"; }
 | 
			
		||||
, supportedSystems ? [ "x86_64-linux" "i686-linux" "x86_64-darwin" ]
 | 
			
		||||
}:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -9,7 +9,7 @@
 | 
			
		||||
   $ nix-build pkgs/top-level/release.nix -A coreutils.x86_64-linux
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
{ nixpkgs ? { outPath = (import ../.. {}).lib.cleanSource ../..; revCount = 1234; shortRev = "abcdef"; }
 | 
			
		||||
{ nixpkgs ? { outPath = (import ../../lib).cleanSource ../..; revCount = 1234; shortRev = "abcdef"; }
 | 
			
		||||
, officialRelease ? false
 | 
			
		||||
, # The platforms for which we build Nixpkgs.
 | 
			
		||||
  supportedSystems ? [ "x86_64-linux" "i686-linux" "x86_64-darwin" "aarch64-linux" ]
 | 
			
		||||
@ -22,16 +22,13 @@
 | 
			
		||||
with import ./release-lib.nix { inherit supportedSystems scrubJobs nixpkgsArgs; };
 | 
			
		||||
 | 
			
		||||
let
 | 
			
		||||
 | 
			
		||||
  lib = pkgs.lib;
 | 
			
		||||
 | 
			
		||||
  jobs =
 | 
			
		||||
    { tarball = import ./make-tarball.nix { inherit pkgs nixpkgs officialRelease; };
 | 
			
		||||
 | 
			
		||||
      metrics = import ./metrics.nix { inherit pkgs nixpkgs; };
 | 
			
		||||
 | 
			
		||||
      manual = import ../../doc;
 | 
			
		||||
      lib-tests = import ../../lib/tests/release.nix { inherit nixpkgs; };
 | 
			
		||||
      lib-tests = import ../../lib/tests/release.nix { inherit nixpkgs supportedSystems scrubJobs; };
 | 
			
		||||
 | 
			
		||||
      darwin-tested = pkgs.releaseTools.aggregate
 | 
			
		||||
        { name = "nixpkgs-darwin-${jobs.tarball.version}";
 | 
			
		||||
@ -55,7 +52,6 @@ let
 | 
			
		||||
            [ jobs.tarball
 | 
			
		||||
              jobs.metrics
 | 
			
		||||
              jobs.manual
 | 
			
		||||
              jobs.lib-tests
 | 
			
		||||
              jobs.stdenv.x86_64-linux
 | 
			
		||||
              jobs.stdenv.i686-linux
 | 
			
		||||
              jobs.stdenv.x86_64-darwin
 | 
			
		||||
@ -82,7 +78,8 @@ let
 | 
			
		||||
              jobs.git.x86_64-darwin
 | 
			
		||||
              jobs.mysql.x86_64-darwin
 | 
			
		||||
              jobs.vim.x86_64-darwin
 | 
			
		||||
            ] ++ lib.collect lib.isDerivation jobs.stdenvBootstrapTools;
 | 
			
		||||
            ] ++ lib.collect lib.isDerivation jobs.stdenvBootstrapTools
 | 
			
		||||
              ++ lib.collect lib.isDerivation jobs.lib-tests;
 | 
			
		||||
        };
 | 
			
		||||
    } // (lib.optionalAttrs (builtins.elem "i686-linux" supportedSystems) {
 | 
			
		||||
      stdenvBootstrapTools.i686-linux =
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user