工程由树形分布,如下所示,里面有源码和库文件源码。
ghost@ghost-machine:~/workspace/testMakefile$ tree
.
├── inc
│ ├── module_func.h
│ └── module_system_inc
│ └── module_system.h
├── Makefile(顶层)
├── open_source
│ ├── inc
│ │ ├── open_module1.h
│ │ └── open_module2.h
│ ├── Makefile(库文件层)
│ ├── open_module1.c
│ └── open_module2.c
├── prj
└── src
├── main.c
├── Makefile(源码集合层)
└── module
├── Makefile(模块层)
├── module_func.c
└── module_system.c
Makefile的架构分布
Makefile的框架分布决定着如何组织编译整个工程代码。
顶层Makefile
顶层Makefile的作用是将工程调度,先编译哪个模块,后编译哪个模块,这里的顶层Makefile先编译的是库文件的源码。
export CC = gcc
export LIB = STATIC
all:
@echo "this is all project."
@echo "CC=$(CC)"
@echo "LIB=$(LIB)"
@$(MAKE) -C ./open_source LIB=$(LIB) CC=$(CC)
@$(MAKE) -C ./src LIB=$(LIB) CC=$(CC)
clean:
rm -rf ./prj/*.o
$(MAKE) -C ./open_source clean
$(MAKE) -C ./src clean
这里定义两个外部变量,通过顶层Makefile传参给其他层的Makefile
export CC = gcc
export LIB = STATIC
LIB的参数有两个:STATIC、DYNAMIC,代表分别编译静态库和动态库。
库文件层Makefile
库文件层的Makefile负责将所管理的源码编译成库文件调度形式给工程用,通过顶层传递的Makefile参数来决定编译动态库还是静态库。