Format all Nix files using the officially approved formatter,
making the CI check introduced in the previous commit succeed:
nix-build ci -A fmt.check
This is the next step of the of the [implementation](https://github.com/NixOS/nixfmt/issues/153)
of the accepted [RFC 166](https://github.com/NixOS/rfcs/pull/166).
This commit will lead to merge conflicts for a number of PRs,
up to an estimated ~1100 (~33%) among the PRs with activity in the past 2
months, but that should be lower than what it would be without the previous
[partial treewide format](https://github.com/NixOS/nixpkgs/pull/322537).
Merge conflicts caused by this commit can now automatically be resolved while rebasing using the
[auto-rebase script](8616af08d9/maintainers/scripts/auto-rebase).
If you run into any problems regarding any of this, please reach out to the
[formatting team](https://nixos.org/community/teams/formatting/) by
pinging @NixOS/nix-formatting.
388 lines
13 KiB
Nix
388 lines
13 KiB
Nix
{
|
|
buildPackages,
|
|
callPackage,
|
|
perl,
|
|
bison ? null,
|
|
flex ? null,
|
|
gmp ? null,
|
|
libmpc ? null,
|
|
mpfr ? null,
|
|
pahole,
|
|
lib,
|
|
stdenv,
|
|
rustc,
|
|
rustPlatform,
|
|
rust-bindgen,
|
|
# testing
|
|
emptyFile,
|
|
nixos,
|
|
nixosTests,
|
|
}@args':
|
|
|
|
let
|
|
overridableKernel = lib.makeOverridable (
|
|
# The kernel source tarball.
|
|
{
|
|
src,
|
|
|
|
# The kernel version.
|
|
version,
|
|
|
|
# Allows overriding the default defconfig
|
|
defconfig ? null,
|
|
|
|
# Legacy overrides to the intermediate kernel config, as string
|
|
extraConfig ? "",
|
|
|
|
# Additional make flags passed to kbuild
|
|
extraMakeFlags ? [ ],
|
|
|
|
# enables the options in ./common-config.nix; if `false` then only
|
|
# `structuredExtraConfig` is used
|
|
enableCommonConfig ? true
|
|
|
|
, # kernel intermediate config overrides, as a set
|
|
structuredExtraConfig ? { },
|
|
|
|
# The version number used for the module directory
|
|
# If unspecified, this is determined automatically from the version.
|
|
modDirVersion ? null,
|
|
|
|
# An attribute set whose attributes express the availability of
|
|
# certain features in this kernel. E.g. `{ia32Emulation = true;}'
|
|
# indicates a kernel that provides Intel wireless support. Used in
|
|
# NixOS to implement kernel-specific behaviour.
|
|
features ? { },
|
|
|
|
# Custom seed used for CONFIG_GCC_PLUGIN_RANDSTRUCT if enabled. This is
|
|
# automatically extended with extra per-version and per-config values.
|
|
randstructSeed ? "",
|
|
|
|
# A list of patches to apply to the kernel. Each element of this list
|
|
# should be an attribute set {name, patch} where `name' is a
|
|
# symbolic name and `patch' is the actual patch. The patch may
|
|
# optionally be compressed with gzip or bzip2.
|
|
kernelPatches ? [ ],
|
|
ignoreConfigErrors ?
|
|
!lib.elem stdenv.hostPlatform.linux-kernel.name [
|
|
"aarch64-multiplatform"
|
|
"pc"
|
|
],
|
|
extraMeta ? { },
|
|
|
|
isZen ? false,
|
|
isLibre ? false,
|
|
isHardened ? false,
|
|
|
|
# easy overrides to stdenv.hostPlatform.linux-kernel members
|
|
autoModules ? stdenv.hostPlatform.linux-kernel.autoModules,
|
|
preferBuiltin ? stdenv.hostPlatform.linux-kernel.preferBuiltin or false,
|
|
kernelArch ? stdenv.hostPlatform.linuxArch,
|
|
kernelTests ? { },
|
|
|
|
stdenv ? args'.stdenv,
|
|
buildPackages ? args'.buildPackages,
|
|
|
|
...
|
|
}@args:
|
|
|
|
# Note: this package is used for bootstrapping fetchurl, and thus
|
|
# cannot use fetchpatch! All mutable patches (generated by GitHub or
|
|
# cgit) that are needed here should be included directly in Nixpkgs as
|
|
# files.
|
|
|
|
assert stdenv.hostPlatform.isLinux;
|
|
|
|
let
|
|
# Dirty hack to make sure that `version` & `src` have
|
|
# `<nixpkgs/pkgs/os-specific/linux/kernel/linux-x.y.nix>` as position
|
|
# when using `builtins.unsafeGetAttrPos`.
|
|
#
|
|
# This is to make sure that ofborg actually detects changes in the kernel derivation
|
|
# and pings all maintainers.
|
|
#
|
|
# For further context, see https://github.com/NixOS/nixpkgs/pull/143113#issuecomment-953319957
|
|
basicArgs = builtins.removeAttrs args (
|
|
lib.filter (
|
|
x:
|
|
!(builtins.elem x [
|
|
"version"
|
|
"pname"
|
|
"src"
|
|
])
|
|
) (lib.attrNames args)
|
|
);
|
|
|
|
# Combine the `features' attribute sets of all the kernel patches.
|
|
kernelFeatures = lib.foldr (x: y: (x.features or { }) // y) (
|
|
{
|
|
efiBootStub = true;
|
|
netfilterRPFilter = true;
|
|
ia32Emulation = true;
|
|
}
|
|
// features
|
|
) kernelPatches;
|
|
|
|
commonStructuredConfig = import ./common-config.nix {
|
|
inherit lib stdenv version;
|
|
rustAvailable = lib.meta.availableOn stdenv.hostPlatform rustc;
|
|
|
|
features = kernelFeatures; # Ensure we know of all extra patches, etc.
|
|
};
|
|
|
|
intermediateNixConfig =
|
|
configfile.moduleStructuredConfig.intermediateNixConfig
|
|
# extra config in legacy string format
|
|
+ extraConfig
|
|
+ stdenv.hostPlatform.linux-kernel.extraConfig or "";
|
|
|
|
structuredConfigFromPatches = map (
|
|
{
|
|
extraStructuredConfig ? { },
|
|
...
|
|
}:
|
|
{
|
|
settings = extraStructuredConfig;
|
|
}
|
|
) kernelPatches;
|
|
|
|
# appends kernel patches extraConfig
|
|
kernelConfigFun =
|
|
baseConfigStr:
|
|
let
|
|
configFromPatches = map (
|
|
{
|
|
extraConfig ? "",
|
|
...
|
|
}:
|
|
extraConfig
|
|
) kernelPatches;
|
|
in
|
|
lib.concatStringsSep "\n" ([ baseConfigStr ] ++ configFromPatches);
|
|
|
|
withRust = ((configfile.moduleStructuredConfig.settings.RUST or { }).tristate or null) == "y";
|
|
|
|
configfile = stdenv.mkDerivation {
|
|
inherit
|
|
ignoreConfigErrors
|
|
autoModules
|
|
preferBuiltin
|
|
kernelArch
|
|
extraMakeFlags
|
|
;
|
|
pname = "linux-config";
|
|
inherit version;
|
|
|
|
generateConfig = ./generate-config.pl;
|
|
|
|
kernelConfig = kernelConfigFun intermediateNixConfig;
|
|
passAsFile = [ "kernelConfig" ];
|
|
|
|
depsBuildBuild = [ buildPackages.stdenv.cc ];
|
|
nativeBuildInputs =
|
|
[
|
|
perl
|
|
gmp
|
|
libmpc
|
|
mpfr
|
|
bison
|
|
flex
|
|
]
|
|
++ lib.optional (lib.versionAtLeast version "5.2") pahole
|
|
++ lib.optionals withRust [
|
|
rust-bindgen
|
|
rustc
|
|
];
|
|
|
|
RUST_LIB_SRC = lib.optionalString withRust rustPlatform.rustLibSrc;
|
|
|
|
platformName = stdenv.hostPlatform.linux-kernel.name;
|
|
# e.g. "defconfig"
|
|
kernelBaseConfig =
|
|
if defconfig != null then defconfig else stdenv.hostPlatform.linux-kernel.baseConfig;
|
|
|
|
makeFlags =
|
|
lib.optionals (
|
|
stdenv.hostPlatform.linux-kernel ? makeFlags
|
|
) stdenv.hostPlatform.linux-kernel.makeFlags
|
|
++ extraMakeFlags;
|
|
|
|
postPatch =
|
|
kernel.postPatch
|
|
+ ''
|
|
# Patch kconfig to print "###" after every question so that
|
|
# generate-config.pl from the generic builder can answer them.
|
|
sed -e '/fflush(stdout);/i\printf("###");' -i scripts/kconfig/conf.c
|
|
'';
|
|
|
|
preUnpack = kernel.preUnpack or "";
|
|
|
|
inherit (kernel) src patches;
|
|
|
|
buildPhase = ''
|
|
export buildRoot="''${buildRoot:-build}"
|
|
|
|
# Get a basic config file for later refinement with $generateConfig.
|
|
make $makeFlags \
|
|
-C . O="$buildRoot" $kernelBaseConfig \
|
|
ARCH=$kernelArch CROSS_COMPILE=${stdenv.cc.targetPrefix} \
|
|
$makeFlags
|
|
|
|
# Create the config file.
|
|
echo "generating kernel configuration..."
|
|
ln -s "$kernelConfigPath" "$buildRoot/kernel-config"
|
|
DEBUG=1 ARCH=$kernelArch CROSS_COMPILE=${stdenv.cc.targetPrefix} \
|
|
KERNEL_CONFIG="$buildRoot/kernel-config" AUTO_MODULES=$autoModules \
|
|
PREFER_BUILTIN=$preferBuiltin BUILD_ROOT="$buildRoot" SRC=. MAKE_FLAGS="$makeFlags" \
|
|
perl -w $generateConfig
|
|
'';
|
|
|
|
installPhase = "mv $buildRoot/.config $out";
|
|
|
|
enableParallelBuilding = true;
|
|
|
|
passthru = rec {
|
|
module = import ../../../../nixos/modules/system/boot/kernel_config.nix;
|
|
# used also in apache
|
|
# { modules = [ { options = res.options; config = svc.config or svc; } ];
|
|
# check = false;
|
|
# The result is a set of two attributes
|
|
moduleStructuredConfig =
|
|
(lib.evalModules {
|
|
modules =
|
|
[
|
|
module
|
|
]
|
|
++ lib.optionals enableCommonConfig [
|
|
{
|
|
settings = commonStructuredConfig;
|
|
_file = "pkgs/os-specific/linux/kernel/common-config.nix";
|
|
}
|
|
]
|
|
++ [
|
|
{
|
|
settings = structuredExtraConfig;
|
|
_file = "structuredExtraConfig";
|
|
}
|
|
]
|
|
++ structuredConfigFromPatches;
|
|
}).config;
|
|
|
|
structuredConfig = moduleStructuredConfig.settings;
|
|
};
|
|
}; # end of configfile derivation
|
|
|
|
kernel = (callPackage ./manual-config.nix { inherit lib stdenv buildPackages; }) (
|
|
basicArgs
|
|
// {
|
|
inherit
|
|
kernelPatches
|
|
randstructSeed
|
|
extraMakeFlags
|
|
extraMeta
|
|
configfile
|
|
modDirVersion
|
|
;
|
|
pos = builtins.unsafeGetAttrPos "version" args;
|
|
|
|
config = {
|
|
CONFIG_MODULES = "y";
|
|
CONFIG_FW_LOADER = "y";
|
|
CONFIG_RUST = if withRust then "y" else "n";
|
|
};
|
|
}
|
|
);
|
|
|
|
in
|
|
kernel.overrideAttrs (
|
|
finalAttrs: previousAttrs: {
|
|
|
|
passthru =
|
|
previousAttrs.passthru or { }
|
|
// basicArgs
|
|
// {
|
|
features = kernelFeatures;
|
|
inherit
|
|
commonStructuredConfig
|
|
structuredExtraConfig
|
|
extraMakeFlags
|
|
isZen
|
|
isHardened
|
|
isLibre
|
|
;
|
|
isXen = lib.warn "The isXen attribute is deprecated. All Nixpkgs kernels that support it now have Xen enabled." true;
|
|
|
|
# Adds dependencies needed to edit the config:
|
|
# nix-shell '<nixpkgs>' -A linux.configEnv --command 'make nconfig'
|
|
configEnv = finalAttrs.finalPackage.overrideAttrs (previousAttrs: {
|
|
nativeBuildInputs =
|
|
previousAttrs.nativeBuildInputs or [ ]
|
|
++ (with buildPackages; [
|
|
pkg-config
|
|
ncurses
|
|
]);
|
|
});
|
|
|
|
tests =
|
|
let
|
|
overridableKernel = finalAttrs.finalPackage // {
|
|
override =
|
|
args:
|
|
lib.warn (
|
|
"override is stubbed for NixOS kernel tests, not applying changes these arguments: "
|
|
+ toString (lib.attrNames (lib.toFunction args { }))
|
|
) overridableKernel;
|
|
};
|
|
/*
|
|
Certain arguments must be evaluated lazily; so that only the output(s) depend on them.
|
|
Original reproducer / simplified use case:
|
|
*/
|
|
versionDoesNotDependOnPatchesEtcNixOS =
|
|
builtins.seq
|
|
(nixos (
|
|
{ config, pkgs, ... }:
|
|
{
|
|
boot.kernelPatches = [
|
|
(builtins.seq config.boot.kernelPackages.kernel.version { patch = pkgs.emptyFile; })
|
|
];
|
|
}
|
|
)).config.boot.kernelPackages.kernel.outPath
|
|
emptyFile;
|
|
versionDoesNotDependOnPatchesEtc =
|
|
builtins.seq
|
|
(import ./generic.nix args' (
|
|
args
|
|
// (
|
|
let
|
|
explain = attrName: ''
|
|
The ${attrName} attribute must be able to access the kernel.version attribute without an infinite recursion.
|
|
That means that the kernel attrset (attrNames) and the kernel.version attribute must not depend on the ${attrName} argument.
|
|
The fact that this exception is raised shows that such a dependency does exist.
|
|
This is a problem for the configurability of ${attrName} in version-aware logic such as that in NixOS.
|
|
Strictness can creep in through optional attributes, or assertions and warnings that run as part of code that shouldn't access what is checked.
|
|
'';
|
|
in
|
|
{
|
|
kernelPatches = throw (explain "kernelPatches");
|
|
structuredExtraConfig = throw (explain "structuredExtraConfig");
|
|
modDirVersion = throw (explain "modDirVersion");
|
|
}
|
|
)
|
|
)).version
|
|
emptyFile;
|
|
in
|
|
{
|
|
inherit versionDoesNotDependOnPatchesEtc;
|
|
testsForKernel = nixosTests.kernel-generic.passthru.testsForKernel overridableKernel;
|
|
# Disabled by default, because the infinite recursion is hard to understand. The other test's error is better and produces a shorter trace.
|
|
# inherit versionDoesNotDependOnPatchesEtcNixOS;
|
|
}
|
|
// kernelTests;
|
|
};
|
|
|
|
}
|
|
)
|
|
);
|
|
in
|
|
overridableKernel
|