在 Linux 源代码树之外编译模块时没有可用的构建脚本

在 Linux 源代码树之外编译模块时没有可用的构建脚本

我正在尝试在 Linux 源代码树 (3.18.0-rc6) 之外构建一个基本模块。当我构建它时,我收到一条错误消息,说它找不到脚本/...

我的目录设置如下

mymodule/
  src/
    file.c
linux/
  .git/
  # rest of the source tree

我正在运行:make -C ../linux SUBDIRS=$(pwd)/src modules从我的模块。

这是实际的错误:

make: Entering directory '/home/me/linux'
  Building modules, stage 2.
  MODPOST 1 modules
/bin/sh: scripts/mod/modpost: No such file or directory
scripts/Makefile.modpost:90: recipe for target '__modpost' failed
make[1]: *** [__modpost] Error 127
Makefile:1384: recipe for target 'modules' failed
make: *** [modules] Error 2
make: Leaving directory '/home/me/linux'

是否有一个设置可以让 Make 在 linux/ 中查找脚本?

答案1

要构建内核模块,您需要的不仅仅是解压的内核源代码。您需要一些在内核构建期间生成的配套程序和头文件。生成文件正在寻找modpost正确的位置,但尚未找到。发行版通常将其放在名为或或类似名称的包中。linux-headers-VERSIONkernel-headers-VERSION

首先,您需要配置内核。内核版本和内核配置必须与您要运行该模块的内核相匹配。如果您.config从某处获得该文件,请将其复制到内核目录。然后,构建必要的文件来构建额外的模块,在内核源目录中运行以下命令:

make modules_prepare

然后你可以进入模块的源目录并运行

make -C ../linux M=$PWD/src

构建外部模块在内核文档 ( Documentation/kbuild/modules.txt) 中了解更多信息。

答案2

在构建自定义内核时,大多数人不要建造源 tarball 内的源代码。请考虑使用软链接:

用户源目录列表

正如您所看到的,/usr/src/linux链接指向/usr/src/linux-3.12.21-gentoo-r1目录因此,当发出 make 命令时,生成的输出将被放入构建树的顶级目录中,这不会污染原始源。要构建链接问题(以 root 身份):

ln -sf /usr/src/linux-_some-kernel-version_ /usr/src/linux && cd /usr/src/linux

完成后,参考 Giles 的回答来完成任务。


参考

  1. 内核/升级 - Gentoo Wiki

相关内容