曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6787|回复: 0
打印 上一主题 下一主题

[Kernel] 编译外部模块的 M 与 SUBDIRS 变量

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2011-6-20 08:55:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在编译内核模块时,Makefile 里一般会写 “make -C /lib/modules/`uname -r`/build M=`pwd` modules” 这句话。其中 -C 选项来自 make 命令本身,它后接一个目录名,这里表示内核源码所在目录 。

M 变量 和 SUBDIRS 变量都来自内核顶层 Makefile ,定义如下:
[Plain Text] 纯文本查看 复制代码
# Use make M=dir to specify directory of external module to build
# Old syntax make ... SUBDIRS=$PWD is still supported
# Setting the environment variable KBUILD_EXTMOD take precedence
ifdef SUBDIRS
  KBUILD_EXTMOD ?= $(SUBDIRS)
endif

ifeq ("$(origin M)", "command line")
  KBUILD_EXTMOD := $(M)
endif

从注释知道,SUBDIRS 变量在老式风格中使用,现在都用 M 变量来指定要编译内核模块代码所在路径。也就是说以下两句是等效的:
make -C /lib/modules/`uname -r`/build M=`pwd` modules
make -C /lib/modules/`uname -r`/build SUBDIRS=`pwd` modules

如果同时在命令行里同时指定了 SUBDIRS 和 M,那么被编译的只有 M 所目录下指定的模块代码,而 SUBDIRS 的代码不会编译,这是因为 Makefile 文件从上至下解析,KBUILD_EXTMOD 变量的值最终会被 $(M) 所覆盖。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-17 23:59 , Processed in 0.065418 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表