GNU Make中如何获取当前Makefile的绝对路径(含被包含场景)
获取GNU Makefile所在的绝对路径目录
要获取当前Makefile(无论是作为主文件直接执行,还是被其他Makefile包含)的所在绝对路径目录,可以借助GNU Make的内置函数和变量组合实现,具体方案如下:
核心实现代码
在目标Makefile中添加以下定义:
# 定义变量存储当前Makefile的绝对路径目录 THIS_MAKEFILE_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
各部分解释
$(MAKEFILE_LIST):GNU Make的内置变量,是按处理顺序排列的所有已加载Makefile文件名列表。每当include一个新的Makefile时,该文件名将被追加到列表末尾。$(lastword $(MAKEFILE_LIST)):提取列表的最后一个元素,也就是当前正在处理的Makefile(主文件或被包含文件)的文件名(可能是相对路径或绝对路径)。$(abspath ...):将输入路径转换为绝对路径,确保无论make命令的调用目录、Makefile的引用方式如何,最终得到的都是完整的绝对路径。$(dir ...):从完整文件路径中提取目录部分,最终得到该Makefile所在的绝对路径目录。
适用场景验证
- 直接执行主Makefile:比如在任意目录执行
make -f /path/Makefile,THIS_MAKEFILE_DIR的值会是/path/。 - 被其他Makefile包含:假设另一个Makefile通过
include /path/Makefile引入该文件,在被包含的/path/Makefile中,THIS_MAKEFILE_DIR依然会正确返回/path/。
这个方案不受CURDIR(make命令调用时的当前工作目录)影响,完全依赖Makefile自身的加载信息,能覆盖所有常见使用场景。
内容的提问来源于stack exchange,提问作者ABu
相关产品推荐
相关产品推荐

