分享

make 的递归执行与 MAKEFLAGS 变量

 t涂鸦 2011-10-25
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 内容为:
  1. MAKEFLAGS += -rR
  2. hello : hello.o
  3. #make -f $(CURDIR)/submake/Makefile
  4.         cd $(CURDIR)/submake && make
  5.         gcc -o hello hello.o
  6. hello.o : hello.c
  7.         gcc -c hello.c -o hello.o

submake 子目录下的 Makefile 的内容为:
  1. all:
  2.         @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./bbs/read.php?tid-3536.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多