只为特定的内核版本构建dkms模块



如何定义dkms.conf,以便只为特定的内核版本或版本范围构建dkms模块?

背景:

我们正在使用的当前内核中存在一个错误驱动程序(例如4.4),但在4.10中已修复。我制作了一个带有4.10源代码的dkms包,这些代码在4.4内核上运行良好。但是,当我们用更高的内核版本(如4.15)更新到更高的操作系统版本(或HWE版本)时,我希望避免在内核版本为4.10或更高版本时重建(现在可能更旧)4.10内核驱动程序。

这是我的基本dkms.conf文件

PACKAGE_NAME="cp210x"
PACKAGE_VERSION="#MODULE_VERSION#"
BUILT_MODULE_NAME[0]="$PACKAGE_NAME"
DEST_MODULE_LOCATION[0]="/updates/dkms"
AUTOINSTALL="YES"
REMAKE_INITRD="YES"

我尝试了BUILD_EXCLUSIVE_KERNEL4.N内核版本匹配

BUILD_EXCLUSIVE_KERNEL="^4.[0-9].*"

预期行为-不会为内核4.15.0-43-generic安装内核模块。实际行为-安装为正常

我的阅读表明,一个替代方案可能会起作用(对于这个测试,我只是匹配我当前的内核版本),将编译规则更改为no-op。

MAKE_MATCH[1]="^4.15.*"
MAKE[1]=":"

如果这有什么不同的话,我在Debian/Uubuntu平台上。

好的-问题出在键盘和椅子之间-我的BUILD_EXCLUSIVE_KERNEL正则表达式中有一个错误-.*后缀与.数字分隔符混合。但我将在这里记录一个工作示例,因为在我发布到这里之前,谷歌没有找到任何好的示例:

首先,我不确定我需要使用什么regexp方言(grep、pcre等),尤其是因为混合了shell转义,所以我想可能存在不匹配。

原来dkms是一个bash脚本,所以使用了[[ $ver =~ $match_regexp ]]。因此,为了测试匹配效果,

re="^(3.[0-9]+.|4.[0-9].)" ; [[ "4.15.0-43-generic" =~ $re ]] && echo true
# but this didn't
[[ "4.15.0-43-generic" =~ "^(3.[0-9]+.|4.[0-9].)" ]] && echo true

这是我最终使用的配置文件:

PACKAGE_NAME="cp210x"
PACKAGE_VERSION="#MODULE_VERSION#"
BUILT_MODULE_NAME[0]="$PACKAGE_NAME"
DEST_MODULE_LOCATION[0]="/updates/dkms"
AUTOINSTALL="YES"
REMAKE_INITRD="YES"
# Since this code comes from 4.10 only update kernels 4.9 and earlier
BUILD_EXCLUSIVE_KERNEL="^(3.[0-9]+.|4.[0-9].)"

当通过dpkg安装时,它看起来是这样的。

First Installation: checking all kernels...
Building only for 4.15.0-43-generic
Building initial module for 4.15.0-43-generic
Error!  The dkms.conf for this module includes a BUILD_EXCLUSIVE directive which
does not match this kernel/arch.  This indicates that it should not be built.
Skipped.

但是针对较低的内核版本正确安装。

此外,BUILD_EXCLUSIVE_KERNEL文档的措辞表明,如果内核不匹配,这可能是一个错误,但如果您检查上面的输出,您会发现"错误"不会导致包安装失败,只是标记为跳过。

最新更新