父Makefile
在src目录下包含很多文件夹,那么需要遍历所有的目录执行Makefile,那么给一个在src目录下的Makefile。
# 需要排除的目录
exclude_dirs := include bin
# 取得当前子目录深度为1的所有目录名称
DIRS := $(shell find . -maxdepth 1 -type d)
DIRS := $(basename $(patsubst ./%,%,$(DIRS)))
DIRS := $(filter-out $(exclude_dirs),$(DIRS))
.PHONY: release clean
release:
@for x in $(DIRS); \
do \
make -C $$x; \
done
clean:
@for x in $(DIRS); \
do \
make -C $$x $@; \
done
调试Makefile
再编写一个调试文件var.mk,内容如下:
%:
@echo '$*=$($*)'
d-%:
@echo '$*=$($*)'
@echo ' origin = $(origin $*)'
@echo ' value = $(value $*)'
@echo ' flavor = $(flavor $*)'
查看变量
make
-f
test
.mk -f var.mk OBJS
make
-f
test
.mk -f var.mk d-CFLAGS
说一说”d-” 前缀(其意为details),其中调用了下面三个参数。
$(origin):告诉你这个变量是来自哪儿,file表示文件,environment表示环境变量,还有environment override,command line,override,automatic等。
$(value):打出这个变量没有被展开的样子。比如上述示例中的 foo 变量。
$(flavor):有两个值,simple表示是一般展开的变量,recursive表示递归展开的变量
比如查看DIRS变量:
子Makefile
子目录中Makefile就比较简单了,如下就可以:
所有源码都可以在项目https://github.com/jacksu/design_pattern中找到。
参考文档
http://coolshell.cn/articles/3790.html