可以参考
当我们uboot执行make rpi_b的时候。根本没有发现makefile里面没有rpi_b这个目标
那么rpi_b这个目标是哪里来的呢?
原来makefile中有这么一句:
sinclude $(obj).boards.depend
$(obj).boards.depend: boards.cfg
@awk '(NF && $$1 !~ /^#/) { print $$1 ": " $$1 "_config; $$(MAKE)" }' $< > $@
(一般$obj为空)因此有一个隐藏文件 .boiards.depend
内容一般为
rpi_b: rpi_b_config; $(MAKE)
rockchip: rockchip_config; $(MAKE)
integratorap_cm720t: integratorap_cm720t_config; $(MAKE)
a320evb: a320evb_config; $(MAKE)
at91rm9200ek: at91rm9200ek_config; $(MAKE)
执行的时候rpi_b目标就是这里来的
@awk '(NF && $$1 !~ /^#/) { print $$1 ": " $$1 "_config; $$(MAKE)" }' $< > $@
意思是
$<是输入文件(boards.cfg),$@是目标本身(.boards.depend),如果文件中某行不为空,第一个元素不为~和#就将其以print $$1 ": " $$1 "_config; $$(MAKE)"的格式输出到文件$@中。最终生成的.boards.depend
可以通过在uboot目录命令行执行
awk '(NF && $1 !~ /^#/) { print $1 ": " $1 "_config; $(MAKE)" }' boards.cfg >.boards.depend
得到这个.boards.depend
再来看其中的意思
rpi_b: rpi_b_config; $(MAKE)
rpi_b依赖于 rpi_b_config
$(MAKE) 就是make的意思
rpi_b: rpi_b_config; $(MAKE)可以改写为
rpi_b: rpi_b_config
$(MAKE)
是一个意思。如果放在一行需要加个分号。换行的$(MAKE)用tab开头
所以整句的意思就是先构建rpi_b_config随后执行make
rpi_b: rpi_b_config; $(MAKE) == make rpi_b_config&&make