使用GNU make复制文件

时间:2017-05-16 22:06:34

标签: makefile gnu-make

我需要复制几个文件。做一个makefile:

FILES=foo.txt d1/bar.dat d2/baz.txt
TARGETDIR=/app

targets=$(addprefix $(TARGETDIR)/,$(FILES))

all: $(targets)

$(targets): $(FILES)
        cp $(subst $(TARGETDIR)/,,$@) $@

文件已正确复制,但如果我touch foo.txt,则会复制所有三个文件。

我知道"正确的方式"是定义三个规则,如:

$(TARGETDIR)/foo.txt: foo.txt
    cp $^ $@
$(TARGETDIR)/d1/bar.dat: d1/bar.dat
    cp $^ $@
$(TARGETDIR)/d2/baz.txt: d2/baz.txt
    cp $^ $@

但在这种情况下,我必须两次写文件名,一次用于这些规则,一次用于all规则。

有没有办法成倍增加'先决条件中每个名称的规则? 像

这样的东西
$(TARGETDIR)/%: $(FILES)
   cp $< $@

1 个答案:

答案 0 :(得分:0)

如果使用secondary expansion

,则可以使用文本操作功能操作目标名称
.SECONDEXPANSION:
$(targets): $$(patsubst $(TARGETDIR)/%, %, $$@)
    echo cp $< $@

这不是唯一的方法,但它可能是最简单的方法。