如何让递归调用的$(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)
如果是在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
相关产品推荐
相关产品推荐

