Makefile 规则,用于将具有多个扩展名的文件复制到目标目录

问题描述 投票:0回答:2

我想让 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)

问题

  1. 这里是否可以字符串替换TARGET目录
  2. 从而使用 make newer 功能?

我试过了

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

但是

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

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

%.jpg:%.jpg

我能想到的最接近的是:

$(TARGET)%.jpg:%.jpg

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

makefile
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 又名 --
    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)

0
投票

所以你想将

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。

© www.soinside.com 2019 - 2024. All rights reserved.