DKMS package guidelines (简体中文)
32-bit – CLR – CMake – Cross – DKMS – Eclipse – Electron – Font – Free Pascal – GNOME – Go – Haskell – Java – KDE – Kernel – Lisp – Meson – MinGW – Node.js – Nonfree – OCaml – Perl – PHP – Python – R – Ruby – Rust – Shell – VCS – Web – Wine
创建一个新的DKMS包时,可以参考下面的指导方针。
包名
DKMS的包的命名方式是:原始包名加"-dkms"后缀。
通常在  $pkgname 后面使用 $_pkgname 记录不包含 "-dkms" 后缀的软件包名 (例如 _pkgname=${pkgname%-*}). 这样可以在原始的软件包 PKGBUILD 和 DKMS 编译文件之间保持相似性。
依赖
依赖的包应该是原来软件包的基础上,加上 dkms, 删除 linux-headers,内核头文件已经是 dkms 的可选依赖。
源代码构建位置
构建模块所需源代码需要放在(这是DKMS构建模块时使用的默认目录):
/usr/src/PACKAGE_NAME-PACKAGE_VERSION
在软件包目录,要包含一个 dkms.conf 配置文件,告诉 DKMS 如何编译。这个配置文件需要包含:
- 
PACKAGE_NAME- 实际的项目名称,通常使用$_pkgname或$_pkgbase.
- 
PACKAGE_VERSION- 通常使用$pkgver.
打补丁
为内核模块源代码打补丁既可以直接在PKGBUILD中进行,也可以通过dkms.conf来进行。
.install 中模块的自动加载
模块的加载和卸载必须由用户自己来执行,设想一下,某个模块可能在加载的时候崩溃。
现在已经不需要单独执行 depmod 更新内核模块的依赖。Pacman 现在会自动执行 dkms install 和 dkms remove 钩子。dkms install 会确保过程结束时执行 depmod。dkms install 依赖 dkms build (针对当前内核编译源码),build 依赖 dkms add (添加从 /var/lib/dkms/<package>/<version>/source 到 /usr/src/<package> 的链接)。
namcap 输出
namcap (它会试图检查一个包中的一般性错误和不符合标准的设定)在任何包中最好至少使用一次。然而,namcap至今仍然没有针对DKMS的特殊方针做更新。
例如,默认情况下,DKMS使用/usr/src/,不过Namcap认为这不是一个标准目录,不符合这个reference。
例子
这儿有个根据包名字和版本来对dkms.conf进行编辑的例子。
PKGBUILD
PKGBUILD
# Maintainer: foo <foo(at)gmail(dot)com>
# Contributor: bar <bar(at)gmai(dot)com>
_pkgbase=amazing
pkgname=amazing-dkms
pkgver=1
pkgrel=1
pkgdesc="The Amazing kernel modules (DKMS)"
arch=('i686' 'x86_64')
url="https://www.amazing.com/"
license=('GPL2')
depends=('dkms')
conflicts=("${_pkgbase}")
install=${pkgname}.install
source=("${url}/files/tarball.tar.gz"
        'dkms.conf'
        'linux-3.14.patch')
md5sums=(use 'updpkgsums')
build() {
  cd ${_pkgbase}-${pkgver}
  # Patch
  patch -p1 -i "${srcdir}"/linux-3.14.patch
}
package() {
  # Install
  msg2 "Starting make install..."
  make DESTDIR="${pkgdir}" install
  # Copy dkms.conf
  install -Dm644 dkms.conf "${pkgdir}"/usr/src/${_pkgbase}-${pkgver}/dkms.conf
  # Set name and version
  sed -e "s/@_PKGBASE@/${_pkgbase}/" \
      -e "s/@PKGVER@/${pkgver}/" \
      -i "${pkgdir}"/usr/src/${_pkgbase}-${pkgver}/dkms.conf
  # Copy sources (including Makefile)
  cp -r ${_pkgbase}/* "${pkgdir}"/usr/src/${_pkgbase}-${pkgver}/
}
dkms.conf
dkms.conf
PACKAGE_NAME="@_PKGBASE@" PACKAGE_VERSION="@PKGVER@" MAKE[0]="make --uname_r=$kernelver" CLEAN="make clean" BUILT_MODULE_NAME[0]="@_PKGBASE@" DEST_MODULE_LOCATION[0]="/kernel/drivers/misc" AUTOINSTALL="yes"
.install
pacman 已经支持 DKMS 钩子,不需要在 .install 文件中指定 DKMS 额外配置,pacman 会自动执行 dkms install 和 dkms remove。