仅针对特定内核版本构建dkms模块

时间:2019-01-31 01:23:28

标签: dkms

如何定义dkms.conf,以便仅针对特定内核版本或版本范围构建DKMS模块?

背景:

当前使用的内核(例如4.4)中存在错误的驱动程序,但在4.10中已修复。我以dkms软件包的形式生产,其中包含4.10源代码,在内核4.4上都可以正常工作。但是随着我们使用更高的内核版本(例如4.15)更新到更高的OS版本(或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_KERNEL 4.N 内核版本匹配

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

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

我的阅读表明,可以使用另一种方法(对于本次测试,我只是匹配当前的内核版本),可以将编译规则更改为无操作。

MAKE_MATCH[1]="^4\.15\.*"
MAKE[1]=":"

如果有任何不同,我在Debian / Ubuntu平台上。

1 个答案:

答案 0 :(得分:0)

好的-问题出在键盘和椅子之间-我的function categoryTree($pid, $cat_type, $parentid = 0, $sub_mark = ''){ global $db; $query = $db->query("SELECT * FROM categories WHERE parentid = $parentid and cat_type = '$cat_type' ORDER BY parentid, category ASC"); if($query->num_rows > 0){ while($row = $query->fetch_assoc()){ if ($row['parentid'] == 0) { echo '<div><label><span class="font-md">'.$sub_mark.$row['category']."</span></label></div>"; } else { echo '<div class="checkbox" style="padding-left:15px;padding-top:5px;padding-bottom:5px;"><label><input name="catid[]" type="checkbox" value="'.$row['catid'].'" class="checkbox style-0"><span>'.$sub_mark.$row['category']."</span></label></div>"; } categoryTree($cat_type, $row['catid'], $sub_mark.' '); } } } 正则表达式出错-BUILD_EXCLUSIVE_KERNEL后缀与.*数字分隔符混合在一起。但是我将在此处记录一个有效的示例,因为在我在此处发布之前Google找不到任何好的示例:

首先,我不确定我需要使用哪种正则表达式(grep,pcre等),特别是由于混入了外壳转义符,因此以为可能不匹配。

结果\.是一个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. 文档的措辞表明,如果内核不匹配,则可能是错误,这可能是不希望的,但是,如果您检查上面的输出,您将看到“错误”不会导致程序包安装失败,只是标记为已跳过。