曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 10002|回复: 0
打印 上一主题 下一主题

make 的递归执行与 MAKEFLAGS 变量

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2011-5-17 15:00:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
make 的递归调用是指:在 Makefile 中使用 make 作为一个命令来执行本身或者其它 makefile 文件。递归调用在一个有多级子目录的项目中非常有用。比如,当前目录下有一个 "subdir" 的子目录,这个子目录中又有描述这个目录编译规则的 makefile 文件,在执行 make 时,需要从上层目录开始并完成它所有子目录的编译。

在当前目录下可以使用如下规则对子目录的编译:
subsystem:
       cd subdir && $(MAKE)
其等价于:
subsystem:
       $(MAKE) -C subdir
或者还可以通过 -f 参数直接指定 subdir 下的 Makefile 文件:
make -f $(CURDIR)/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" 这两个命令行选项。

下面看一个具体的示例:
在某个目录下有:
$ ll
total 12
-rw-rw-r--. 1 beyes beyes   73 May 17 00:15 hello.c
-rw-rw-r--. 1 beyes beyes  169 May 17 13:47 Makefile
drwxrwxr-x. 2 beyes beyes 4096 May 17 13:27 submake
$ ll submake/
total 4
-rw-rw-r--. 1 beyes beyes 47 May 17 13:27 Makefile
其中,主控 Makefile 内容为:
[Plain Text] 纯文本查看 复制代码
MAKEFLAGS += -rR

hello : hello.o
#make -f $(CURDIR)/submake/Makefile
        cd $(CURDIR)/submake && make
        gcc -o hello hello.o

hello.o : hello.c
        gcc -c hello.c -o hello.o

submake 子目录下的 Makefile 的内容为:
[Plain Text] 纯文本查看 复制代码
all:
        @echo $(MAKEFLAGS)

接下来我们在顶层目录下 make 一下:
[beyes@SLinux temp8]$ make
gcc -c hello.c -o hello.o
cd /home/beyes/Makefile/temp8/submake && make
make[1]: Entering directory `/home/beyes/Makefile/temp8/submake'
wRr
make[1]: Leaving directory `/home/beyes/Makefile/temp8/submake'
gcc -o hello hello.o
从输出中可以看到,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.groad.net/bbs/read.php?tid-3536.html
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-17 20:08 , Processed in 0.066085 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表