diff --git a/doc/release-notes/rl-2511.section.md b/doc/release-notes/rl-2511.section.md index 95a1b1712f6b..2fff7dd92332 100644 --- a/doc/release-notes/rl-2511.section.md +++ b/doc/release-notes/rl-2511.section.md @@ -3,7 +3,7 @@ ## Highlights {#sec-nixpkgs-release-25.11-highlights} -- Create the first release note entry in this section! +- Added `allowVariants` to gate availability of package sets like `pkgsLLVM`, `pkgsMusl`, `pkgsZig`, etc. ## Backward Incompatibilities {#sec-nixpkgs-release-25.11-incompatibilities} diff --git a/pkgs/top-level/config.nix b/pkgs/top-level/config.nix index 24c2071dcedc..4f6ae95b23f6 100644 --- a/pkgs/top-level/config.nix +++ b/pkgs/top-level/config.nix @@ -137,6 +137,18 @@ let ''; }; + allowVariants = mkOption { + type = types.bool; + default = true; + description = '' + Whether to expose the nixpkgs variants. + + Variants are instances of the current nixpkgs instance with different stdenvs or other applied options. + This allows for using different toolchains, libcs, or global build changes across nixpkgs. + Disabling can ensure nixpkgs is only building for the platform which you specified. + ''; + }; + cudaSupport = mkMassRebuild { type = types.bool; default = false; diff --git a/pkgs/top-level/stage.nix b/pkgs/top-level/stage.nix index 7bca60a4caa5..3cd2a95f8ff0 100644 --- a/pkgs/top-level/stage.nix +++ b/pkgs/top-level/stage.nix @@ -191,6 +191,16 @@ let aliases = self: super: lib.optionalAttrs config.allowAliases (import ./aliases.nix lib self super); + variants = import ./variants.nix { + inherit + lib + nixpkgsFun + stdenv + overlays + makeMuslParsedPlatform + ; + }; + # stdenvOverrides is used to avoid having multiple of versions # of certain dependencies that were used in bootstrapping the # standard environment. @@ -214,6 +224,7 @@ let # - pkgsCross. where system is a member of lib.systems.examples # - pkgsMusl # - pkgsi686Linux + # NOTE: add new non-critical package sets to "pkgs/top-level/variants.nix" otherPackageSets = self: super: { # This maps each entry in lib.systems.examples to its own package # set. Each of these will contain all packages cross compiled for @@ -222,69 +233,6 @@ let # Raspberry Pi. pkgsCross = lib.mapAttrs (n: crossSystem: nixpkgsFun { inherit crossSystem; }) lib.systems.examples; - pkgsLLVM = nixpkgsFun { - overlays = [ - (self': super': { - pkgsLLVM = super'; - }) - ] ++ overlays; - # Bootstrap a cross stdenv using the LLVM toolchain. - # This is currently not possible when compiling natively, - # so we don't need to check hostPlatform != buildPlatform. - crossSystem = stdenv.hostPlatform // { - useLLVM = true; - linker = "lld"; - }; - }; - - pkgsArocc = nixpkgsFun { - overlays = [ - (self': super': { - pkgsArocc = super'; - }) - ] ++ overlays; - # Bootstrap a cross stdenv using the Aro C compiler. - # This is currently not possible when compiling natively, - # so we don't need to check hostPlatform != buildPlatform. - crossSystem = stdenv.hostPlatform // { - useArocc = true; - linker = "lld"; - }; - }; - - pkgsZig = nixpkgsFun { - overlays = [ - (self': super': { - pkgsZig = super'; - }) - ] ++ overlays; - # Bootstrap a cross stdenv using the Zig toolchain. - # This is currently not possible when compiling natively, - # so we don't need to check hostPlatform != buildPlatform. - crossSystem = stdenv.hostPlatform // { - useZig = true; - linker = "lld"; - }; - }; - - # All packages built with the Musl libc. This will override the - # default GNU libc on Linux systems. Non-Linux systems are not - # supported. 32-bit is also not supported. - pkgsMusl = - if stdenv.hostPlatform.isLinux && stdenv.buildPlatform.is64bit then - nixpkgsFun { - overlays = [ - (self': super': { - pkgsMusl = super'; - }) - ] ++ overlays; - ${if stdenv.hostPlatform == stdenv.buildPlatform then "localSystem" else "crossSystem"} = { - config = lib.systems.parse.tripleFromSystem (makeMuslParsedPlatform stdenv.hostPlatform.parsed); - }; - } - else - throw "Musl libc only supports 64-bit Linux systems."; - # All packages built for i686 Linux. # Used by wine, firefox with debugging version of Flash, ... pkgsi686Linux = @@ -376,45 +324,6 @@ let // stdenv.hostPlatform.gcc or { }; }; }); - - # Full package set with rocm on cuda off - # Mostly useful for asserting pkgs.pkgsRocm.torchWithRocm == pkgs.torchWithRocm and similar - pkgsRocm = nixpkgsFun ({ - config = super.config // { - cudaSupport = false; - rocmSupport = true; - }; - }); - - pkgsExtraHardening = nixpkgsFun { - overlays = [ - ( - self': super': - { - pkgsExtraHardening = super'; - stdenv = super'.withDefaultHardeningFlags ( - super'.stdenv.cc.defaultHardeningFlags - ++ [ - "shadowstack" - "nostrictaliasing" - "pacret" - "trivialautovarinit" - ] - ) super'.stdenv; - glibc = super'.glibc.override rec { - enableCET = if self'.stdenv.hostPlatform.isx86_64 then "permissive" else false; - enableCETRuntimeDefault = enableCET != false; - }; - } - // lib.optionalAttrs (with super'.stdenv.hostPlatform; isx86_64 && isLinux) { - # causes shadowstack disablement - pcre = super'.pcre.override { enableJit = false; }; - pcre-cpp = super'.pcre-cpp.override { enableJit = false; }; - pcre16 = super'.pcre16.override { enableJit = false; }; - } - ) - ] ++ overlays; - }; }; # The complete chain of package set builders, applied from top to bottom. @@ -430,6 +339,7 @@ let allPackages otherPackageSets aliases + variants configOverrides ] ++ overlays diff --git a/pkgs/top-level/variants.nix b/pkgs/top-level/variants.nix new file mode 100644 index 000000000000..8465c61da529 --- /dev/null +++ b/pkgs/top-level/variants.nix @@ -0,0 +1,127 @@ +/* + This file contains all of the different variants of nixpkgs instances. + + Unlike the other package sets like pkgsCross, pkgsi686Linux, etc., this + contains non-critical package sets. The intent is to be a shorthand + for things like using different toolchains in every package in nixpkgs. +*/ +{ + lib, + stdenv, + nixpkgsFun, + overlays, + makeMuslParsedPlatform, +}: +let + makeLLVMParsedPlatform = + parsed: + ( + parsed + // { + abi = lib.systems.parse.abis.llvm; + } + ); +in +self: super: { + pkgsLLVM = nixpkgsFun { + overlays = [ + (self': super': { + pkgsLLVM = super'; + }) + ] ++ overlays; + # Bootstrap a cross stdenv using the LLVM toolchain. + # This is currently not possible when compiling natively, + # so we don't need to check hostPlatform != buildPlatform. + crossSystem = stdenv.hostPlatform // { + useLLVM = true; + linker = "lld"; + }; + }; + + pkgsArocc = nixpkgsFun { + overlays = [ + (self': super': { + pkgsArocc = super'; + }) + ] ++ overlays; + # Bootstrap a cross stdenv using the Aro C compiler. + # This is currently not possible when compiling natively, + # so we don't need to check hostPlatform != buildPlatform. + crossSystem = stdenv.hostPlatform // { + useArocc = true; + linker = "lld"; + }; + }; + + pkgsZig = nixpkgsFun { + overlays = [ + (self': super': { + pkgsZig = super'; + }) + ] ++ overlays; + # Bootstrap a cross stdenv using the Zig toolchain. + # This is currently not possible when compiling natively, + # so we don't need to check hostPlatform != buildPlatform. + crossSystem = stdenv.hostPlatform // { + useZig = true; + linker = "lld"; + }; + }; + + # All packages built with the Musl libc. This will override the + # default GNU libc on Linux systems. Non-Linux systems are not + # supported. 32-bit is also not supported. + pkgsMusl = + if stdenv.hostPlatform.isLinux && stdenv.buildPlatform.is64bit then + nixpkgsFun { + overlays = [ + (self': super': { + pkgsMusl = super'; + }) + ] ++ overlays; + ${if stdenv.hostPlatform == stdenv.buildPlatform then "localSystem" else "crossSystem"} = { + config = lib.systems.parse.tripleFromSystem (makeMuslParsedPlatform stdenv.hostPlatform.parsed); + }; + } + else + throw "Musl libc only supports 64-bit Linux systems."; + + # Full package set with rocm on cuda off + # Mostly useful for asserting pkgs.pkgsRocm.torchWithRocm == pkgs.torchWithRocm and similar + pkgsRocm = nixpkgsFun ({ + config = super.config // { + cudaSupport = false; + rocmSupport = true; + }; + }); + + pkgsExtraHardening = nixpkgsFun { + overlays = [ + ( + self': super': + { + pkgsExtraHardening = super'; + stdenv = super'.withDefaultHardeningFlags ( + super'.stdenv.cc.defaultHardeningFlags + ++ [ + "shadowstack" + "nostrictaliasing" + "pacret" + "trivialautovarinit" + ] + ) super'.stdenv; + glibc = super'.glibc.override rec { + enableCET = if self'.stdenv.hostPlatform.isx86_64 then "permissive" else false; + enableCETRuntimeDefault = enableCET != false; + }; + } + // lib.optionalAttrs (with super'.stdenv.hostPlatform; isx86_64 && isLinux) { + # causes shadowstack disablement + pcre = super'.pcre.override { enableJit = false; }; + pcre-cpp = super'.pcre-cpp.override { enableJit = false; }; + pcre16 = super'.pcre16.override { enableJit = false; }; + } + ) + ] ++ overlays; + }; +}