码迷,mamicode.com
首页 > 其他好文 > 详细

makefile调用所有子目录makefile

时间:2017-10-02 14:59:19      阅读:529      评论:0      收藏:0      [点我收藏+]

标签:one   有一个   注意   内容   正则表达式   正则   cut   默认   问题   

在网上找了很多,没有一个能拿过来直接用的

makefile调用所有子目录makefile

顶层makefile代码

SUBDIRS = $(shell find . * -type d | grep -v "\.")

.PHONY:all clean

all:
        @for subdir in $(SUBDIRS); do                   $(MAKE) -C $$subdir;            done

clean:
        @for subdir in $(SUBDIRS); do                   $(MAKE) -C $$subdir clean;        done

说明:

1. 使用shell find方法调出当前目录所有子目录

$(shell find . * -type d | grep -v "\.")

备注:

  -type表示类型,d是directory文件夹

  *是所有内容,在makefile里给*加上“”会报错

  如果没有用grep去除多级目录,则会产生以下效果

find . * -type d
.
./02
./03
./001
001
02
03

  使用grep -v去除所有.开头的项目,.需要以转义字符写为\.,否则自动匹配正则表达式,会剔除所有内容

2. 使用隐式数组获取上述所有结果

SUBDIRS = $(shell find . * -type d | grep -v "\.")

不是subdirs本身是隐式数组,是这种方法,可以让subdirs变量变成一个数组变量,把线性的find结果直接当数组在for里面用,也就是说subdirs本身其实是

 

dir1\rdir2\rdir3

 

这么个隐式数组

3. 使用for循环遍历所有目录

all:
        @for subdir in $(SUBDIRS); do                   $(MAKE) -C $$subdir;            done

备注:

  如果是复制过去的,考虑8个空格和tab的问题,MAKEFILE中使用tab开头以执行动作

  注意$(MAKE) -C $$subdir是比较有用的自动推导的方法

    如果是想make就$(MAKE) -C $$subdir,如果想clean就加上clean(同理如果有别的目标也可以指令,但是这样会对所有子makefile生效,子makefile如果找不到目标就exit:1)

  两个伪目标 all clean对应子makefile中的默认make和clean,保持整齐。

  makefile使用c语言的规则,空格和换行表示一段结束

  也就是说,dir1 dir2 dir3能够被for subdir in xxx识别为三个元素,

  dir1

  dir2

  dir3也能被识别为三个元素(我上面写的subdir=$(shell find 。。。)就是用的回车方法,因为在bash里执行的结果是换行

  但是,如果subdir = "dir1 dir2 dir3",就表示只有一个文件夹了

  因为字符串连成一片了,如果想拆开可以使用cut 指令,具体方法可以man cut试试看

makefile调用所有子目录makefile

标签:one   有一个   注意   内容   正则表达式   正则   cut   默认   问题   

原文地址:http://www.cnblogs.com/liutianchen/p/7620118.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!