32 位 – 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 – 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
。