LINUX-MOD-R1.ECLASS

节:eclass-manpages (5)
更新:2024 年 11 月
索引 返回主内容

名称

linux-mod-r1.eclass - 用于安装树外 Linux 内核模块的函数

描述

有关深入使用的信息,请参阅 linux-mod-r1_src_compile 函数文档,有关快速概述,请参阅下面的示例。

linux-mod -> linux-mod-r1 迁移说明


 0. 如果缺少,定义 src_compile,下面的局部变量在那里。
 1. MODULE_NAMES="name(libdir:srcdir:objdir)"
    BUILD_TARGETS="target"
      -> local modlist=( name=libdir:srcdir:objdir:target(s) )
    - 首先尝试不带 :target,现在它几乎总是没有必要的
    - srcdir 默认设置为当前目录,请注意路径
      可以相对于它(通常*不*应传递 ${S})
 2. BUILD_PARAMS 和/或 BUILD_FIXES
      -> local modargs=( VAR="${KV_OUT_DIR}" ... )
    - CC/LD 和类似的不再需要,总是被传递(V=1 也是)
    - eval(又名 eval "${BUILD_PARAMS}")*不*用于此
 3. s/linux-mod_/linux-mod-r1/g
 4. _preinst+_postrm 可以删除,保留 linux-mod-r1_pkg_postinst
 5. linux-mod-r1_src_install 现在运行 einstalldocs,根据需要调整
 6. 如果*不*使用 linux-mod-r1_src_compile/install,则参考
    eclass 的第二个示例并确保使用 modules_post_process
 7. 如果有,clang<->gcc 切换自定义解决方法可以删除
 8. 如果曾经或需要内核版本检查,请参阅 MODULES_KERNEL_MAX/_MIN。

这不是一个详尽的列表,请验证安装后的文件是否没有丢失。在构建日志中查找“command not found”错误。

除非想要保留旧版本作为回归的备用,否则修订版本升级并不严格需要,内核升级或新的 IUSE=+strip 通常会导致无论如何重新构建。

支持的 EAPIS

8

传递提供的 ECLASSES

linux-info

示例

如果源目录 S 的布局如下
 - Makefile (在当前目录中构建 gentoo.ko)
 - gamepad/Makefile (想要安装到 kernel/drivers/hid)
 - gamepad/obj/ (构建的 gamepad.ko 最终会在这里)

...并且 Makefile 使用 NIH_SOURCE 变量来查找内核构建目录在哪里(又名 KV_OUT_DIR,请参阅 linux-info.eclass)

那么

CONFIG_CHECK="INPUT_FF_MEMLESS" # gamepad needs it to rumble
MODULES_KERNEL_MIN=5.4 # needs features introduced in 5.4

src_compile() {
    local modlist=(
        gentoo
        gamepad=kernel/drivers/hid:gamepad:gamepad/obj
    )
    local modargs=( NIH_SOURCE="${KV_OUT_DIR}" )

    linux-mod-r1_src_compile
}

或者,如果直接使用包的构建系统更方便,一个典型的示例可能是

src_compile() {
    MODULES_MAKEARGS+=(
        NIH_KDIR="${KV_OUT_DIR}"
        NIH_KSRC="${KV_DIR}"
    )

    emake "${MODULES_MAKEARGS[@]}"
}

src_install() {
    emake "${MODULES_MAKEARGS[@]}" DESTDIR="${ED}" install
    modules_post_process # strip->sign->compress

    einstalldocs
}

一些额外的 make 变量可能很有用
 - INSTALL_MOD_PATH: 有时用作 DESTDIR
 - INSTALL_MOD_DIR: 相当于 linux_moduleinto

MODULES_MAKEARGS 由 eclass 设置以处理工具链,并且在安装时还尝试禁用自动剥离、压缩、签名和 depmod 以让 eclass 处理它。

linux_domodule 可用于安装单个模块。

(请记住确保为 depmod 运行 linux-mod-r1_pkg_postinst)

功能

linux-mod-r1_pkg_setup
在使用来自此 eclass 的其他功能之前需要,并将
 1. 运行 linux-info_pkg_setup (请参阅 linux-info.eclass)
 -> 意味着处理 CONFIG_CHECK,以及提供 KV_ 变量
   (MODULES 和 TRIM_UNUSED_KSYMS 总是被检查)
 2. 准备工具链以匹配内核
 -> 设置 KERNEL_{CHOST,CC,CXX,LD,AR,NM,OBJCOPY,OBJDUMP,READELF,STRIP}
 -> 还设置 MODULES_MAKEARGS 数组,例如 CC="${KERNEL_CC}"
   (通常这些*不*应该直接使用,用于自定义构建)
 3. 执行各种健全性检查以尽早发现问题
linux-mod-r1_src_compile
构建模块,有关快速概述,请参阅 eclass 的示例。使用 modlist 和 modargs 变量,如下所述

* local modlist=( ... ) - 要构建的模块列表,设置为


    module-name=install-dir:source-dir:build-dir:make-target

