在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 "", 强行将这句话分开了。 就可以输出了。。。。