目录
- 简介
- 公共部分makefile
- 模块目录makefile
- 顶层makefile
- 实际输出
简介
学习完《跟我一起写makefile》之后,对于makefile的各种规则和函数有了初步了解,但是对于层级调用的makefile不是很熟悉,接下来的内容是搜索的网上的一个模板,对其中内容自己做了一些修改,并且简单实验了一下可以正常工作.这个模板与其他的不相同的是,他把公共部分封装成了一个makefile,这个思路感觉很有意思。
本次makefile工程的目录内容如下
公共部分makefile
首先来看看公共部分的makefile,该makefile将各个makefile公用的部分整个起来,节省了很多工作,具体解释见其中注释
1 | #################### Makefile.env ####################### |
其实这个公共部分的makefile,主要的地方就是all的依赖,除了subdirs,LIB和TARGET都是不存在的,所以后面的规则也就不会执行,subdirs的规则主要是调用下一层目录的makefile。而在下一层的makefiel中将LIB或者TARGET传入,用来编译各自的内容。
模块目录makefile
src目录的makefile
这个makefile很简单,由于该目录下无源文件,继续调用下一层makefile即可。
add目录makefile
1
2
3
4
5
6
7
8
9TOPDIR=./../..
LIB=libadd.a
INCLUDE=add.h
INCLUDEPATH=$(TOPDIR)/include
LIBPATH=$(TOPDIR)/lib
include $(TOPDIR)/Makefile.env这里提供了LIB变量,那么在公共部分的makefile中的LIB的规则就会执行啦,另外还传入了一些规则中用到的变量.
main目录的makefile
1
2
3
4
5
6
7
8
9
10TOPDIR=./../..
TARGET=main
LIBPATH=$(TOPDIR)/lib
EXEPATH=$(TOPDIR)/bin
INCLUDEPATH=$(TOPDIR)/include
LDFLAGS= -ladd
include $(TOPDIR)/Makefile.env这里提供了TARGET变量,那么在公共部分的makefile中的TARGET的规则就会执行,另外还传入了一些规则中用到的变量
顶层makefile
1 | TOPDIR=./ |
在这个makefile中,给出了不需要进行检索的目录变量exclude_dirs,另外这里的变量使用了export,是为了在后续调用的makefile中都存在这个变量,因为是使用make -f调用的,而上面的几个makefile是使用include直接引用的,所以不存在这个问题。
实际输出
1 | [root@VM_0_4_centos qwe] |
编译过程基本和我们构想的一致,并且该makefile无论修改任何一个模块的.c或.h文件,都会重新编译涉及的文件。