summaryrefslogtreecommitdiff
path: root/pkgs/os-specific/linux/kmod/default.nix
blob: 7b8c795feeebc8aef6e9f61be07cb50c92c52329 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
{
  stdenv,
  lib,
  fetchzip,
  fetchpatch,
  autoconf,
  automake,
  docbook_xml_dtd_42,
  docbook_xml_dtd_43,
  docbook_xsl,
  gtk-doc,
  libtool,
  pkg-config,
  libxslt,
  xz,
  zstd,
  elf-header,
  withDevdoc ? stdenv.hostPlatform == stdenv.buildPlatform,
  withStatic ? stdenv.hostPlatform.isStatic,
  gitUpdater,
}:

let
  systems = [
    "/run/booted-system/kernel-modules"
    "/run/current-system/kernel-modules"
    ""
  ];
  modulesDirs = lib.concatMapStringsSep ":" (x: "${x}/lib/modules") systems;

in
stdenv.mkDerivation rec {
  pname = "kmod";
  version = "31";

  # autogen.sh is missing from the release tarball,
  # and we need to run it to regenerate gtk_doc.make,
  # because the version in the release tarball is broken.
  # Possibly this will be fixed in kmod 30?
  # https://git.kernel.org/pub/scm/utils/kernel/kmod/kmod.git/commit/.gitignore?id=61a93a043aa52ad62a11ba940d4ba93cb3254e78
  src = fetchzip {
    url = "https://git.kernel.org/pub/scm/utils/kernel/kmod/kmod.git/snapshot/kmod-${version}.tar.gz";
    hash = "sha256-FNR015/AoYBbi7Eb1M2TXH3yxUuddKICCu+ot10CdeQ=";
  };

  outputs = [
    "out"
    "man"
    "dev"
    "lib"
  ]
  ++ lib.optional withDevdoc "devdoc";

  strictDeps = true;
  nativeBuildInputs = [
    autoconf
    automake
    docbook_xsl
    libtool
    libxslt
    pkg-config

    docbook_xml_dtd_42 # for the man pages
  ]
  ++ lib.optionals withDevdoc [
    docbook_xml_dtd_43
    gtk-doc
  ];
  buildInputs = [
    xz
    zstd
  ]
  # gtk-doc is looked for with pkg-config
  ++ lib.optionals withDevdoc [ gtk-doc ];

  preConfigure = ''
    ./autogen.sh
  '';

  configureFlags = [
    "--sysconfdir=/etc"
    "--with-xz"
    "--with-zstd"
    "--with-modulesdirs=${modulesDirs}"
    (lib.enableFeature withDevdoc "gtk-doc")
  ]
  ++ lib.optional withStatic "--enable-static";

  patches = [
    # Accept multiple default kernel module dirs at build-time, instead
    # of hardcoding a single /lib/modules, and adjust module search logic
    # accordingly (to account for multiple default directories)
    ./module-dir.patch

    # Use portable implementation for basename API
    #
    # musl has removed the non-prototype declaration of basename from string.h
    # which now results in build errors with clang-17+ compiler
    #
    # Implement GNU basename behavior using strchr which is portable across libcs
    #
    # Fixes "call to undeclared function 'basename'" error on clang+musl
    (fetchpatch {
      name = "musl.patch";
      url = "https://git.kernel.org/pub/scm/utils/kernel/kmod/kmod.git/patch/?id=11eb9bc67c319900ab00523997323a97d2d08ad2";
      hash = "sha256-CYG615elMWces6QGQRg2H/NL7W4XsG9Zvz5H+xsdFFo=";
    })
  ]
  # Force configure.ac to accept --enable-static (no other changes necessary)
  ++ lib.optional withStatic ./enable-static.patch;

  postInstall = ''
    for prog in rmmod insmod lsmod modinfo modprobe depmod; do
      ln -sv $out/bin/kmod $out/bin/$prog
    done

    # Backwards compatibility
    ln -s bin $out/sbin
  '';

  passthru.updateScript = gitUpdater {
    # No nicer place to find latest release.
    url = "https://git.kernel.org/pub/scm/utils/kernel/kmod/kmod.git";
    rev-prefix = "v";
  };

  meta = {
    description = "Tools for loading and managing Linux kernel modules";
    longDescription = ''
      kmod is a set of tools to handle common tasks with Linux kernel modules
      like insert, remove, list, check properties, resolve dependencies and
      aliases. These tools are designed on top of libkmod, a library that is
      shipped with kmod.
    '';
    homepage = "https://git.kernel.org/pub/scm/utils/kernel/kmod/kmod.git/";
    downloadPage = "https://www.kernel.org/pub/linux/utils/kernel/kmod/";
    changelog = "https://git.kernel.org/pub/scm/utils/kernel/kmod/kmod.git/plain/NEWS?h=v${version}";
    license = with lib.licenses; [
      lgpl21Plus
      gpl2Plus
    ]; # GPLv2+ for tools
    platforms = lib.platforms.linux;
    maintainers = with lib.maintainers; [ artturin ];
    teams = [ lib.teams.security-review ];
    identifiers.cpeParts = lib.meta.cpeFullVersionWithVendor "kernel" version;
  };
}