Makefile动态依赖未展开问题:自定义前缀批量生成目标与依赖
解决Makefile中TSV目标依赖对应单个CSV文件的问题
嘿,我来帮你搞定这个Makefile的问题!你遇到的核心问题是模式规则的依赖写错了——你现在让每个.tsv目标都依赖所有的.csv文件,而不是对应的单个同名文件。
问题根源分析
你原代码里的规则:
%.tsv: $(PR)
这里$(PR)会展开成foo.csv bar.csv,所以每个.tsv目标的依赖都是这两个文件。而$<代表规则的第一个依赖文件,所以不管是foo.tsv还是bar.tsv,都会取第一个依赖foo.csv来输出,这就导致了你看到的错误结果。
修正后的Makefile
只需要把模式规则的依赖改成对应的单个.csv文件即可,利用Make的模式匹配特性,让%.tsv自动关联%.csv:
NAMES = foo bar PR = $(patsubst %,%.csv,$(NAMES)) TB = $(patsubst %,%.tsv,$(NAMES)) all: $(TB) # 让每个.tsv目标只依赖同名的.csv文件 %.tsv: %.csv @echo $< $@
测试输出
运行这个修正后的Makefile,会得到你预期的结果:
foo.csv foo.tsv bar.csv bar.tsv
额外简化说明
如果你不需要PR这个变量做其他事情,其实可以直接删掉它,因为模式规则已经能自动关联对应的依赖文件了,简化后的代码也能正常工作:
NAMES = foo bar TB = $(patsubst %,%.tsv,$(NAMES)) all: $(TB) %.tsv: %.csv @echo $< $@
内容的提问来源于stack exchange,提问作者PedroA
相关产品推荐
相关产品推荐

