概述
在一个大的工程文件中,不同的文件按照功能被划分到不同的模块中,每个模块可能都会有自己的编译顺序和规则。如果在一个 Makefile 文件中描述所有模块的编译规则,就会显得很杂乱,执行时也会很不方便。
如果在不同的模块中分别对它们的规则进行描述,即每一个模块都编写一个 Makefile 文件,这样不仅方便管理,而且可以迅速发现模块中的问题。我们只需要在总的Makefile中控制其他模块中的 Makefile,就可以实现总体的控制。
这就是 make 的嵌套执行。
举例
subsystem:cd subdir && $(MAKE)
说明:在当前目录下有一个 subdir 文件夹 和一个 Makefile 文件,subdir 文件夹中也有一个 Makefile 文件,它用来描述这个子目录文件的编译规则。使用时,只需要在最外层的目录中执行 make 命令,当命令执行到上述的规则时,程序会进入到子目录中执行 make。这就是嵌套执行 make,我们把最外层的 Makefile 称为是总控 Makefile。
上述的规则也可以换成另外一种写法:
subsystem:$(MAKE) -C subdir
在 make 的嵌套执行中,我们需要了解一个变量 "CURDIR",此变量代表 make 的工作目录。当使用 make 的选项 "-C" 的时候,命令就会进入指定的目录中,然后此变量就会被重新赋值。总之,如果在 Makefile 中没有对此变量进行显式的赋值操作,那么它就表示 make 的工作目录。我们也可以在 Makefile 中为这个变量赋一个新的值,重新赋值后的这个变量将不再代表 make 的工作目录。
export的使用
使用 make 嵌套执行的时候,需要注意变量是否传递。
如果需要传递变量,那么可以这样:
export <variable>
如果不需要传递变量,可以这样来写:
unexport <variable>
如果所有的变量都需要传递,那么只需要使用 "export" 就可以,不需要添加变量的名字。
注意<variable>是变量的名字,不需要使用 "$" 这个字符。
Makefile 中有两个变量,即 SHELL 和 MAKEFLAGS,不管是否使用关键字 "export" 声明,它们总会传递到下层的 Makefile 中。
MAKEFLAGS 变量,包含了 make 的参数信息。如果执行总控 Makefile 时,make 命令带有参数或者在上层的 Makefile 中定义了这个变量,那么 MAKEFLAGS 这个变量的值将会是 make 命令传递的参数,并且会传递到下层的 Makefile 中,这是一个系统级别的环境变量。
make 命令中有几个参数选项并不传递,它们是:"-C"、"-f"、"-o"、"-h" 和 "-W"。如果我们不想传递 MAKEFLAGS 变量的值,在 Makefile 中可以这样来写:
subsystem:cd subdir && $(MAKE) MAKEFLAGS=