使用Makefile在目录之间仅复制更改的文件

时间:2018-07-17 13:45:36

标签: makefile

我读了这样的文字:Makefile: Copying files with a rule,但做不到。
为简单起见,假设我有两个目录dir1和dir2。在dir1下,我有三个文件:rabbit.c,tiger.c和bus.c。 我这样制作了Makefile:

dir2/rabbit.c:dir1/rabbit.c
dir2/tiger.c:dir1/tiger.c
dir2/bike.c:dir1/bike.c

dir2/%:
    cp -f $< $@

我在三个单独的行中指定了先决条件,并为三个目标指定了统一的配方。我希望当我触摸dir1下的任何文件时,make会将文件复制到dir2。但这仅发生在rabbit.c。怎么了?


ADD(选择答案后): 在意识到Takkat的回答有问题之后,我对其进行了修复,然后对其进行了进一步的修改,我认为这是此情况下最正确的最简单的Makefile。

.PHONY:all
LIST:=rabbit.c tiger.c bike.c
DSTFILES:=$(addprefix dir2/, $(LIST))
all: $(DSTFILES)

dir2/%:dir1/%
    cp -f $< $@

1 个答案:

答案 0 :(得分:1)

Make在makefile中选择一个默认目标,除非您在命令行上指定不同,否则它将仅构建该目标(以及构建该目标所需的所有先决条件)。

默认情况下,makefile中的默认目标是列出的第一个显式目标。

所以在您的makefile中,第一个规则是:

dir2/rabbit.c:dir1/rabbit.c

因此第一个明确的目标是dir2/rabbit.c,因此就可以完成构建。

如果要默认构建多个目标,则需要第一个目标列出所有“真实”目标作为先决条件;将这一行放在您的makefile中:

all: dir2/rabbit.c dir2/tiger.c dir2/bike.c

,它将起作用。通常,将这样与磁盘上的实际文件无关的目标声明为phony是好习惯:

.PHONY: all