{ supportedSystems , packageSet ? (import ../..) , scrubJobs ? true }: with import ../../lib; rec { # Ensure that we don't build packages marked as unfree. allPackages = args: packageSet (args // { config.allowUnfree = false; config.inHydra = true; }); 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 == "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_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 ]; /* 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: genAttrs (filter (x: elem x supportedSystems) 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: genAttrs (filter (x: elem x supportedSystems) 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.)'. */ 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; }