标签: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试试看
标签:one 有一个 注意 内容 正则表达式 正则 cut 默认 问题
原文地址:http://www.cnblogs.com/liutianchen/p/7620118.html