diff options
author | Ryan Lahfa <masterancpp@gmail.com> | 2024-01-13 16:51:00 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-13 16:51:00 +0100 |
commit | 32ccbe0927fc910f8fa3541f27f1aeb0effd8fbd (patch) | |
tree | 804a6f394683fdfbb60986618ee41e79dc2f1e52 /pkgs/os-specific/linux/kernel | |
parent | 243e5f6f58048a2f99d1311166c608ebaf46479f (diff) | |
parent | ec2016dda402ded1261d2af0e29d02506b191eab (diff) |
Merge pull request #272029 from blitz/rust-for-linux
In-kernel Rust on Linux (Optional) (2nd Attempt)
Diffstat (limited to 'pkgs/os-specific/linux/kernel')
-rw-r--r-- | pkgs/os-specific/linux/kernel/common-config.nix | 10 | ||||
-rw-r--r-- | pkgs/os-specific/linux/kernel/generic.nix | 13 | ||||
-rw-r--r-- | pkgs/os-specific/linux/kernel/manual-config.nix | 43 |
3 files changed, 46 insertions, 20 deletions
diff --git a/pkgs/os-specific/linux/kernel/common-config.nix b/pkgs/os-specific/linux/kernel/common-config.nix index 2aacb88dc87e0..c8ac88c11528b 100644 --- a/pkgs/os-specific/linux/kernel/common-config.nix +++ b/pkgs/os-specific/linux/kernel/common-config.nix @@ -381,6 +381,16 @@ let DRM_VC4_HDMI_CEC = yes; }; + # Enables Rust support in the Linux kernel. This is currently not enabled by default, because it occasionally requires + # patching the Linux kernel for the specific Rust toolchain in nixpkgs. These patches usually take a bit + # of time to appear and this would hold up Linux kernel and Rust toolchain updates. + # + # Once Rust in the kernel has more users, we can reconsider enabling it by default. + rust = optionalAttrs ((features.rust or false) && versionAtLeast version "6.7") { + RUST = yes; + GCC_PLUGINS = no; + }; + sound = { SND_DYNAMIC_MINORS = yes; SND_AC97_POWER_SAVE = yes; # AC97 Power-Saving Mode diff --git a/pkgs/os-specific/linux/kernel/generic.nix b/pkgs/os-specific/linux/kernel/generic.nix index df67005dd8165..7fc90ace2624f 100644 --- a/pkgs/os-specific/linux/kernel/generic.nix +++ b/pkgs/os-specific/linux/kernel/generic.nix @@ -9,6 +9,9 @@ , pahole , lib , stdenv +, rustc +, rustPlatform +, rust-bindgen , # The kernel source tarball. src @@ -117,6 +120,8 @@ let 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"; @@ -130,7 +135,11 @@ let depsBuildBuild = [ buildPackages.stdenv.cc ]; nativeBuildInputs = [ perl gmp libmpc mpfr ] ++ lib.optionals (lib.versionAtLeast version "4.16") [ bison flex ] - ++ lib.optional (lib.versionAtLeast version "5.2") pahole; + ++ 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" @@ -202,7 +211,7 @@ let inherit kernelPatches randstructSeed extraMakeFlags extraMeta configfile; pos = builtins.unsafeGetAttrPos "version" args; - config = { CONFIG_MODULES = "y"; CONFIG_FW_LOADER = "m"; }; + config = { CONFIG_MODULES = "y"; CONFIG_FW_LOADER = "m"; } // lib.optionalAttrs withRust { CONFIG_RUST = "y"; }; } // lib.optionalAttrs (modDirVersion != null) { inherit modDirVersion; }); passthru = basicArgs // { diff --git a/pkgs/os-specific/linux/kernel/manual-config.nix b/pkgs/os-specific/linux/kernel/manual-config.nix index 2ba31fbc97892..baf0231f13e16 100644 --- a/pkgs/os-specific/linux/kernel/manual-config.nix +++ b/pkgs/os-specific/linux/kernel/manual-config.nix @@ -1,6 +1,7 @@ { lib, stdenv, buildPackages, runCommand, nettools, bc, bison, flex, perl, rsync, gmp, libmpc, mpfr, openssl , libelf, cpio, elfutils, zstd, python3Minimal, zlib, pahole, kmod, ubootTools , fetchpatch +, rustc, rust-bindgen, rustPlatform }: let @@ -56,15 +57,6 @@ let inherit (lib) hasAttr getAttr optional optionals optionalString optionalAttrs maintainers platforms; - # Dependencies that are required to build kernel modules - moduleBuildDependencies = [ - pahole - perl - libelf - # module makefiles often run uname commands to find out the kernel version - (buildPackages.deterministic-uname.override { inherit modDirVersion; }) - ] ++ optional (lib.versionAtLeast version "5.13") zstd; - drvAttrs = config_: kernelConf: kernelPatches: configfile: let config = let attrName = attr: "CONFIG_" + attr; in { @@ -84,14 +76,27 @@ let } // config_; isModular = config.isYes "MODULES"; + withRust = config.isYes "RUST"; buildDTBs = kernelConf.DTB or false; + # Dependencies that are required to build kernel modules + moduleBuildDependencies = [ + pahole + perl + libelf + # module makefiles often run uname commands to find out the kernel version + (buildPackages.deterministic-uname.override { inherit modDirVersion; }) + ] + ++ optional (lib.versionAtLeast version "5.13") zstd + ++ optionals withRust [ rustc rust-bindgen ] + ; + in (optionalAttrs isModular { outputs = [ "out" "dev" ]; }) // { passthru = rec { inherit version modDirVersion config kernelPatches configfile moduleBuildDependencies stdenv; - inherit isZen isHardened isLibre; + inherit isZen isHardened isLibre withRust; isXen = lib.warn "The isXen attribute is deprecated. All Nixpkgs kernels that support it now have Xen enabled." true; baseVersion = lib.head (lib.splitString "-rc" version); kernelOlder = lib.versionOlder baseVersion; @@ -100,6 +105,16 @@ let inherit src; + depsBuildBuild = [ buildPackages.stdenv.cc ]; + nativeBuildInputs = [ perl bc nettools openssl rsync gmp libmpc mpfr zstd python3Minimal kmod ubootTools ] + ++ optional (lib.versionOlder version "5.8") libelf + ++ optionals (lib.versionAtLeast version "4.16") [ bison flex ] + ++ optionals (lib.versionAtLeast version "5.2") [ cpio pahole zlib ] + ++ optional (lib.versionAtLeast version "5.8") elfutils + ++ optionals withRust [ rustc rust-bindgen ]; + + RUST_LIB_SRC = lib.optionalString withRust rustPlatform.rustLibSrc; + patches = map (p: p.patch) kernelPatches # Required for deterministic builds along with some postPatch magic. @@ -363,14 +378,6 @@ stdenv.mkDerivation ((drvAttrs config stdenv.hostPlatform.linux-kernel kernelPat enableParallelBuilding = true; - depsBuildBuild = [ buildPackages.stdenv.cc ]; - nativeBuildInputs = [ perl bc nettools openssl rsync gmp libmpc mpfr zstd python3Minimal kmod ubootTools ] - ++ optional (lib.versionOlder version "5.8") libelf - ++ optionals (lib.versionAtLeast version "4.16") [ bison flex ] - ++ optionals (lib.versionAtLeast version "5.2") [ cpio pahole zlib ] - ++ optional (lib.versionAtLeast version "5.8") elfutils - ; - hardeningDisable = [ "bindnow" "format" "fortify" "stackprotector" "pic" "pie" ]; # Absolute paths for compilers avoid any PATH-clobbering issues. |