曲径通幽论坛

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

[Kernel] no-dot-config-targets/dot-config/mixed-targets

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2011-6-24 12:54:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Makefile 对应内核版本:2.6.35.13
no-dot-config-targets 定义在 414 行:
[code=Makefile]no-dot-config-targets := clean mrproper distclean \
             cscope TAGS tags help %docs check% \
             include/linux/version.h headers_% \
             kernelrelease kernelversion[/mw_shl_code]
no-dot-config-targets 的意思是这些目标和 .config 完全无关的。使用 make help 也可以看到这些目标,如:help, kernelversion, kernelrelease, headers_install 等等。

而与 .config 有关的目标(dog-config)则有两种,一种是产生 .config 文件,如 menuconfig, oldconfig, defconfig 等,这些目标也称为配置目标(config targets);另外一种是需要使用 .config 文件的目标,它们必须以 .config 文件中的配置作为构建自己的依据,比如 all, vmlinux, modules, bzImage 等,这些目标也称为构建目标(build targets)

还有一种目标是混合目标(mixed-targets),它表示在执行 make 命令时,同时指定了 配置目标 和 其它的目标,而不仅仅是指 配置目标 和 构建目标 相混合。比如 make defconfig vmlinux 命令是 配置目标和构建目标的混合;make defconfig kernelversion 中的 kernelversion 则不是构建目标。

顶层 Makefile 文件中与上面所述几个目标的相关变量:no-dot-config-targets, dot-config, mixed-targets 。相关代码定义在 414-436 行:
[code=Makefile]
no-dot-config-targets := clean mrproper distclean \
             cscope TAGS tags help %docs check% \
             include/linux/version.h headers_% \
             kernelrelease kernelversion

config-targets := 0
mixed-targets  := 0
dot-config     := 1

ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
    ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
        dot-config := 0
    endif
endif

ifeq ($(KBUILD_EXTMOD),)
        ifneq ($(filter config %config,$(MAKECMDGOALS)),)
                config-targets := 1
                ifneq ($(filter-out config %config,$(MAKECMDGOALS)),)
                        mixed-targets := 1
                endif
        endif
endif[/mw_shl_code]
这一段代码,开始对 no-dot-config-targets 变量进行了定义。

然后,将 config-targets, mixed-targets, dot-config 这 3 个变量分别定义为 0, 0, 1 。接下来在在

ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)

中判断 make 命令的目标中是否含有 no-dot-config-targets 这些目标,如果有,那么接着执行下面

ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)

的判断,这里将 no-dot-config-targets 这种目标从 make 命令中的所有目标都去掉,然后看结果是否为空,若为空的话,则说明 make 命令中仅含有变量 no-dot-config-targets 中指出的目标,这时就将 dot-config 变量值设为 0 ,所以这次所要 make 的目标是和 .config 文件无关的,也就是说,它们既不会产生 .config配置文件,也不需要用 .config 文件来构建其它相关的目标。

继续往下,在

ifeq ($(KBUILD_EXTMOD),)

中判断是否要编译模块,如果 $(KBUILD_EXTMOD) 为空,则说明不是编译外部模块,那么程序来到下面的判断:

ifneq ($(filter config %config,$(MAKECMDGOALS)),)

这里判断 make 命令中指定的目标中是否含有 config 或者 %config 这样的目标,如果有的话,则将 config-targets 变量设置为 1 。

接着继续来到下面的判断语句:

ifneq ($(filter-out config %config,$(MAKECMDGOALS)),)

这里判断除了 config 或 %config 这些目标外,是否还要构建其它目标,如果还有的话,那么就是在 make 一个混合目标,此时将 mixed-targets 变量设置为 1 。比如 make defconfig kernelversion 就是构建混合目标的例子。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-18 06:14 , Processed in 0.069335 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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