vivi的第4个依赖是linuxsubdirs,这也是这里最复杂的依赖,不过用我们的基本原则,照样把他搞定。我们寻找linuxsubdirs的依赖。
158 #SUBDIRS = drivers lib 159 #linuxsubdirs: _dir_drivers _dir_lib 160 linuxsubdirs: $(patsubst %, _dir_%, $(SUBDIRS)) 161 $(patsubst %, _dir_%, $(SUBDIRS)) : include/version.h 162 #$@=_dir_drivers _dir_lib 163 #$(patsubst _dir_%, %, $@)=drivers lib 164 $(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" -C $(patsubst _dir_%, %, $@)
|
我们先找linuxsubdirs的依赖
$(patsubst %, _dir_%, $(SUBDIRS)) patsubst是Makefile中的替代函数,典型用法是
$(patsubst A, B, $(SUBDIRS)),用A的模式来替换B的模式。在上面的例子中,SUBDIRS=drivers lib。那么
$(patsubst %, _dir_%, $(SUBDIRS))在所有的名字前面加上_dir_,最终的结果就是
_dir_drivers _dir_lib。
$(patsubst %, _dir_%, $(SUBDIRS))又依赖于include/version.h,我们在上面已经讨论过include/version.h的产生了,就不再多说。
依赖寻找完毕,那就可以执行下面的命令了:
$(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" -C $(patsubst _dir_%, %, $@) $@表示目标名,上例中,%@就是$(patsubst %, _dir_%, $(SUBDIRS)),也即
_dir_drivers _dir_lib。
$(patsubst _dir_%, %, $@)替换后就是: drivers lib
整个命令的意思就是分别执行drivers lib目录下的Makefile。我们可以查看drivers和lib目录,下面都是有Makefile的。各个子目录下Makefile的执行细节我们将在后面详述,现在我们则只要有个大概映象就可以了。
可能有细心的读者就要问了,前面
SUBDIRS = drivers lib就
定义得好好的,用它直接作目标就可以了,为什么还要搞一堆麻烦的替换,把名字加上_dir_,最后又换回来,这么折腾干吗呢。大家别着急,其实刚开始我也
是一样的想法,后来想想才明白作者的良苦用心:Makefile中的目标名字是很重要的,而driver或lib是子目录的名字,在Makefile中会
经常用到,因此,为了不和它们混淆,产生不必要的麻烦,就对目标的名字进行了替换。
至此,vivi的四个依赖我们都走了一遍,现在理一下,欠的帐是,各个子目录下Make文件的执行过程,以及vivi目录下命令的执行过程。待我们稍作休整,继续前进。
阅读(1752) | 评论(0) | 转发(3) |