Makefile中findstring在ifeq判断中不生效的问题咨询
Makefile中findstring配合ifeq判断失效的原因及解决办法
问题根源
核心原因是Makefile的变量展开时机差异:
$<(包括衍生的$<F,用于获取当前依赖的文件名部分)属于自动化变量,这类变量只有在规则的命令执行阶段才会被替换为实际的依赖文件名。- 而
ifeq是Makefile的条件判断指令,它在Makefile的解析阶段就会被处理——这时候自动化变量还未被赋值,$(basename $<F)的结果为空或非预期值,自然无法和2025匹配,所以ifeq块内的echo命令根本不会执行。
你单独执行@echo $(findstring 2025, $(basename $<F))能生效,是因为这条命令属于规则的命令部分,执行时自动化变量已经被正确替换。
解决办法
把判断逻辑移到命令部分,用Shell的条件判断实现:
your_target: your_dependency @if echo "$(basename $<F)" | grep -q "2025"; then \ echo "2025"; \ fi
如果是批量处理文件,也可以用Make的filter函数在规则层面筛选目标:
# 先筛选出文件名包含2025的依赖文件(替换成你的实际文件类型) TARGETS := $(filter %2025%, $(wildcard *.txt)) $(TARGETS): %: @echo "2025"
内容的提问来源于stack exchange,提问作者Jeremy L.
相关产品推荐
相关产品推荐

