diff --git a/pkgs/top-level/release-unfree-redistributable.nix b/pkgs/top-level/release-unfree-redistributable.nix new file mode 100644 index 000000000000..96384e9fb020 --- /dev/null +++ b/pkgs/top-level/release-unfree-redistributable.nix @@ -0,0 +1,122 @@ +/* + Nixpkgs unfree+redistributable packages. + + NOTE: This file is used by the sister nix-community project. + + The official Hydra instance only builds and provides binary caches for free + packages (as in OSI-approved). + + Some unfree packages such as MongoDB, ZeroTier, ... take a while to be + built. While their license is not free, they allow redistribution of + build artefacts. + + The sister project nix-community will build and distribute those packages + for a subset of the channels to . + + See also: + + * + * + + Test for example like this: + + $ hydra-eval-jobs pkgs/top-level/release-unfree-redistributable.nix -I . +*/ + +{ + # The platforms for which we build Nixpkgs. + supportedSystems ? [ + "x86_64-linux" + "aarch64-linux" + ], + # Attributes passed to nixpkgs. + nixpkgsArgs ? { + config = { + allowAliases = false; + allowUnfree = true; + cudaSupport = true; + inHydra = true; + }; + }, + # We only build the full package set on infrequently releasing channels. + full ? false, +}: + +let + release-lib = import ./release-lib.nix { + inherit supportedSystems nixpkgsArgs; + }; + + inherit (release-lib) + lib + mapTestOn + pkgs + ; + + # similar to release-lib.packagePlatforms, but also includes some condition for which package to pick + packagesWith = + prefix: cond: + lib.mapAttrs ( + name: value: + let + attrPath = if prefix == "" then name else "${prefix}.${name}"; + res = builtins.tryEval ( + if lib.isDerivation value then + lib.optionals (cond attrPath value) ( + # logic copied from release-lib packagePlatforms + value.meta.hydraPlatforms + or (lib.subtractLists (value.meta.badPlatforms or [ ]) (value.meta.platforms or [ "x86_64-linux" ])) + ) + else if + value.recurseForDerivations or false + || value.recurseForRelease or false + || value.__recurseIntoDerivationForReleaseJobs or false + then + # Recurse + packagesWith attrPath cond value + else + [ ] + ); + in + lib.optionals res.success res.value + ); + + # Unfree is any license not OSI-approved. + isUnfree = pkg: lib.lists.any (l: !(l.free or true)) (lib.lists.toList (pkg.meta.license or [ ])); + + # Whenever the license allows re-distribution of the binaries + isRedistributable = + pkg: lib.lists.any (l: l.redistributable or false) (lib.lists.toList (pkg.meta.license or [ ])); + + isSource = + pkg: !lib.lists.any (x: !(x.isSource)) (lib.lists.toList (pkg.meta.sourceProvenance or [ ])); + + isNotLinuxKernel = + attrPath: !(lib.hasPrefix "linuxKernel" attrPath || lib.hasPrefix "linuxPackages" attrPath); + + # This is handled by release-cuda.nix + isNotCudaPackage = attrPath: !(lib.hasPrefix "cuda" attrPath); + + canSubstituteSrc = + pkg: + # requireFile don't allow using substituters and are therefor skipped + pkg.src.allowSubstitutes or true; + + cond = + attrPath: pkg: + (isUnfree pkg) + && (isRedistributable pkg) + && (isSource pkg) + && (canSubstituteSrc pkg) + && ( + full + || + # We only build these heavy packages on releases + ((isNotCudaPackage attrPath) && (isNotLinuxKernel attrPath)) + ); + + packages = packagesWith "" cond pkgs; + + jobs = mapTestOn packages; +in +jobs