大的软件项目一般都会采用分模块的组织结构,分离编译使得各个模块可以分别编译,最后链接成最终的执行文件。使用make程序可以使项目的编译过程自动化,但针对一个大的软件项目,对makefile的编写提出了比较高的要求。
我们一般会按目录结构组织软件项目中的各个模块,每个大的模块放在一个目录下,该模块可以再细分为几个小模块,相应的放在几个子目录中。编写makefile时至少应该以以下几点作为目标:
1. 可以以任意模块粒度进行make。
2. 对各个模块可以使用相同的make调用参数及目标名。
3. 可以方便的增减模块。
要达到上述目标,一个基本的想法是:每个目录下放置makefile文件,每个子目录可以分别make,而该目录又可以被上层目录递归调用make。
在对各个模块进行编译时,有许多公共的部分,如一些普遍的模式规则,递归方法等,我们把这些东西放在一个公共的common.mk中, 各个子目录下的makefile可以定义模块相关的东西,如自己的递归子目录,模块相关的特殊编译参数,模块相关的输出等。为了使在各级目标下可以使用相同的目标名,我们把这些目标及对应规则放在common.mk中,但这些目标的依赖项可能据不同的模块而有所不同。