1. 嵌套执行 make

在一个大的工程文件中,不同的文件按照功能被划分到不同的模块中,每个模块可能都会有自己的编译顺序和规则,如果在一个 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 的工作目录。

2. export 的使用

使用 make 嵌套执行的时候,变量是否传递也是我们需要注意的。如果需要变量的传递,那么可以这样来使用:

export <variable>

如果不需要那么可以这样来写:

unexport <variable>

<variable> 是变量的名字,不需要使用 $ 这个字符。如果所有的变量都需要传递,那么只需要使用 export 就可以,不需要添加变量的名字。

export VALUE1 := export.c    <-- 用了 export, 此变量能够传递到 ./other/Makefile 中
...
@cd ./other && make
...

export 语法格式如下:

export variable = value
export variable := value
export variable += value

Makefile 中还有两个变量不管是不是使用关键字 export 声明,它们总会传递到下层的 Makefile 中。这两个变量分别是 SHELLMAKEFLAGS,特别是 MAKEFLAGS 变量,包含了 make 的参数信息。

如果执行总控 Makefile 时,make 命令带有参数或者在上层的 Makefile 中定义了这个变量,那么 MAKEFLAGS 变量的值将会是 make 命令传递的参数,并且会传递到下层的 Makefile 中,这是一个系统级别的环境变量。

make 命令中有几个参数选项并不传递,它们是:-C-f-o-h-W。如果我们不想传递 MAKEFLAGS 变量的值,在 Makefile 中可以这样来写:

subsystem:cd subdir && $(MAKE) MAKEFLAGS=

3. 嵌套执行示例

目录结构如下:

wohu@ubuntu:~/cpp/func$ tree
.
├── demo.cpp
├── demo.h
├── Makefile
└── subdir└── Makefile1 directory, 4 files
wohu@ubuntu:~/cpp/func$

当前目录下的 Makefile 内容:

export GLOBAL_VAR = 123
SUBDIR = ./subdir all:echo "this is main Makefile"echo $(GLOBAL_VAR)cd $(SUBDIR) && $(MAKE)

subdir 目录下的 Makefile 内容:

all:echo "this is subdir Makefile"echo "display GLOBAL_VAR" $(GLOBAL_VAR)

在当前目录下执行 make 输出结果

wohu@ubuntu:~/cpp/func$ make
echo "this is main Makefile"
this is main Makefile
echo 123
123
cd ./subdir  && make
make[1]: Entering directory '/home/wohu/cpp/func/subdir'
echo "this is subdir Makefile"
this is subdir Makefile
echo "display GLOBAL_VAR" 123
display GLOBAL_VAR 123
make[1]: Leaving directory '/home/wohu/cpp/func/subdir'
wohu@ubuntu:~/cpp/func$

