以下内容源于C语言中文网的学习与整理,如有侵权请告知删除。
一、“嵌套执行make”的含义
在一个大的工程中,不同文件按照功能被划分到不同的模块,每个模块可能有不同的编译顺序和规则。如果在一个 Makefile 文件中描述所有模块的编译规则,就会显得很杂乱,执行不方便。
如果在不同的模块中分别对它们的规则进行描述,即每一个模块都编写一个Makefile文件,这样既方便管理,也可以迅速发现模块中的问题。我们在总Makefile中控制其他模块中的 Makefile,就可以实现总体的控制。
这就是 make 的嵌套执行。
二、举例说明
假如在cur目录下有一个subdir文件夹和一个Makefile文件,subdir文件夹中也有一个Makefile文件,它用来描述subdir这个子目录文件的编译规则。
则cur目录下的Makefile文件可以这样写:
subsystem:
cd subdir && $(MAKE)
在cur目录下执行 make 命令,当命令执行到上述的规则时,程序会进入到subdir这个子目录中执行 make。这就是嵌套执行 make,我们把最外层的 Makefile 称为是总控 Makefile。
上述的规则也可以换成另外一种写法:
subsystem:
$(MAKE) -C subdir
make命令的-C选项,指定了到哪个目录下执行make命令(见博客make命令的参数选项)。
在make的嵌套执行中,变量CURDIR代表着make的工作目录。当使用选项 -C指定make的工作目录时,就会进入所指定的目录,此时变量CURDIR就会被重新赋值为-C所指定的目录。
如果Makefile中没有对此变量进行显式的赋值操作,那么它就表示make的工作目录,如果我们给这个变量赋一个新的值(比如abcd),则重新赋值后的这个变量将不再代表 make 的工作目录。
三、export的使用
1、export的使用方法
export这个命令,可以将主Makefile中的变量传递给子模块中的Makefile。
如果需要传递变量,那么可以这样:
export variable #注意variable是变量的名字,不需要使用 "$" 这个字符
如果不需要传递变量,可以这样来写:
unexport variable #注意variable是变量的名字,不需要使用 "$" 这个字符
如果所有的变量都需要传递,那么只需要使用 "export" 就可以,不需要添加变量的名字。
export
2、SHELL变量、MAKEFLAGS变量
Makefile 中有两个变量,即 SHELL 和 MAKEFLAGS,不管是否使用关键字 "export" 声明,它们总会传递到下层的 Makefile 中。
MAKEFLAGS变量,包含着make的参数信息。在执行总控Makefile时,如果make命令带有参数,那么MAKEFLAGS这个变量的值,就是make命令所带的参数。MAKEFLAGS这个变量会传给下一层的Makefile,它是一个系统级别的环境变量。
但make命令中有几个参数选项并不传递,它们是"-C"、"-f"、"-o"、"-h" 和 "-W"。
另外,如果我们不想传递 MAKEFLAGS 变量的值,在总控Makefile 中可以这样来写:
subsystem:
cd subdir && $(MAKE) MAKEFLAGS=