首页 > 解决方案 > 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 $< $@

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

标签: makefilegnu-make

解决方案


如果源文件和目标文件之间没有任何可用的关系,并且您更喜欢使用比其他答案中建议的更标准/不那么棘手的规则集,那么您只需手动写出依赖关系,像这样的东西:

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 值(一次在变量中,一次作为目标),但您只需要编写一次规则。

还有另一种可能性,这很棘手,但不依赖于外部 shell 程序,如seq. 它将要求您通过变量定义关系,并且要求所有目标文件位于同一驱动器上。它看起来像这样:

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 $< $@

(公平的警告,我实际上并没有对此进行测试,所以可能会有一些错别字:))


推荐阅读