Makefile Make-如何将两个不同的文件复制到不同的位置

Makefile Make-如何将两个不同的文件复制到不同的位置,makefile,gnu-make,Makefile,Gnu Make,我不熟悉makefile语法。我想复制2个文件到不同的位置 DST := c:/A/a.txt \ c:/B/b.txt \ SRC := c:/src/1.bin \ c:/src/2.bin \ all: $(DST) $(DST): $(SRC) cp -f $< $@ DST:=c:/A/A.txt\ c:/B/B.txt\ SRC:=c:/SRC/1.bin\ c:/src/2.bin\ 全部:$(DST) $(

我不熟悉makefile语法。我想复制2个文件到不同的位置

DST    := c:/A/a.txt \
          c:/B/b.txt \

SRC    := c:/src/1.bin \
          c:/src/2.bin \

all: $(DST)

$(DST): $(SRC)
    cp -f $< $@
DST:=c:/A/A.txt\
c:/B/B.txt\
SRC:=c:/SRC/1.bin\
c:/src/2.bin\
全部:$(DST)
$(DST):$(SRC)
cp-f$<$@

上面的代码不起作用,因为$<是第一个先决条件。使用$^也不正确。我怎样才能做到呢?谢谢。

考虑一下这扩展到:

c:/A/a.txt c:/B/b.txt : c:/src/1.bin c:/src/2.bin
    cp -f $< $@

当然,这有一根尖锐的棍子——如果您明确地向
$(DST)
添加任何依赖项,那么如果源文件和dest文件之间没有任何可用的关系,并且您更喜欢使用比另一个答案中建议的更标准/更不复杂的规则集,make将填充
$,您只需手工写出依赖项,如下所示:

DST    := c:/A/a.txt \
          c:/B/b.txt \

SRC    := c:/src/1.bin \
          c:/src/2.bin \

$(foreach IDX,$(shell seq 1 $(words $(DST))),\
    $(eval \
       $(word $(IDX),$(DST)) : $(word $(IDX),$(SRC))))

$(DST):
    cp -f $< $@
DST    := c:/A/a.txt \
          c:/B/b.txt \

all: $(DST)

$(DST) :
          cp -f $< $@

c:/A/a.txt : c:/src/1.bin
c:/B/b.txt : c:/src/2.bin
DST_/A/a.txt := c:/src/1.bin
DST_/B/b.txt := c:/src/2.bin
(makefile中不能有以
DST
开头的其他变量;如果不够好,请选择一些唯一的前缀)

那么makefile的其余部分将是:

DST := $(foreach V,$(filter DST_%,$(.VARIABLES)),c:$($V))

all: $(DST)

.SECONDEXPANSION:
$(DST) : c:% : $$(DST_$$*)
          cp -f $< $@
DST:=$(foreach V,$(filter DST%,$(.VARIABLES)),c:$($V))
全部:$(DST)
.第二次扩展:
$(DST):c:%:$$(DST_$$*)
cp-f$<$@

(很好的警告,我并没有实际测试,所以可能会有一些输入错误:)

简单的回答是,除非有某种方法通过文件名匹配源和目标,否则自动创建规则是不容易的:它们有一些共同的词干。如果源文件和目标文件都是完全任意的,并且除了它们在
SRC
DST
变量中的位置之外没有任何关系,那么就没有直接的方法来编写makefile。您或者需要使用Harcorehynry建议的非常奇特的技巧,或者直接手写规则。如果你不在Windows上,这会简单得多。驱动器号和make不太协调。