0

我的目录中有a.csv, b.csv, ... docs/csv,我需要将每个文件转换为 json 文件。

我按照这个问题编写了这样的 Makefile。

SRCS = $(wildcard docs/csv/*.csv)
DESTS = $(patsubst docs/csv/%.csv, scripts/data/%.lua, $(SRCS))

all: $(DESTS)

$(DESTS): $(SRCS)
    echo $@
    echo $<

但是每次我运行make all时,echo $@都会按预期显示每个文件,但echo $<总是显示items.csv在我的 csv 文件夹中调用的单个文件。

4

3 回答 3

2

问题在于,在这条规则中:

$(DESTS): $(SRCS)
    ...

每个lua 文件都依赖于所有csv 文件,这不是我认为你想要的。并且由于$<扩展到第一个先决条件,因此每个目标都会得到相同的 ( items.csv)。

尝试这个:

all: $(DESTS)

scripts/data/%.lua: docs/csv/%.csv 
    echo $@
    echo $<
于 2013-09-30T17:26:34.147 回答
0

$<

是第一个依赖项的名称 。对所有依赖项使用 $^

$@

是当前目标的名称

于 2013-09-30T17:22:36.800 回答
0

关于自动变量的 GNU make 手册页非常有用。它是这样说的:

$@

规则目标的文件名。如果目标是存档成员,则 '<code>$@' 是存档文件的名称。在具有多个目标的模式规则中(请参阅模式规则简介),“<code>$@”是导致规则配方运行的目标的名称。

$<

第一个先决条件的名称。如果目标从隐式规则中获取其配方,这将是隐式规则添加的第一个先决条件(请参阅隐式规则)。

顺便说一句,您可能希望将您的 make 规则编写为模式规则

%.lua : %.csv
    <rules for making a lua from a csv>
于 2013-09-30T17:24:12.470 回答