> module-name: 生成的名称,又名 <module-name>.ko(必需)。

> install-dir: 要安装模块到的内核模块子目录 (/lib/modules/version/<install-dir>/name.ko)。在运行 linux-mod-r1_src_install 时将使用。如果存在,可能需要考虑 INSTALL_MOD_DIR(Makefile) 或 DEST_MODULE_LOCATION(dkms.conf) 的值,但它可以是任何东西。
 -> 默认值:extra

警告:更改此位置可能会导致过时的模块,直到内核升级,因为包管理器通常不会删除旧模块,并且只会在重建时进行覆盖。

> source-dir: 包含用于构建模块的 Makefile 的目录。路径可以相对于当前目录或绝对路径。
 -> 默认值:当前目录

> build-dir: 将保存构建的 module-name.ko 的目录。
 -> 默认值:与 source-dir 的值相同

> make-target: 几乎总是没有必要的,但是,如果默认值不正确,则可以指定 Makefile 的目标(目标)来构建模块/附加内容。多个目标可以使用空格,例如:"first second"。
 -> 默认值:特别尝试 modules、module、<name>.ko、default、all、空目标,并运行第一个找到的可用的目标

缺少元素会导致使用默认值,例如,这是有效的
  modlist=( name1 name2=:source name3=install::build )

* local modargs=( ... ) - 要传递给 emake 的额外参数

Makefile 应特别检查它使用哪个变量来查找内核的构建目录,然后,例如,KDIR="${KV_OUT_DIR}" 作为适当的值。请注意,通常希望传递 KV_OUT_DIR(build) 而不是 KV_DIR(sources) 如果不是两者。这允许用户进行源外内核构建并仍然构建模块。

传递常见的工具链变量,如 CC 或 LD,这里不需要,因为它们默认情况下被传递。

---

如果需要针对每个模块或中间步骤使用不同的 modlist,则允许多次调用它,尽管如果非典型,可能需要手动构建(请参阅 eclass 的示例)。

linux-mod-r1_src_install
使用 linux_domodule 安装由 linux-mod-r1_src_compile 构建的模块,然后运行 modules_post_process 和 einstalldocs。
linux-mod-r1_pkg_postinst
使用 depmod 更新模块依赖项。
linux_domodule <module>...
安装 Linux 模块(.ko 文件)。

另请参阅 linux_moduleinto。

linux_moduleinto <install-dir>
在调用 linux_domodule 时安装模块到的目录。相对于内核模块路径,例如:${ED}/lib/modules/${KV_FULL}/<install-dir>

可以包含子目录,例如 kernel/fs。

如果未调用,则默认为“extra”。在内核构建系统上,这类似于设置 INSTALL_MOD_DIR,它对外部模块具有相同的默认值。

modules_post_process [<path>]
剥离、签名、验证和压缩在 <path> 下找到的所有 .ko 模块。通常*不*应直接调用,因为它将由 linux-mod-r1_src_install 运行。这旨在用于模块以其他方式安装的情况。

<path> 应存在于 ${ED} 下。默认为 /lib/modules/${KV_FULL}。

文件名可能会因压缩而更改,因此应在此之前执行对这些文件的任何操作。

警告:如果未找到任何模块,这将中止,这可能会发生在模块意外预先压缩的情况下,可能是由于使用 make install 而不传递 MODULES_MAKEARGS 来禁用它。

ECLASS 变量

KERNEL_CHOST (用户变量)
可以设置为 CHOST 值,以在为构建内核模块选择工具链时使用。这类似于设置内核构建系统的 CROSS_COMPILE 变量,减去尾部的连字符。

如果这没有自动选择所需的工具链,可以通过设置没有直接记录(但有效)的变量来实现更精细的控制

KERNEL_{CC,CXX,LD,AR,NM,OBJCOPY,OBJDUMP,READELF,STRIP}

如果有疑问,请不要设置任何这些。

默认值(如果未设置):自动检测,通常与当前 CHOST 相同

MODULES_EXTRA_EMAKE (用户变量)
构建模块时要传递给 emake 的额外参数。可以包含带引号空格的参数,例如:
..._EMAKE="KCFLAGS='-fzomg-optimize -fsuper-strict-aliasing' ..."
MODULES_I_WANT_FULL_CONTROL (用户变量)
当设置为非空值时,禁用在构建模块时将大部分 eclass 的工具链默认值传递给 emake。基本 eclass 要求、ebuilds 的 modargs 和用户的 MODULES_EXTRA_EMAKE 仍然被使用。

主要针对具有修改内核 Makefiles 的专家用户,他们希望 Makefile 的值默认情况下被使用。

在考虑此问题之前,可能需要查看 KERNEL_CHOST。

MODULES_INITRAMFS_IUSE (在继承之前设置)
如果设置,则添加指定的 USE 标志。启用此标志时,安装的内核模块将被注册以包含在 dracut initramfs 中。此外,如果使用的是发行版内核(USE="dist-kernel"),则这些内核将被重新安装。

