0

我想将文件从源目录复制到目标目录。我想避免复制未更改的文件。因此,我正在尝试利用 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)

问题

  1. 是否可以在此处字符串替换目标目录
  2. 从而使用 make newer 功能?

我试过了

 JPG = $(GRAPHICS:$(TARGET).jpg=.tmp)

但这失败了No rule to make target。是否只能比较同一目录中的源和对象?

可以制定一条规则,使源和对象是相同的扩展吗?

%.jpg:%.jpg

我能想到的最接近的是:

$(TARGET)%.jpg:%.jpg

但这永远不会运行。即使在清洁之后。

4

2 回答 2

0

这是解决方案。

这个“设置”保持不变。

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) )
  • 请注意, patsubst aka -- 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)
于 2013-01-05T19:53:28.887 回答
0

d1/d2/f.png所以你想让into的副本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。

于 2021-09-30T11:59:11.117 回答