You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让递归调用的$(MAKE)使用自定义make包装bash脚本

解决Make递归调用时跳过包装脚本的问题

问题根源

当Makefile中使用$(MAKE)进行递归调用时,GNU Make会自动将$(MAKE)变量设置为当前运行的make程序的绝对路径(即/usr/bin/make),直接绕过了你通过PATH优先级设置的包装脚本,导致递归调用无法触发time和-w参数。

解决方案:通过环境变量覆盖$(MAKE)

修改你的包装脚本,在调用真实make前,将MAKE环境变量设置为当前脚本的绝对路径。这样make在处理$(MAKE)时会优先使用这个环境变量的值,而非自身的绝对路径,从而让递归调用也走包装脚本。

修改后的包装脚本(兼容Linux发行版)

#!/bin/bash
# 获取当前脚本的绝对路径
export MAKE="$(readlink -f "$0")"
# 调用真实make并带上-w参数,传递所有入参
time /usr/bin/make -w "$@"
echo "Finished: make $@"

如果是在macOS环境下,readlink -f不可用,可以用以下方式获取绝对路径:

#!/bin/bash
# 兼容macOS的脚本绝对路径获取
script_dir=$(cd "$(dirname "$0")" && pwd)
script_path="${script_dir}/$(basename "$0")"
export MAKE="$script_path"
time /usr/bin/make -w "$@"
echo "Finished: make $@"

原理说明

  • 第一次运行包装脚本时,脚本会将MAKE环境变量设置为自身的绝对路径,并传递给/usr/bin/make
  • 当make处理Makefile中的$(MAKE)时,会优先读取环境变量里的MAKE值,也就是你的包装脚本路径
  • 递归调用时,$(MAKE)会执行包装脚本,而非直接调用/usr/bin/make,从而自动带上time和-w参数

内容的提问来源于stack exchange,提问作者ABu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 08:22:15