This patch adds support to build and install a kernel module that is available
via a debian DKMS package.
As it is hard to directly build and install the package we create and distribute
a meta package that is independent of the kernel version.
In that package, we depend on the versioned prebuild kernel module package.
To build the dkms module, we add two tasks and directly
use dkms to build the debian package containing the binary module
Then we just copy the binary-module debian package to the workdir,
Signed-off-by: Felix Moessbauer <
felix.mo...@siemens.com>
---
.../example-dkms-module/
igb-uio_20.11.bb | 14 ++++
meta/classes/dkms-module.bbclass | 68 +++++++++++++++++++
2 files changed, 82 insertions(+)
create mode 100644 meta-isar/recipes-kernel/example-dkms-module/
igb-uio_20.11.bb
create mode 100644 meta/classes/dkms-module.bbclass
diff --git a/meta-isar/recipes-kernel/example-dkms-module/
igb-uio_20.11.bb b/meta-isar/recipes-kernel/example-dkms-module/
igb-uio_20.11.bb
new file mode 100644
index 0000000..abb9922
--- /dev/null
+++ b/meta-isar/recipes-kernel/example-dkms-module/
igb-uio_20.11.bb
@@ -0,0 +1,14 @@
+# Example recipe for building the binary version of a DKMS module
+#
+# This software is a part of ISAR.
+# Copyright (c) Siemens AG, 2018
+#
+# SPDX-License-Identifier: MIT
+
+inherit dkms-module
+
+PN .= "-${KERNEL_NAME}"
+
+#package name (without -dkms. E.g "dpdk-kmods" for package "dpdk-kmods-dkms")
+DKMS_PACKAGE_NAME = "dpdk-kmods"
+AUTOLOAD += "igb_uio"
diff --git a/meta/classes/dkms-module.bbclass b/meta/classes/dkms-module.bbclass
new file mode 100644
index 0000000..d1dbba9
--- /dev/null
+++ b/meta/classes/dkms-module.bbclass
@@ -0,0 +1,68 @@
+# This software is a part of ISAR.
+# Copyright (C) 2021 Siemens AG
+#
+# SPDX-License-Identifier: MIT
+
+inherit dpkg-raw
+
+# Build and install a kernel module that is available via a debian DKMS package.
+# As it is hard to directly build and install the package we create and distribute
+# a meta package that is independent of the kernel version.
+# In that package, we depend on the versioned prebuild kernel module package.
+#
+# To build the dkms module, we add two tasks and directly
+# use dkms to build the debian package containing the binary module
+# Then we just copy the binary-module debian package to the workdir,
+# so ISAR's do_deploy_deb picks it up.
+
+#package name (without -dkms. E.g "dpdk-kmods" for package "dpdk-kmods-dkms")
+DKMS_PACKAGE_NAME ?= ""
+AUTOLOAD ?= ""
+
+DESCRIPTION ?= "Kernel module from DKMS package for ${PN}"
+DEPENDS += "linux-headers-${KERNEL_NAME}"
+DEBIAN_DEPENDS += "${DKMS_PACKAGE_NAME}-modules,"
+DEBIAN_BUILD_DEPENDS += "linux-headers-${KERNEL_NAME}, ${DKMS_PACKAGE_NAME}-dkms,"
+
+# install configuration to auto-load the modules in ${AUTOLOAD}
+do_install() {
+ # auto load the module
+ install -v -d ${D}/etc/modules-load.d
+ for module in "${AUTOLOAD}"; do
+ echo $module > ${D}/etc/modules-load.d/${PN}.conf
+ done
+}
+
+# build the binary kernel module and package as debian package (versioned)
+do_module_build() {
+ # we have to find out the module version, e.g. dpdk-kmods/0~20201113+git -k 5.10.0-3-rt-amd64/x86_64
+ REVISION=$(find ${BUILDCHROOT_DIR}/usr/src/${DKMS_PACKAGE_NAME}-* -type d -exec basename {} + | sed 's/${DKMS_PACKAGE_NAME}-//g')
+ if ! dpkg -s --root=${BUILDCHROOT_DIR} linux-headers-${KERNEL_NAME} | grep "Depends:.*linux-headers"; then
+ # custom kernels directly place their files in linux-image-KERNEL-NAME, instead
+ # of using a meta package + a versioned package with the resources
+ # The prebuild DKMS binary package depends on the versioned kernel package,
+ # but that is not available on custom kernels. Hence, we just remove the dependency.
+ bbnote "Building ${DKMS_PACKAGE_NAME} for custom kernel ${KERNEL_NAME}"
+ cp ${BUILDCHROOT_DIR}/etc/dkms/template-dkms-mkbmdeb/debian/control ${WORKDIR}/control.dkms.orig
+ sudo sed -i 's/, linux-image-KERNEL_VERSION//' ${BUILDCHROOT_DIR}/etc/dkms/template-dkms-mkbmdeb/debian/control
+ fi
+ # build the module for all installed kernels (should be just one)
+ sudo -E chroot ${BUILDCHROOT_DIR} dkms mkbmdeb ${DKMS_PACKAGE_NAME}/${REVISION} --all
+ DKMS_PACKAGE_VERSIONED=$(find ${BUILDCHROOT_DIR}/var/lib/dkms/${DKMS_PACKAGE_NAME}/ -name "${DKMS_PACKAGE_NAME}-modules*.deb" -exec dpkg -I {} + | grep "Package:" | awk '{print $2}')
+ if [ -z "$DKMS_PACKAGE_VERSIONED" ]; then
+ bberror "No prebuild dkms module found"
+ exit 1
+ fi
+ # restore dkms template (if any)
+ cp ${WORKDIR}/control.dkms.orig ${BUILDCHROOT_DIR}/etc/dkms/template-dkms-mkbmdeb/debian/control || true
+}
+
+# simply copy our module from the build tree to the expected output location
+# of this recipe. Then, do_deploy_dep finds it and adds it to the
+# debian isar repo
+do_module_deploy() {
+ cp ${BUILDCHROOT_DIR}/var/lib/dkms/${DKMS_PACKAGE_NAME}/*/bmdeb/*.deb ${S}/../
+}
+
+addtask module_build after do_install_builddeps before do_dpkg_build
+addtask module_deploy after do_module_build before do_deploy_deb
--
2.20.1