make 的递归调用是指:在 Makefile 中使用 make 作为一个命令来执行本身或者其它 makefile 文件。递归调用在一个有多级子目录的项目中非常有用。比如,当前目录下有一个 "subdir" 的子目录,这个子目录中又有描述这个目录编译规则的 makefile 文件,在执行 make 时,需要从上层目录开始并完成它所有子目录的编译。 在当前目录下可以使用如下规则对子目录的编译:
其等价于:
或者还可以通过 -f 参数直接指定 subdir 下的 Makefile 文件:
上面,$(MAKE) 是对变量 "MAKE" 的引用;$(CURDIR) 是环境变量,表示当前目录;"-C" 选项后接要进入编译的子目录。 在 make 递归执行的过程中,最上层的 make 称为 主控make ,它的命令行选项,如 "-k", "-s" 等会通过环境变量 "MAKEFLAGS" 传递给子 make 进程。变量 "MAKEFLAGS" 的值会被主控 make 自动的设置为包含所执行 make 时的命令行选项的字符串。比如主控执行 make 时使用 "-k" 和 "-s" 选项,那么 "MAKEFLAGS" 的值就为 ks 。子 make 进程处理时,会把此环境变量的值作为执行的命令行选项,因此子 make 进程就使用 "-k" 和 "-s" 这两个命令行选项。 下面看一个具体的示例: 在某个目录下有:
其中,主控 Makefile 内容为:
submake 子目录下的 Makefile 的内容为:
接下来我们在顶层目录下 make 一下:
从输出中可以看到,submask 目录下的 make 输出了 $(MAKEFLAGS) 变量的值为 wRr ,其中 rR 这两个选项是我们在主控 Makefile 里设定的。而 w 选项的出现是因为 make 使用了 -C 选项的缘故 --- 只要使用 -C 选项来指定下层 Makefile 时,w 选项会被自动打开。如果参数中指定了 -s 选项或 "“--no-print-directory" 选项,那么 w 选项就会失效。正是由于 w 选项的打开,所以在 make 时才会输出目录信息,如:make[1]: Entering directory `/home/beyes/Makefile/temp8/submake' 关于 make 选项参数参考:http://www./bbs/read.php?tid-3536.html |
|