典型的建议值是“initramfs”或“+initramfs”(全局 IUSE)。

如果未设置 MODULES_INITRAMFS_IUSE,或者未启用指定的标志,则安装的内核模块将被排除在 dracut initramfs 之外。

MODULES_SIGN_HASH (用户变量)
与 USE=modules-sign 一起使用。可以设置为在签名生成期间使用的哈希算法。

与其设置此值,建议使用内核配置进行选择以确保适当的支持(例如 CONFIG_MODULE_SIG_SHA256),然后它将在此自动检测到。

有效值:sha512、sha384、sha256、sha224、sha1

默认值(如果未设置):内核 CONFIG_MODULE_SIG_HASH 的值

MODULES_SIGN_KEY (用户变量)
与 USE=modules-sign 一起使用。可以设置为 PEM 格式的私钥路径,或 PKCS#11 URI。

如果路径是相对路径(例如“certs/name.pem”),则假设它相对于正在使用的内核构建目录。

如果密钥需要密码或 PIN,则使用的内核签名文件实用程序会识别 KBUILD_SIGN_PIN 环境变量。请注意,包管理器可能会将此值存储在二进制包、数据库文件、临时文件以及可能日志中。此 eclass 在使用后取消设置变量以减轻问题(特别是对于共享二进制包),但请谨慎使用。

未设置时的默认值:内核 CONFIG_MODULE_SIG_KEY 的值,该值本身默认为 certs/signing_key.pem

MODULES_SIGN_CERT ?= certs/signing_key.x509 (用户变量)
与 USE=modules-sign 一起使用。可以设置为要使用的 X.509 公钥证书的路径。

如果路径是相对路径(例如“certs/name.x509”),则假设它相对于正在使用的内核构建目录。

MODULES_KERNEL_MAX
如果设置为内核版本(格式:1、1.2 或 1.2.3),则如果使用的版本大于(ver_test -gt)此值,将使用相同数量的版本组件打印警告(即 MAX=1.2 允许 1.2.3,但 MAX=1.2.2 不允许)。

这*应该*仅用于已知在内核升级时经常出现故障的模块。如果将此设置为非 LTS 内核,则还应注意定期测试和更新此值,以使用新的主要内核版本,以免警告变得陈旧并被用户忽略。

允许用户轻松尝试或自我修补并不致命,但(大量)警告很难忽略。如果需要对更严重的问题(例如运行时文件系统损坏)进行致命检查,请手动执行。

这旨在减少针对可通过使用 LTS 内核并等待新版本轻松缓解的重复预期问题的错误报告数量。

如果使用,必须在调用 linux-mod-r1_pkg_setup 之前设置。

MODULES_KERNEL_MIN
如果设置为内核版本(格式:1、1.2 或 1.2.3),则如果使用的版本小于(ver_test -lt)此值,将中止。

仅应在已知损坏或上游推荐明智的最低限度时使用。对于不再位于树中的内核,它并不是特别必要。

如果使用,必须在调用 linux-mod-r1_pkg_setup 之前设置。

MODULES_OPTIONAL_IUSE (在继承之前设置)
可能包含一个要添加到 IUSE 的单个标志,可选地以 + 符号为前缀以默认启用它。这样做会使 linux-mod-r1 的所有功能和依赖项成为无操作,除非该标志已启用。这包括阶段,例如 linux-mod-r1_pkg_setup 不会处理 CONFIG_CHECK,除非设置了该标志。

典型的推荐值是 "+modules"(全局 IUSE)。

请注意,即使用户空间工具需要模块,模块是可选的也可能很有用(例如,在模块在主机上加载时在 chroot 或前缀中安装,可以节省设置 linux 源代码)。但是,如果工具构建起来非同寻常,则可能优于使用此变量将它们拆分为两个包,因为每次内核升级都需要重新构建。

MODULES_MAKEARGS (由 ECLASS 生成)
将在调用 linux-mod-r1_pkg_setup 后设置。包含在构建或安装模块时应传递给 emake 的参数。

修改此变量是可以接受的(例如,附加内核源代码参数),但是,如果使用 linux-mod-r1_src_compile,则设置 modargs 是更清洁且不易出错的预期方法。

作者

Ionen Wolkens <[email protected]>

维护者

Ionen Wolkens <[email protected]>
Gentoo 内核项目 <[email protected]>

报告错误

请通过 https://bugs.gentoo.org/ 报告错误。

文件

linux-mod-r1.eclass

另请参见

ebuild(5)
https://gitweb.gentoo.org/repo/gentoo.git/log/eclass/linux-mod-r1.eclass


索引

名称
描述
linux-mod -> linux-mod-r1 迁移说明
支持的 EAPIS
传递提供的 ECLASSES
示例
功能
ECLASS 变量
作者
维护者
报告错误
文件
另请参见

此文档由 man2html 使用手册页创建。
时间:2024 年 11 月 12 日,格林威治标准时间 03:27:01