Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 使用GNU make复制文件_Makefile_Gnu Make - Fatal编程技术网

Makefile 使用GNU make复制文件

Makefile 使用GNU make复制文件,makefile,gnu-make,Makefile,Gnu Make,我需要复制几个文件。执行生成文件: FILES=foo.txt d1/bar.dat d2/baz.txt TARGETDIR=/app targets=$(addprefix $(TARGETDIR)/,$(FILES)) all: $(targets) $(targets): $(FILES) cp $(subst $(TARGETDIR)/,,$@) $@ 文件复制正确,但如果我触摸foo.txt,所有三个文件都会被复制 我知道“正确的方法”是定义三条规则,如: $

我需要复制几个文件。执行生成文件:

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

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

all: $(targets)

$(targets): $(FILES)
        cp $(subst $(TARGETDIR)/,,$@) $@
文件复制正确,但如果我触摸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
rule

是否有一种方法可以“乘以”前提条件中每个名称的规则? 差不多

$(TARGETDIR)/%: $(FILES)
   cp $< $@
$(TARGETDIR)/%:$(文件)
cp$<$@

您可以使用文本操纵功能操纵目标名称,如果您使用:

。第二次扩展:
$(目标):$$(patsubst$(TARGETDIR)/%,%,$$@)
echo cp$<$@
这不是唯一的方法,但可能是最简单的方法

.SECONDEXPANSION:
$(targets): $$(patsubst $(TARGETDIR)/%, %, $$@)
    echo cp $< $@