出自 Arch Linux 中文维基
Arch 打包準則

32 位CLRCMakeCrossDKMSEclipseElectronFontFree PascalGNOMEGoHaskellJavaKDEKernelLispMesonMinGWNode.jsNonfreeOCamlPerlPHPPythonRRubyRustVCSWebWine

創建一個新的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 installdkms remove 鉤子。dkms install 會確保過程結束時執行 depmoddkms 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 installdkms remove