Makefile中关于make的嵌套执行( $(MAKE) -C subdir )

以下内容源于C语言中文网的学习与整理,如有侵权请告知删除。

一、“嵌套执行make”的含义

在一个大的工程中,不同文件按照功能被划分到不同的模块,每个模块可能有不同的编译顺序和规则。如果在一个 Makefile 文件中描述所有模块的编译规则,就会显得很杂乱,执行不方便。

如果在不同的模块中分别对它们的规则进行描述,即每一个模块都编写一个Makefile文件,这样既方便管理,也可以迅速发现模块中的问题。我们在总Makefile中控制其他模块中的 Makefile,就可以实现总体的控制。

这就是 make 的嵌套执行。

二、举例说明

假如在cur目录下有一个subdir文件夹和一个Makefile文件,subdir文件夹中也有一个Makefile文件,它用来描述subdir这个子目录文件的编译规则。

则cur目录下的Makefile文件可以这样写:

subsystem:
    cd subdir && $(MAKE)

在cur目录下执行 make 命令,当命令执行到上述的规则时,程序会进入到subdir这个子目录中执行 make。这就是嵌套执行 make,我们把最外层的 Makefile 称为是总控 Makefile。

上述的规则也可以换成另外一种写法:

subsystem:
    $(MAKE) -C subdir

make命令的-C选项,指定了到哪个目录下执行make命令(见博客make命令的参数选项)。 

在make的嵌套执行中,变量CURDIR代表着make的工作目录。当使用选项 -C指定make的工作目录时,就会进入所指定的目录,此时变量CURDIR就会被重新赋值为-C所指定的目录。

如果Makefile中没有对此变量进行显式的赋值操作,那么它就表示make的工作目录,如果我们给这个变量赋一个新的值(比如abcd),则重新赋值后的这个变量将不再代表 make 的工作目录。

三、export的使用

1、export的使用方法

export这个命令,可以将主Makefile中的变量传递给子模块中的Makefile。

如果需要传递变量,那么可以这样:

export variable #注意variable是变量的名字,不需要使用 "$" 这个字符

如果不需要传递变量,可以这样来写:

unexport variable #注意variable是变量的名字,不需要使用 "$" 这个字符

如果所有的变量都需要传递,那么只需要使用 "export" 就可以,不需要添加变量的名字。

export

2、SHELL变量、MAKEFLAGS变量

Makefile 中有两个变量,即 SHELL 和 MAKEFLAGS,不管是否使用关键字 "export" 声明,它们总会传递到下层的 Makefile 中。

MAKEFLAGS变量,包含着make的参数信息。在执行总控Makefile时,如果make命令带有参数,那么MAKEFLAGS这个变量的值,就是make命令所带的参数。MAKEFLAGS这个变量会传给下一层的Makefile,它是一个系统级别的环境变量。

但make命令中有几个参数选项并不传递,它们是"-C"、"-f"、"-o"、"-h" 和 "-W"。

另外,如果我们不想传递 MAKEFLAGS 变量的值,在总控Makefile 中可以这样来写:

subsystem:
    cd subdir && $(MAKE) MAKEFLAGS=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天糊土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值