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

时间:2013-01-04 19:10:04

标签: makefile

我想将源文件中的文件复制到目标目录中。我想避免复制未更改的文件。因此,我尝试使用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功能?
  3. 我试过

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

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

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

    %.jpg:%.jpg
    

    我能提出的最接近的是:

    $(TARGET)%.jpg:%.jpg
    

    但从未运行过。即使在干净之后。

1 个答案:

答案 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) )
  • 请注意,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)
相关问题