How the Kernel compile .c files for Kernel Module

在scripts目录下有 Makefile.build文件

 

中间有

%.o: %.c FORCE

 

这个规则是 用来编译 .c文件的

 

主要是这句

 


$(call if_changed_rule, cc_o_c)

 

if_changed_rule 在 Kbuild.include中

# Usage: $(call if_changed_rule,foo)
# Will check if $(cmd_foo) or any of the prerequisites changed,
# and if so will execute $(rule_foo).
if_changed_rule = $(if $(strip $(any-prereq) $(arg-check) ),                 /
        @set -e;                                                              /  
        $(rule_$(1)))

 

那就是说 如果文件变化,就执行 rule_cc_o_c

 

define rule_cc_o_c

    echo "---" 这里加上这句话,就会把整个语句全都打出来了
    $(call echo-cmd,checksrc) $(cmd_checksrc)             /
    $(call echo-cmd,cc_o_c) $(cmd_cc_o_c);                /  
    $(cmd_modversions)                        /  
    scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' >    /  
                                                  $(dot-target).tmp;  /
    rm -f $(depfile);                         /  
    mv -f $(dot-target).tmp $(dot-target).cmd
endef

 

最后发现是 @set -e这句话在作怪

把 @符号去掉,所有的都可以打出来了。。。。 再研究一下。。。

 

是因为@的作用范围是这一行,用/ 和 define出来的东东都在一行 所以都不输出所执行的命令了。。。

 

现在我把 rule_cc_o_c 改成这样, 这条规则应该是适应所有c文件的。不仅仅是对kernel module的

 

define rule_cc_o_c
    $(call echo-cmd,checksrc) $(cmd_checksrc)             /
    $(call echo-cmd,cc_o_c)
    $(cmd_cc_o_c)                
    @set -e; /

    $(cmd_modversions)                        /
    scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' >    /
                                                  $(dot-target).tmp;  /
    rm -f $(depfile);                         /
    mv -f $(dot-target).tmp $(dot-target).cmd
endef

 

这样 就向平时一样,可以显示 gcc 的选项 编译的文件 等了。。。

 

 

补充说一点。。。,用逗号代替分号 也可以有如此的效果,经过测试,这样加逗号很容易出错

                           尤其是在 kernel的makefile中

。。。。而这条规则貌似是只对kernel module起作用

cmd_link_multi-m = echo "",$(LD) $(ld_flags) $(LDFLAGS_MODULE) -o $@ $(link_multi_deps)
#yw changed

 

原本这个link的命令是没有输出内容的, 调用之前有一个@符号的

 

我加了 echo "", 强行将这句话分开了。 就可以输出了。。。。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值