我想要一个 makefile,它将一些字符串作为某些文件的前缀 ( NAMES
) 并从那里处理目标和先决条件文件名。例如,在下面的示例中,想法是将 2 a csv 文件(foo.csv
和bar.csv
)转换为表格(尽管我只是回应目标和先决条件)。
NAMES = foo bar
PR = $(patsubst %,%.csv,$(NAMES))
TB = $(patsubst %,%.tsv,$(NAMES))
all: $(TB)
%.tsv: $(PR)
@echo $< $@
这打印:
foo.csv foo.tsv
foo.csv bar.tsv
因此,看起来 makefile 没有PR
像我希望bar.csv bar.tsv
在第二行看到的那样正确扩展先决条件。
但是,如果我打印$PR
和$TB
,两者似乎都设置正确:
$(info $$PR is [${PR}])
$(info $$TB is [${TB}])
# prints
$PR is [foo.csv bar.csv]
$TB is [foo.tsv bar.tsv]
知道如何让它正常工作吗?
请注意,我在工作目录中有foo.csv
和bar.csv
文件。
问题在于您使用内置变量的方式$<
。如果您手动扩展变量并重写生成文件,它将变成...
NAMES = foo bar
PR = $(patsubst %,%.csv,$(NAMES))
TB = $(patsubst %,%.tsv,$(NAMES))
all: foo.tsv bar.tsv
%.tsv: foo.csv bar.csv
@echo $< $@
但$<
指的是第一个先决条件,它始终foo.csv
与目标无关。
一种解决方案可能是使用作用域静态模式规则。所以像...
NAMES = foo bar
PR = $(patsubst %,%.csv,$(NAMES))
TB = $(patsubst %,%.tsv,$(NAMES))
all: $(TB)
# Tell make how to build a .tsv from a .csv but constrain the rule
# so that it only applies to .tsv files that are part of $(TB).
#
$(TB): %.tsv: %.csv
@echo 'building target [$@] with $$< = [$<]'
以上结果在...
building target [foo.tsv] with $< = [foo.csv]
building target [bar.tsv] with $< = [bar.csv]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句