makefile 不扩展动态先决条件

佩德罗

我想要一个 makefile,它将一些字符串作为某些文件的前缀 ( NAMES) 并从那里处理目标和先决条件文件名。例如,在下面的示例中,想法是将 2 a csv 文件(foo.csvbar.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.csvbar.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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有动态先决条件的动态 Makefile 目标

关于自动生成Makefile先决条件

规则之前的Makefile先决条件

makefile:先决条件$(变量)中的%模式

Makefile 先决条件中的变量分配

Makefile 仅识别更改的先决条件,而不识别新的先决条件

makefile:: *** 先决条件不能在配方中定义。停止

如何设置Makefile目标取决于模式先决条件?

Makefile:将PHONY目标声明为配方先决条件

makefile 目标比先决条件更新,但会重新完成

Makefile先决条件列表中的分号是什么?

Makefile,先决条件自动变量中的替代路径

具有非语音先决条件的Makefile .PHONY目标

Makefile:如果不存在则忽略先决条件

为什么先决条件的顺序在 makefile 中很重要?

如何在 Makefile 目标中重复相同的先决条件?

1:1配方的Makefile模式,其先决条件在目录和文件扩展名上均不同于目标

Makefile:如何为两个文件列表设置先决条件

makefile 通配符先决条件多次获取同一个文件

指定输入源(而不是中间体)作为 Makefile 中目标的先决条件

从URL列表下载文件列表作为makefile中的先决条件

Makefile的同一目标中是否可能有多个先决条件模式?

Makefile 找不到最后一个先决条件对象

如何编写具有多个目标/先决条件才能执行同一配方的GNU Makefile?

Makefile:如果 $^ 获得所有先决条件,可以使用什么来获得所有目标

CMake中是否提供了GNU Makefile中仅订购的先决条件,如果没有,替代选项是什么?

在此makefile中,为什么总是要重新构建目标“ bunzip2 / data2.tar”的先决条件?

先决条件

gnu使“叶子”先决条件