浅显易懂 Makefile 入门 (10)— 嵌套执行 make、export 的使用相关推荐

  1. 浅显易懂 Makefile 入门 (08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行

    1. shell 相关 1.1 默认 shell Makefile 所使用的命令是由 shell 命令行组成,他们是一条一条执行的. 多个命令之间要使用分号隔开,Makefile 中的任何命令都要以 ...

  2. 浅显易懂 Makefile 入门 (12)— Makefile 常见的错误信息

    1. 常见的错误信息 make 执行过程中所产生错误并不都是致命的,特别是在命令行之前存在 -.或者 make 使用 -k 选项执行时. make 执行过程的致命错误都带有前缀字符串 ***.错误信息 ...

  3. 浅显易懂 Makefile 入门 (09)— include 文件包含、MAKECMDGOALS

    1. include文件包含 当 make 读取到 include 关键字的时候,会暂停读取当前的 Makefile,而是去读 include 包含的文件,读取结束后再继读取当前的 Makefile ...

  4. 浅显易懂 Makefile 入门 (07)— 其它函数(foreach 、if、call、origin )

    1. foreach 函数 foreach 函数定义如下: $(foreach <var>,<list>,<text>) 函数的功能是:把参数 <list&g ...

  5. 浅显易懂 Makefile 入门 (06)— 文件名操作函数(dir、notdir、suffix、basename、addsuffix、addperfix、join、wildcard)

    编写 Makefile 的时候,很多情况下需要对文件名进行操作.例如获取文件的路径,去除文件的路径,取出文件前缀或后缀等等. 注意:下面的每个函数的参数字符串都会被当作或是一个系列的文件名来看待. 1 ...

  6. 浅显易懂 Makefile 入门 (03)— 目标文件搜索(VPATH 和 vpath 的区别和使用)、隐含规则

    1. 目标文件搜索(VPATH和vpath) 如果需要的文件是存在于不同的路径下(即源文件与 Makefile 文件不在同一个路径下),在编译的时候就用到了 Makefile 中为我们提供的目录搜索文 ...

  7. 浅显易懂 Makefile 入门 (02)— 普通变量和自动变量定义、使用($@、$^、$< 作用)、变量覆盖 override、变量的来源 origin

    1. 变量的定义 Makefile 文件中定义变量的基本语法如下: 变量的名称=值列表 变量的名称可以由大小写字母.阿拉伯数字和下划线构成.等号左右的空白符没有明确的要求,因为在执行 make 的时候 ...

  8. 浅显易懂 Makefile 入门 (01)— 什么是Makefile、为什么要用Makefile、Makefile规则、Makefile流程如何实现增量编译

    1. 什么是 Makefile Makefile 文件描述了 Linux 系统下 C/C++ 工程的编译规则,它用来自动化编译 C/C++ 项目.一旦写编写好 Makefile 文件,只需要一个 ma ...

  9. 浅显易懂 Makefile 入门 (05)— 字符串处理函数(patsubst、subst、strip、findstring、filter、filter-out、sort、word)

    1. 字符串函数格式 函数调用的格式如下: $(<function> <arguments>) 或者是 ${<function> <arguments> ...

最新文章

  1. 从AlexNet到DenseNet,再到SENet,一文看懂图像分类领域的突破性进展
  2. 强行分类提取特征自编码网络例4
  3. Boost CRC的测试程序
  4. LeetCode 287. 寻找重复数(BitMap)
  5. 小鹏汽车北京车展发布免费加电、电池租赁计划以及低空飞行汽车
  6. 谢希仁计算机网络第七版 以太网单播和多播MAC地址范围[纠错]
  7. python 计算流形上两点之间的测地距离
  8. pyspark连接MySQL数据库,执行SQL语句,返回数据查询结果
  9. 【BZOJ】3289: Mato的文件管理(莫队算法+树状数组)
  10. A - Silver Cow Party(最短路径+矩阵转换)
  11. 系统动力学仿真软件Vensim下载
  12. JAVA处理字符串压缩以及文件压缩
  13. 航拍地形图转换成地形图_无人机航测生成地形图技术流程(Pix4D+ArcGIS+CASS)...
  14. 思科交换机配置命令(详细命令总结归纳)
  15. 四道Java基础题 你能对几道?
  16. 喜报丨武汉无名创新科技有限公司荣获国家“高新技术企业”证书,将助力高校科研与竞赛无人机产业加速发展!
  17. 工图怎么进行三维标注
  18. 2021年中国教育行业发展现状及未来发展趋势分析:在校生人数达2.91亿人[图]
  19. 图像语义分割入门:FCN/U-Net网络解析
  20. 【答学员问】网站换ip后遇到的问题排查思路

热门文章

  1. Texlive安装与环境变量配置
  2. 2022-2028年中国企业核心路由交换机行业市场前瞻与投资分析报告
  3. 2022-2028年中国XPS挤塑板行业市场全景评估及产业前景规划报告
  4. 正视自己的所想所求,活出真实的自己
  5. 理解 Word2Vec 之 Skip-Gram 模型
  6. LeetCode简单题之有效的字母异位词
  7. NVIDIA GPU的神经网络自动调度
  8. 深度学习调参体验(二)
  9. 2021年大数据Hadoop(八):HDFS的Shell命令行使用
  10. Laravel 底层是如何处理 HTTP 请求的?