pkgs/top-level/stage.nix: move most nixpkgs sets to variants (#400351)

Changed files
+152 -103
doc
release-notes
pkgs
+1 -1
doc/release-notes/rl-2511.section.md
···
## Highlights {#sec-nixpkgs-release-25.11-highlights}
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
-
- 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}
+12
pkgs/top-level/config.nix
···
'';
};
+
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;
+12 -102
pkgs/top-level/stage.nix
···
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.
···
# - pkgsCross.<system> 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
···
# 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 =
···
// 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.
···
allPackages
otherPackageSets
aliases
+
variants
configOverrides
]
++ overlays
+127
pkgs/top-level/variants.nix
···
+
/*
+
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;
+
};
+
}