我读了这样的文字: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 $< $@
答案 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