首页
登录 | 注册

make 的递归执行与 MAKEFLAGS 变量

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'

from: http://www.360doc.com/content/11/1025/10/1671317_158884673.shtml#

相关文章

  • ES6 新增了let命令,用来声明局部变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效,而且有暂时性死区的约束. var a = 99; // 全局变量a f(); // f是函数,虽然定义在调用的后面,但是函 ...
  • eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined.  需要特别注意的是对象声明语法"{}"并不能返回一个值,需要用括号括起来才 ...
  • 将Chrome调试器里的JavaScript变量保存成本地JSON文件
    推荐一个功能强大的文件搜索工具SearchMyFiles 介绍一个好用的免费流程图和UML绘制软件-Diagram Designer 介绍Windows任务管理器的替代者-Process Explorer 介绍一个强大的磁盘空间检测工具Sp ...
  • 表格 B-1. 特殊的shell变量 变量 含义 $0 脚本名字 $1 位置参数 #1 $2 - $9 位置参数 #2 - #9 ${10} 位置参数 #10 $# 位置参数的个数 "$*" 所有的位置参数(作为单个字符 ...
  • 原文地址:Linux内核对per-cpu变量的实现 作者:MagicBoy2010 在Linux中,per-cpu变量用在多处理器系统中,用来为系统中的每个cpu都生成一个变量的副本,以避开多处理器互斥中的加锁问题,另一个是cpu本地的变量 ...
  • 1. 以固定时间反复执行某个命令 Every 1.0s: cat hello.txt                                                                    Hello Worl ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.014 s.
京ICP备10005923号