我想让 make 将文件从源目录复制到目标目录。我想避免复制未更改的文件。因此,我正在尝试使用 make 函数来检查带有
%.:%.
规则的较新文件。
现在,在这种情况下,源和目标 EXTENSION 是相同的。其他地方有目标文件,但不是图形资产。
我用
make
复制图片。
TARGET := target
SOURCE := source
GRAPHICS := $(foreach dir,$(SOURCE), $(wildcard $(dir)/*.jpg ) $(wildcard $(dir)/**/*.jpg ) $(wildcard $(dir)/*.png ) $(wildcard $(dir)/**/*.png ) $(wildcard $(dir)/*.gif ) $(wildcard $(dir)/**/*.gif ) )
JPG = $(GRAPHICS:.jpg=.tmp)
PNG = $(GRAPHICS:.png=.tmp)
GIF = $(GRAPHICS:.gif=.tmp)
然后使用以下规则将文件复制到目标目录中:
%.tmp:%.jpg
find $< | cpio -p -d -v $(TARGET)
我试过了
JPG = $(GRAPHICS:$(TARGET).jpg=.tmp)
但是
No rule to make target
失败了。是否只能在同一目录下比较源和对象?
是否可以制定一条规则,使源和对象具有相同的扩展名?
%.jpg:%.jpg
我能想到的最接近的是:
$(TARGET)%.jpg:%.jpg
但这永远不会运行。即使在清洁之后。
这里是解决方案。
此“设置”保持不变。
TARGET := target
SOURCE := source GRAPHICS := $(foreach dir,$(SOURCE), $(wildcard $(dir)/*.jpg )
$(wildcard $(dir)/**/*.jpg ) $(wildcard $(dir)/*.png ) $(wildcard $(dir)/**/*.png )
$(wildcard $(dir)/*.gif ) $(wildcard $(dir)/**/*.gif ) )
现在为 $GRAPHICS 字符串中的所有(空格分隔)值添加前缀
TARGET_GRAPHICS := $(addprefix $(TARGET)/, $(GRAPHICS) )
TARGET_GRAPHICS := $(patsubst %, $(TARGET)/%, $(GRAPHICS) )
-- 仅适用于第一个条目。也许我做错了。为每种文件类型提供模式匹配。在这里为所欲为。在我的例子中,将输入复制到目标目录中。 cpio 将创建所需的目录。 cp -p 也可以根据需要工作。
$(TARGET)/%.jpg : %.jpg
@echo "--- .jpg copying " $< " to " $@ " into dir " $(<D)
@find $< | cpio -p -d -v $(TARGET)
$(TARGET)/%.png : %.png
@echo "--- .png copying " $< " to " $@
@find $< | cpio -p -d -v $(TARGET)
$(TARGET)/%.gif : %.gif
@echo "--- .gif Copying " $< " to " $@
@find $< | cpio -p -d -v $(TARGET)
所以你想将
d1/d2/f.png
的副本复制到 out/d1/d2/f.png
中以利用 make 的依赖性检查?
out/d1/d2/f.png: d1/d2/f.png
out/d1/d2/f.png:
cp $< $@
添加一个jpg文件
d3/g.jpg
说,
out/d3/g.jpg: d3/g.jpg
out/d1/d2/f.png: d1/d2/f.png
out/d1/d2/f.png out/d3/g.jpg:
cp $< $@
我们可以用静态模式规则更清楚地表达这一点。
out/d3/g.jpg out/d1/d2/f.png: out/% %
cp $< $@
不错。所以添加你的
${GRAPHICS}
并充实一些
outdir := out/
targets := $(addprefix ${outdir},${GRAPHICS})
.PHONY: all
all: ${targets} ; : $@ Success
${targets}: ${outdir}%: %
echo $< | cpio -d -p ${outdir}
并行安全,所以
make -j9
会很好地锻炼你的8个CPU。