我想将源文件中的文件复制到目标目录中。我想避免复制未更改的文件。因此,我尝试使用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
但从未运行过。即使在干净之后。
答案 0 :(得分: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字符串
中的ALL(空格分隔)值添加前缀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)