d45df036c3
This allows customizing the nixpkgs arguments by the caller. My use case is creating a personal nixpkgs channel containing some unfree packages. The default is still to not build unfree packages, so for nixpkgs this is no functional change.
106 lines
4.1 KiB
Nix
106 lines
4.1 KiB
Nix
{ supportedSystems
|
||
, packageSet ? (import ../..)
|
||
, scrubJobs ? true
|
||
, # Attributes passed to nixpkgs. Don't build packages marked as unfree.
|
||
nixpkgsArgs ? { config = { allowUnfree = false; inHydra = true; }; }
|
||
}:
|
||
|
||
with import ../../lib;
|
||
|
||
rec {
|
||
|
||
allPackages = args: packageSet (args // nixpkgsArgs);
|
||
|
||
pkgs = pkgsFor "x86_64-linux";
|
||
|
||
|
||
hydraJob' = if scrubJobs then hydraJob else id;
|
||
|
||
|
||
/* !!! Hack: poor man's memoisation function. Necessary to prevent
|
||
Nixpkgs from being evaluated again and again for every
|
||
job/platform pair. */
|
||
pkgsFor = system:
|
||
if system == "x86_64-linux" then pkgs_x86_64_linux
|
||
else if system == "i686-linux" then pkgs_i686_linux
|
||
else if system == "aarch64-linux" then pkgs_aarch64_linux
|
||
else if system == "x86_64-darwin" then pkgs_x86_64_darwin
|
||
else if system == "x86_64-freebsd" then pkgs_x86_64_freebsd
|
||
else if system == "i686-freebsd" then pkgs_i686_freebsd
|
||
else if system == "i686-cygwin" then pkgs_i686_cygwin
|
||
else if system == "x86_64-cygwin" then pkgs_x86_64_cygwin
|
||
else abort "unsupported system type: ${system}";
|
||
|
||
pkgs_x86_64_linux = allPackages { system = "x86_64-linux"; };
|
||
pkgs_i686_linux = allPackages { system = "i686-linux"; };
|
||
pkgs_aarch64_linux = allPackages { system = "aarch64-linux"; };
|
||
pkgs_x86_64_darwin = allPackages { system = "x86_64-darwin"; };
|
||
pkgs_x86_64_freebsd = allPackages { system = "x86_64-freebsd"; };
|
||
pkgs_i686_freebsd = allPackages { system = "i686-freebsd"; };
|
||
pkgs_i686_cygwin = allPackages { system = "i686-cygwin"; };
|
||
pkgs_x86_64_cygwin = allPackages { system = "x86_64-cygwin"; };
|
||
|
||
|
||
/* 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. */
|
||
crossMaintainers = [ maintainers.viric ];
|
||
|
||
forAllSupportedSystems = systems: f:
|
||
genAttrs (filter (x: elem x supportedSystems) systems) f;
|
||
|
||
/* Build a package on the given set of platforms. The function `f'
|
||
is called for each supported platform with Nixpkgs for that
|
||
platform as an argument . We return an attribute set containing
|
||
a derivation for each supported platform, i.e. ‘{ x86_64-linux =
|
||
f pkgs_x86_64_linux; i686-linux = f pkgs_i686_linux; ... }’. */
|
||
testOn = systems: f: forAllSupportedSystems systems
|
||
(system: hydraJob' (f (pkgsFor system)));
|
||
|
||
|
||
/* Similar to the testOn function, but with an additional
|
||
'crossSystem' parameter for allPackages, defining the target
|
||
platform for cross builds. */
|
||
testOnCross = crossSystem: systems: f: forAllSupportedSystems systems
|
||
(system: hydraJob' (f (allPackages { inherit system crossSystem; })));
|
||
|
||
|
||
/* Given a nested set where the leaf nodes are lists of platforms,
|
||
map each leaf node to `testOn [platforms...] (pkgs:
|
||
pkgs.<attrPath>)'. */
|
||
mapTestOn = mapAttrsRecursive
|
||
(path: systems: testOn systems (pkgs: getAttrFromPath path pkgs));
|
||
|
||
|
||
/* Similar to the testOn function, but with an additional 'crossSystem'
|
||
* parameter for allPackages, defining the target platform for cross builds,
|
||
* and triggering the build of the host derivation (cross built - crossDrv). */
|
||
mapTestOnCross = crossSystem: mapAttrsRecursive
|
||
(path: systems: testOnCross crossSystem systems
|
||
(pkgs: addMetaAttrs { maintainers = crossMaintainers; } (getAttrFromPath path pkgs)));
|
||
|
||
|
||
/* Recursively map a (nested) set of derivations to an isomorphic
|
||
set of meta.platforms values. */
|
||
packagePlatforms = mapAttrs (name: value:
|
||
let res = builtins.tryEval (
|
||
if isDerivation value then
|
||
value.meta.hydraPlatforms or (value.meta.platforms or [ "x86_64-linux" ])
|
||
else if value.recurseForDerivations or false || value.recurseForRelease or false then
|
||
packagePlatforms value
|
||
else
|
||
[]);
|
||
in if res.success then res.value else []
|
||
);
|
||
|
||
|
||
/* Common platform groups on which to test packages. */
|
||
inherit (platforms) unix linux darwin cygwin allBut all mesaPlatforms;
|
||
|
||
/* Platform groups for specific kinds of applications. */
|
||
x11Supported = linux;
|
||
gtkSupported = linux;
|
||
ghcSupported = linux;
|
||
|
||
}
|