From mboxrd@z Thu Jan 1 00:00:00 1970 X-GM-THRID: 6950929522725224448 X-Received: by 2002:a17:906:f42:: with SMTP id h2mr19946861ejj.317.1619453992463; Mon, 26 Apr 2021 09:19:52 -0700 (PDT) X-BeenThere: isar-users@googlegroups.com Received: by 2002:a17:906:af79:: with SMTP id os25ls3010593ejb.8.gmail; Mon, 26 Apr 2021 09:19:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzVkFvYVDA5x/Bsv4SONxEujWqt1XLzN5jAzbBpZYsrjZS9ZNtF7ouqKlqByvjrqgGdqQ8+ X-Received: by 2002:a17:906:c9d8:: with SMTP id hk24mr19597952ejb.480.1619453991646; Mon, 26 Apr 2021 09:19:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619453991; cv=none; d=google.com; s=arc-20160816; b=NB7IO9jA0NF2RA5oGii6q8VhldPdAx0P2xs1P+5rmJ0PwMkY93mXXdlK09J6RPE8ds 9AT4ws4vX/dFHXJLPXXepYhlYB9DlNifNFILMNVcmZmpb5WM2ELuU0vAQL2rXO545mKE QuWvm2Vy7UzIruR+RpS1HWnmmLL4t9D+Aqig4gPzEyKFWbS38Nj7ywMSK0WwZMJAHu0v 731eLxxdAj7QREUiHFij4qrOSJdFzCxIFGf1YXoetGWS9FrVkdgGarjBx+jy+6vfMhrE 7ktLl8fpS4qJ0zvyECj0vHkqLmem7+t2KvGdMwH1Yed880+Ahk2OXpyEK840pFEG21qp LRHw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=g98s988TODwMDRKHWxvTNeL36QMbQ0xXEmpo7zTPOuE=; b=rP2Lj+lTyi7gIh4ikJieFAWAEONLEQ+yaosqQHbjVfA3IEDtApHTEAcUG9K5eeSQIy oOeL8kJ8F86ktuF57QtC72HkhDyVI+vuy2Dfvyk/1i+nXaRHlx7k6IiK9gSfTqwguyeH e8XSqE25cEVKm1aElnrRmVnyaFtsVbzlfGTUXgVhAVnybu3C/PU5dQX1U3lKlW5t7zbC oIuV8aMIR4veVN3bnA5B9dzS1r9BvgJJ96S2G5WXTmCNE7Qdig895gvthDHalyexA7iI 024HkH3ec6TebgTZDJ7c9rqtCTQH1/TY7LvuzPAMz3uGWrSkA26Z/m1OCxp+RlKEQkDK nstg== ARC-Authentication-Results: i=1; gmr-mx.google.com; spf=pass (google.com: domain of felix.moessbauer@siemens.com designates 194.138.37.39 as permitted sender) smtp.mailfrom=felix.moessbauer@siemens.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=siemens.com Return-Path: Received: from lizzard.sbs.de (lizzard.sbs.de. [194.138.37.39]) by gmr-mx.google.com with ESMTPS id c11si145239edy.4.2021.04.26.09.19.51 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 26 Apr 2021 09:19:51 -0700 (PDT) Received-SPF: pass (google.com: domain of felix.moessbauer@siemens.com designates 194.138.37.39 as permitted sender) client-ip=194.138.37.39; Authentication-Results: gmr-mx.google.com; spf=pass (google.com: domain of felix.moessbauer@siemens.com designates 194.138.37.39 as permitted sender) smtp.mailfrom=felix.moessbauer@siemens.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=siemens.com Received: from mail2.sbs.de (mail2.sbs.de [192.129.41.66]) by lizzard.sbs.de (8.15.2/8.15.2) with ESMTPS id 13QGJpk7022230 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 26 Apr 2021 18:19:51 +0200 Received: from MD1T0KAC-VM.ad001.siemens.net (md1t0kac.ad001.siemens.net [139.25.0.7]) by mail2.sbs.de (8.15.2/8.15.2) with ESMTP id 13QGGC8f017700; Mon, 26 Apr 2021 18:16:13 +0200 From: Felix Moessbauer To: isar-users@googlegroups.com, amikan@ilbers.de, jan.kiszka@siemens.com Cc: henning.schild@siemens.com, Felix Moessbauer Subject: [PATCH v3 1/1] Add support to build binary version of DKMS kernel modules Date: Mon, 26 Apr 2021 18:16:02 +0200 Message-Id: <20210426161602.13875-2-felix.moessbauer@siemens.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <3495ece4-950e-a0ba-64b2-e892f98ec1f8@ilbers.de> References: <3495ece4-950e-a0ba-64b2-e892f98ec1f8@ilbers.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-TUID: 8shhiOogwGzf 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 --- meta-isar/conf/local.conf.sample | 5 +- .../example-dkms-module.bb | 14 ++++ meta/classes/dkms-module.bbclass | 75 +++++++++++++++++++ scripts/ci_build.sh | 1 + 4 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 meta-isar/recipes-kernel/example-dkms-module/example-dkms-module.bb create mode 100644 meta/classes/dkms-module.bbclass diff --git a/meta-isar/conf/local.conf.sample b/meta-isar/conf/local.conf.sample index 77585ec..67a98d6 100644 --- a/meta-isar/conf/local.conf.sample +++ b/meta-isar/conf/local.conf.sample @@ -178,7 +178,10 @@ CONF_VERSION = "1" # # The default list of extra packages to be installed. -IMAGE_INSTALL = "hello-isar example-raw example-module-${KERNEL_NAME} enable-fsck isar-exclude-docs samefile hello isar-disable-apt-cache cowsay example-prebuilt" +IMAGE_INSTALL = "hello-isar example-raw example-module-${KERNEL_NAME} example-dkms-module-${KERNEL_NAME} enable-fsck isar-exclude-docs samefile hello isar-disable-apt-cache cowsay example-prebuilt" + +# v4l2loopback module does not build on armhf +IMAGE_INSTALL_remove_armhf = "example-dkms-module-${KERNEL_NAME}" # # Enable cross-compilation support diff --git a/meta-isar/recipes-kernel/example-dkms-module/example-dkms-module.bb b/meta-isar/recipes-kernel/example-dkms-module/example-dkms-module.bb new file mode 100644 index 0000000..113f232 --- /dev/null +++ b/meta-isar/recipes-kernel/example-dkms-module/example-dkms-module.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, 2021 +# +# SPDX-License-Identifier: MIT + +inherit dkms-module + +PN .= "-${KERNEL_NAME}" + +#package name (without -dkms. E.g "v4l2loopback" for package "v4l2loopback-dkms") +DKMS_PACKAGE_NAME = "v4l2loopback" +AUTOLOAD += "v4l2loopback" diff --git a/meta/classes/dkms-module.bbclass b/meta/classes/dkms-module.bbclass new file mode 100644 index 0000000..f656f07 --- /dev/null +++ b/meta/classes/dkms-module.bbclass @@ -0,0 +1,75 @@ +# 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," + +ISAR_CROSS_COMPILE = "0" + +# 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') + DKMS_ARCH=$(echo ${DISTRO_ARCH} | sed 's/amd64/x86_64/g' | sed 's/arm64/aarch64/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 + KERNEL_FULLNAME=${KERNEL_NAME} + else + KERNEL_FULLNAME=$(dpkg -s --root=${BUILDCHROOT_DIR} linux-headers-${KERNEL_NAME} | grep "Depends:.*linux-headers" | sed 's/Depends: linux-headers-//g') + bbnote "Building for kernel $KERNEL_FULLNAME" + fi + # build the module for all installed kernels (should be just one) + sudo -E chroot ${BUILDCHROOT_DIR} dkms mkbmdeb ${DKMS_PACKAGE_NAME}/${REVISION} -k ${KERNEL_FULLNAME}/${DKMS_ARCH} + 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 diff --git a/scripts/ci_build.sh b/scripts/ci_build.sh index adc22e4..1426569 100755 --- a/scripts/ci_build.sh +++ b/scripts/ci_build.sh @@ -259,6 +259,7 @@ mv ${BUILDDIR}/tmp/deploy/images/qemuamd64/isar-image-base-debian-stretch-qemuam # Finalize with containerized images, since they remove some not-needed packages from the local.conf sed -i -e 's/\(IMAGE_INSTALL = .*\) example-module-${KERNEL_NAME}\(.*\)/\1\2/g' conf/local.conf +sed -i -e 's/\(IMAGE_INSTALL = .*\) example-dkms-module-${KERNEL_NAME}\(.*\)/\1\2/g' conf/local.conf sed -i -e 's/\(IMAGE_INSTALL = .*\) enable-fsck\(.*\)/\1\2/g' conf/local.conf bitbake $BB_ARGS $TARGETS_CONTAINERS while [ -e bitbake.sock ]; do sleep 1; done -- 2.20.1