使用 $(MAKE) 进行递归调用会忽略我的 bash 脚本

问题描述 投票:0回答:1

我通过使用一个脚本定义了我自己的

make
包装器,该脚本在每次调用
time
之前包含对
make
的调用(更新路径,以便
bash
首先找到我的make,等等)。脚本看起来像:

#!/bin/bash
time /usr/bin/make -w "$@"
echo "Finished: make $@"

但是,当使用

make
Makefile
内调用
$(MAKE)
时,
make
正在调用
/usr/bin/make
。例如:

target:
    $(MAKE) -C subfolder

当我执行

make target
时,我的脚本正在被使用,但是,
/usr/bin/make
识别正在调用的确切二进制文件(本身),并使用该确切的二进制文件来扩展
$(MAKE)

如何使用脚本获取对

make
$(MAKE)
的所有调用?或者一般来说,如何强制对
make
进行所有调用,无论以何种方式调用(普通
make
$(MAKE)
),其前面都有一个
time
并包含选项
-w

注意无需修改任何现有 makefile 的文本。

makefile gnu-make
1个回答
0
投票

答案很简单:不要使用

$(MAKE)
,而是使用你自己的脚本。

如文档所述:

制作
调用 make 时使用的名称。在配方中使用此变量具有特殊含义。查看 MAKE 变量如何工作。

在“MAKE变量如何工作”中你可以看到

该变量的值是调用 make 的文件名。 ...如果您使用特殊版本的 make 来运行顶级 makefile,则将执行相同的特殊版本以进行递归调用。

使用自己的脚本进行子制作的缺点是,您将失去使用自动导出的变量和参数的能力,除非将它们导出到环境中或作为子制作的手动参数。但如果您不使用它们,您可以轻松执行以下操作:

target:
    cd subfolder && mymake 

在此处阅读有关

make
的递归使用的信息: https://www.gnu.org/software/make/manual/make.html#Recursion

© www.soinside.com 2019 - 2024. All rights reserved.