Chinaunix首页 | 论坛 | 博客
  • 博客访问: 362915
  • 博文数量: 135
  • 博客积分: 425
  • 博客等级: 下士
  • 技术积分: 599
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-19 21:10
文章分类
文章存档

2014年(3)

2013年(79)

2012年(53)

分类: LINUX

2013-10-16 11:06:35

   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目录下命令的执行过程。待我们稍作休整,继续前进。
阅读(1118) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~