GNU Make 4.4在Windows下include绝对路径自动加./报错求解决
Windows下GNU Make 4.4包含绝对路径Makefile的问题解决
问题描述
运行环境为Windows 10 + GNU Make 4.4,在Makefile中include一个绝对路径的生成式Makefile时,出现如下错误:
makefile:6: ./D:/Users/xxxxxxxx/Workspace/test/make/makefile-deps.mk: Invalid argument make: *** No rule to make target './D:/Users/xxxxxxxx/Workspace/test/make/makefile-deps.mk'. Stop.
可复现的Makefile代码:
OUTPUT_DIR := $(abspath .) DEPS_FILE := $(OUTPUT_DIR)/makefile-deps.mk include $(DEPS_FILE) CSRCS := a.c b.c c.c d.c $(DEPS_FILE): $(CSRCS) $(OUTPUT_DIR) @echo MAKEDEPS @$(MAKEDEPS) --output-file $@ $(CSRCS) show: @echo DEPS_FILE=$(DEPS_FILE)
注释include行后执行make show,输出路径正常:
─▶ make show DEPS_FILE=D:/Users/xxxxxxxx/Workspace/test/make/makefile-deps.mk
问题根源是GNU Make在Windows下会误将D:/xxx格式的正斜杠绝对路径识别为相对路径,自动在路径前添加./,导致无效路径。
解决办法
方法一:转换为Windows原生反斜杠路径
使用$(subst)函数将路径中的正斜杠替换为反斜杠,让Make正确识别为绝对路径:
OUTPUT_DIR := $(abspath .) DEPS_FILE := $(subst /,\,$(OUTPUT_DIR)/makefile-deps.mk) include $(DEPS_FILE) CSRCS := a.c b.c c.c d.c $(DEPS_FILE): $(CSRCS) $(OUTPUT_DIR) @echo MAKEDEPS @$(MAKEDEPS) --output-file $@ $(CSRCS) show: @echo DEPS_FILE=$(DEPS_FILE)
方法二:使用UNC格式路径
将带驱动器号的路径转换为UNC格式(//驱动器号/路径),避免Make误判为相对路径:
OUTPUT_DIR := $(abspath .) # 通用处理:将X:/格式转换为//X/ DEPS_FILE := $(patsubst %:/,//%/,$(OUTPUT_DIR)/makefile-deps.mk) include $(DEPS_FILE) CSRCS := a.c b.c c.c d.c $(DEPS_FILE): $(CSRCS) $(OUTPUT_DIR) @echo MAKEDEPS @$(MAKEDEPS) --output-file $@ $(CSRCS) show: @echo DEPS_FILE=$(DEPS_FILE)
方法三:使用-include规避路径错误(仅临时方案)
如果允许依赖文件首次执行时不存在,可以用-include代替include,忽略文件不存在的错误,让Make优先执行生成依赖文件的规则:
OUTPUT_DIR := $(abspath .) DEPS_FILE := $(OUTPUT_DIR)/makefile-deps.mk # 使用-include忽略文件不存在的错误 -include $(DEPS_FILE) CSRCS := a.c b.c c.c d.c $(DEPS_FILE): $(CSRCS) $(OUTPUT_DIR) @echo MAKEDEPS @$(MAKEDEPS) --output-file $@ $(CSRCS) show: @echo DEPS_FILE=$(DEPS_FILE)
此方法首次执行可能会出现路径警告,但依赖文件生成后即可正常工作。
内容的提问来源于stack exchange,提问作者Tim-Schaeffer_Crown
相关产品推荐
相关产品推荐

