Merge pull request #24610 from Ericson2314/platform-normalization
Platform normalization
This commit is contained in:
commit
f0b634c7e8
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
let
|
let
|
||||||
inherit (builtins) head tail length;
|
inherit (builtins) head tail length;
|
||||||
inherit (import ./trivial.nix) or;
|
inherit (import ./trivial.nix) and or;
|
||||||
inherit (import ./default.nix) fold;
|
inherit (import ./default.nix) fold;
|
||||||
inherit (import ./strings.nix) concatStringsSep;
|
inherit (import ./strings.nix) concatStringsSep;
|
||||||
inherit (import ./lists.nix) concatMap concatLists all deepSeqList;
|
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.
|
/* Returns true if the pattern is contained in the set. False otherwise.
|
||||||
|
|
||||||
FIXME(zimbatm): this example doesn't work !!!
|
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
sys = mkSystem { }
|
matchAttrs { cpu = {}; } { cpu = { bits = 64; }; }
|
||||||
matchAttrs { cpu = { bits = 64; }; } sys
|
|
||||||
=> true
|
=> true
|
||||||
*/
|
*/
|
||||||
matchAttrs = pattern: attrs:
|
matchAttrs = pattern: attrs: assert isAttrs pattern;
|
||||||
fold or false (attrValues (zipAttrsWithNames (attrNames pattern) (n: values:
|
fold and true (attrValues (zipAttrsWithNames (attrNames pattern) (n: values:
|
||||||
let pat = head values; val = head (tail values); in
|
let pat = head values; val = head (tail values); in
|
||||||
if length values == 1 then false
|
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
|
else pat == val
|
||||||
) [pattern attrs]));
|
) [pattern attrs]));
|
||||||
|
|
||||||
|
@ -27,8 +27,7 @@ let
|
|||||||
|
|
||||||
# constants
|
# constants
|
||||||
licenses = import ./licenses.nix;
|
licenses = import ./licenses.nix;
|
||||||
platforms = import ./platforms.nix;
|
systems = import ./systems;
|
||||||
systems = import ./systems.nix;
|
|
||||||
|
|
||||||
# misc
|
# misc
|
||||||
debug = import ./debug.nix;
|
debug = import ./debug.nix;
|
||||||
@ -47,13 +46,15 @@ in
|
|||||||
attrsets lists strings stringsWithDeps
|
attrsets lists strings stringsWithDeps
|
||||||
customisation maintainers meta sources
|
customisation maintainers meta sources
|
||||||
modules options types
|
modules options types
|
||||||
licenses platforms systems
|
licenses systems
|
||||||
debug generators misc
|
debug generators misc
|
||||||
sandbox fetchers filesystem;
|
sandbox fetchers filesystem;
|
||||||
|
|
||||||
|
# back-compat aliases
|
||||||
|
platforms = systems.doubles;
|
||||||
}
|
}
|
||||||
# !!! don't include everything at top-level; perhaps only the most
|
# !!! don't include everything at top-level; perhaps only the most
|
||||||
# commonly used functions.
|
# commonly used functions.
|
||||||
// trivial // lists // strings // stringsWithDeps // attrsets // sources
|
// trivial // lists // strings // stringsWithDeps // attrsets // sources
|
||||||
// options // types // meta // debug // misc // modules
|
// options // types // meta // debug // misc // modules
|
||||||
// systems
|
|
||||||
// customisation
|
// 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;
|
"i686-linux" = pc32;
|
||||||
"x86_64-linux" = pc64;
|
"x86_64-linux" = pc64;
|
||||||
"armv5tel-linux" = sheevaplug;
|
"armv5tel-linux" = sheevaplug;
|
@ -1,15 +1,23 @@
|
|||||||
{ 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;
|
with lib;
|
||||||
|
|
||||||
stdenv.mkDerivation {
|
{
|
||||||
|
systems = import ./systems.nix { inherit lib assertTrue; };
|
||||||
|
|
||||||
|
moduleSystem = pkgs.stdenv.mkDerivation {
|
||||||
name = "nixpkgs-lib-tests";
|
name = "nixpkgs-lib-tests";
|
||||||
buildInputs = [ nix ];
|
buildInputs = [ pkgs.nix ];
|
||||||
NIX_PATH="nixpkgs=${nixpkgs}";
|
NIX_PATH="nixpkgs=${nixpkgs}";
|
||||||
|
|
||||||
buildCommand = ''
|
buildCommand = ''
|
||||||
datadir="${nix}/share"
|
datadir="${pkgs.nix}/share"
|
||||||
export TEST_ROOT=$(pwd)/test-tmp
|
export TEST_ROOT=$(pwd)/test-tmp
|
||||||
export NIX_BUILD_HOOK=
|
export NIX_BUILD_HOOK=
|
||||||
export NIX_CONF_DIR=$TEST_ROOT/etc
|
export NIX_CONF_DIR=$TEST_ROOT/etc
|
||||||
@ -28,4 +36,5 @@ stdenv.mkDerivation {
|
|||||||
|
|
||||||
touch $out
|
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 { };
|
composableDerivation = callPackage ../../lib/composable-derivation.nix { };
|
||||||
|
|
||||||
platforms = import ./platforms.nix;
|
inherit (lib.systems) platforms;
|
||||||
|
|
||||||
setJavaClassPath = makeSetupHook { } ../build-support/setup-hooks/set-java-classpath.sh;
|
setJavaClassPath = makeSetupHook { } ../build-support/setup-hooks/set-java-classpath.sh;
|
||||||
|
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
|
|
||||||
let # Rename the function arguments
|
let # Rename the function arguments
|
||||||
configExpr = config;
|
configExpr = config;
|
||||||
|
crossSystem0 = crossSystem;
|
||||||
|
|
||||||
in let
|
in let
|
||||||
lib = import ../../lib;
|
lib = import ../../lib;
|
||||||
@ -52,12 +53,15 @@ in let
|
|||||||
then configExpr { inherit pkgs; }
|
then configExpr { inherit pkgs; }
|
||||||
else configExpr;
|
else configExpr;
|
||||||
|
|
||||||
# Allow setting the platform in the config file. Otherwise, let's use a
|
# From a minimum of `system` or `config` (actually a target triple, *not*
|
||||||
# reasonable default.
|
# nixpkgs configuration), infer the other one and platform as needed.
|
||||||
localSystem =
|
localSystem = lib.systems.elaborate (
|
||||||
{ platform = (import ./platforms.nix).selectPlatformBySystem args.localSystem.system; }
|
# Allow setting the platform in the config file. This take precedence over
|
||||||
// builtins.intersectAttrs { platform = null; } config
|
# the inferred platform, but not over an explicitly passed-in onw.
|
||||||
// args.localSystem;
|
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.
|
# 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
|
# (Currently to get a cross tool chain, or forced-i686 package.) Rather than
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
{ # The platforms for which we build Nixpkgs.
|
{ # The platforms for which we build Nixpkgs.
|
||||||
supportedSystems ? [ builtins.currentSystem ]
|
supportedSystems ? [ builtins.currentSystem ]
|
||||||
, # Strip most of attributes when evaluating to spare memory usage
|
, # Strip most of attributes when evaluating to spare memory usage
|
||||||
@ -8,8 +7,6 @@
|
|||||||
with import ./release-lib.nix { inherit supportedSystems scrubJobs; };
|
with import ./release-lib.nix { inherit supportedSystems scrubJobs; };
|
||||||
|
|
||||||
let
|
let
|
||||||
inherit (pkgs) lib;
|
|
||||||
|
|
||||||
nativePlatforms = linux;
|
nativePlatforms = linux;
|
||||||
|
|
||||||
/* Basic list of packages to cross-build */
|
/* Basic list of packages to cross-build */
|
||||||
@ -50,11 +47,11 @@ in
|
|||||||
# cause false negatives.
|
# cause false negatives.
|
||||||
testEqualOne = path: system: let
|
testEqualOne = path: system: let
|
||||||
f = path: attrs: builtins.toString (lib.getAttrFromPath path (allPackages attrs));
|
f = path: attrs: builtins.toString (lib.getAttrFromPath path (allPackages attrs));
|
||||||
in assert
|
in assertTrue (
|
||||||
f path { inherit system; }
|
f path { inherit system; }
|
||||||
==
|
==
|
||||||
f (["buildPackages"] ++ path) { inherit system crossSystem; };
|
f (["buildPackages"] ++ path) { inherit system crossSystem; };
|
||||||
true;
|
);
|
||||||
|
|
||||||
testEqual = path: systems: forAllSupportedSystems systems (testEqualOne path);
|
testEqual = path: systems: forAllSupportedSystems systems (testEqualOne path);
|
||||||
|
|
||||||
@ -139,16 +136,7 @@ in
|
|||||||
float = "hard";
|
float = "hard";
|
||||||
withTLS = true;
|
withTLS = true;
|
||||||
libc = "glibc";
|
libc = "glibc";
|
||||||
platform = {
|
platform = lib.platforms.fuloong2f_n32;
|
||||||
name = "fuloong-minipc";
|
|
||||||
kernelMajor = "2.6";
|
|
||||||
kernelBaseConfig = "lemote2f_defconfig";
|
|
||||||
kernelHeadersBaseConfig = "fuloong2e_defconfig";
|
|
||||||
uboot = null;
|
|
||||||
kernelArch = "mips";
|
|
||||||
kernelAutoModules = false;
|
|
||||||
kernelTarget = "vmlinux";
|
|
||||||
};
|
|
||||||
openssl.system = "linux-generic32";
|
openssl.system = "linux-generic32";
|
||||||
gcc = {
|
gcc = {
|
||||||
arch = "loongson2f";
|
arch = "loongson2f";
|
||||||
@ -172,7 +160,7 @@ in
|
|||||||
fpu = "vfp";
|
fpu = "vfp";
|
||||||
withTLS = true;
|
withTLS = true;
|
||||||
libc = "glibc";
|
libc = "glibc";
|
||||||
platform = pkgs.platforms.raspberrypi;
|
platform = lib.platforms.raspberrypi;
|
||||||
openssl.system = "linux-generic32";
|
openssl.system = "linux-generic32";
|
||||||
gcc = {
|
gcc = {
|
||||||
arch = "armv6";
|
arch = "armv6";
|
||||||
|
@ -5,13 +5,16 @@
|
|||||||
nixpkgsArgs ? { config = { allowUnfree = false; inHydra = true; }; }
|
nixpkgsArgs ? { config = { allowUnfree = false; inHydra = true; }; }
|
||||||
}:
|
}:
|
||||||
|
|
||||||
with import ../../lib;
|
let
|
||||||
|
lib = import ../../lib;
|
||||||
|
in with lib;
|
||||||
|
|
||||||
rec {
|
rec {
|
||||||
|
|
||||||
allPackages = args: packageSet (args // nixpkgsArgs);
|
allPackages = args: packageSet (args // nixpkgsArgs);
|
||||||
|
|
||||||
pkgs = pkgsFor "x86_64-linux";
|
pkgs = pkgsFor "x86_64-linux";
|
||||||
|
inherit lib;
|
||||||
|
|
||||||
|
|
||||||
hydraJob' = if scrubJobs then hydraJob else id;
|
hydraJob' = if scrubJobs then hydraJob else id;
|
||||||
@ -41,6 +44,11 @@ rec {
|
|||||||
pkgs_x86_64_cygwin = allPackages { system = "x86_64-cygwin"; };
|
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 working or failing mails for cross builds will be sent only to
|
||||||
the following maintainers, as most package maintainers will not be
|
the following maintainers, as most package maintainers will not be
|
||||||
interested in the result of cross building a package. */
|
interested in the result of cross building a package. */
|
||||||
|
@ -3,14 +3,14 @@
|
|||||||
$ hydra-eval-jobs pkgs/top-level/release-python.nix
|
$ 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
|
, officialRelease ? false
|
||||||
, # The platforms for which we build Nixpkgs.
|
, # The platforms for which we build Nixpkgs.
|
||||||
supportedSystems ? [ "x86_64-linux" ]
|
supportedSystems ? [ "x86_64-linux" ]
|
||||||
}:
|
}:
|
||||||
|
|
||||||
with import ../../lib;
|
|
||||||
with import ./release-lib.nix {inherit supportedSystems; };
|
with import ./release-lib.nix {inherit supportedSystems; };
|
||||||
|
with lib;
|
||||||
|
|
||||||
let
|
let
|
||||||
packagePython = mapAttrs (name: value:
|
packagePython = mapAttrs (name: value:
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* A small release file, with few packages to be built. The aim is to reduce
|
/* 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. */
|
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" ]
|
, 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
|
$ 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
|
, officialRelease ? false
|
||||||
, # The platforms for which we build Nixpkgs.
|
, # The platforms for which we build Nixpkgs.
|
||||||
supportedSystems ? [ "x86_64-linux" "i686-linux" "x86_64-darwin" "aarch64-linux" ]
|
supportedSystems ? [ "x86_64-linux" "i686-linux" "x86_64-darwin" "aarch64-linux" ]
|
||||||
@ -22,16 +22,13 @@
|
|||||||
with import ./release-lib.nix { inherit supportedSystems scrubJobs nixpkgsArgs; };
|
with import ./release-lib.nix { inherit supportedSystems scrubJobs nixpkgsArgs; };
|
||||||
|
|
||||||
let
|
let
|
||||||
|
|
||||||
lib = pkgs.lib;
|
|
||||||
|
|
||||||
jobs =
|
jobs =
|
||||||
{ tarball = import ./make-tarball.nix { inherit pkgs nixpkgs officialRelease; };
|
{ tarball = import ./make-tarball.nix { inherit pkgs nixpkgs officialRelease; };
|
||||||
|
|
||||||
metrics = import ./metrics.nix { inherit pkgs nixpkgs; };
|
metrics = import ./metrics.nix { inherit pkgs nixpkgs; };
|
||||||
|
|
||||||
manual = import ../../doc;
|
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
|
darwin-tested = pkgs.releaseTools.aggregate
|
||||||
{ name = "nixpkgs-darwin-${jobs.tarball.version}";
|
{ name = "nixpkgs-darwin-${jobs.tarball.version}";
|
||||||
@ -55,7 +52,6 @@ let
|
|||||||
[ jobs.tarball
|
[ jobs.tarball
|
||||||
jobs.metrics
|
jobs.metrics
|
||||||
jobs.manual
|
jobs.manual
|
||||||
jobs.lib-tests
|
|
||||||
jobs.stdenv.x86_64-linux
|
jobs.stdenv.x86_64-linux
|
||||||
jobs.stdenv.i686-linux
|
jobs.stdenv.i686-linux
|
||||||
jobs.stdenv.x86_64-darwin
|
jobs.stdenv.x86_64-darwin
|
||||||
@ -82,7 +78,8 @@ let
|
|||||||
jobs.git.x86_64-darwin
|
jobs.git.x86_64-darwin
|
||||||
jobs.mysql.x86_64-darwin
|
jobs.mysql.x86_64-darwin
|
||||||
jobs.vim.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) {
|
} // (lib.optionalAttrs (builtins.elem "i686-linux" supportedSystems) {
|
||||||
stdenvBootstrapTools.i686-linux =
|
stdenvBootstrapTools.i686-linux =
|
||||||
|
Loading…
x
Reference in New Issue
Block a user