Makefile规则从多个文件夹中复制源

时间:2016-05-04 14:51:54

标签: makefile

我有大量的Makefile,可以在整个目录集合中生成XML文件。我想编写一个“客户端”Makefile来挑选一些最终产品,并只复制那些已经修改过的产品。我可以很容易地为每个文件制定规则,但是我没有看到如何使用模式规则,因为每个源文件的文件夹都不同。我宁愿只需要将源文件弹出到列表中,让其他一切工作正常。类似的东西:

SOURCE_DIR = somedir
TARGET_DIR = otherdir
SOURCES = \
        $(SOURCE_DIR)/dir1/file1.xml \
        $(SOURCE_DIR)/dir2/file2.xml \
        $(SOURCE_DIR)/dir3/file3.xml \
        $(SOURCE_DIR)/dir4/file4.xml
TARGETS = $(patsubst %,$(TARGET_DIR)/%,$(addsuffix xml,$(basename $(SOURCES))))

all: $(TARGETS)

$(TARGET_DIR)/%.xml: $(???)/%.xml:
        cp $< $@

我无法弄清楚要把什么放进$(???)。

修改:根据评论添加了示例

以下是我想到的一个例子:

SOURCE_DIR = /project/Data
TARGET_DIR = src/XML
SOURCES = \
        $(SOURCE_DIR)/Airports/airports.xml \
        $(SOURCE_DIR)/Product/ISIC/isic.xml \
        $(SOURCE_DIR)/PortSources/ports.xml \
        $(SOURCE_DIR)/Commodity/htscodes.xml

目标最终会解决:

  • 的src / XML / airports.xml
  • 的src / XML / isic.xml
  • 的src / XML / ports.xml
  • 的src / XML / htscodes.xml

因此,例如,如果/project/Data/Product/ISIC/isic.xmlsrc/XML/isic.xml更新,/project/Data/Product/Commodity/htscodes.xmlsrc/XML/htscodes.xml更新,那么make的输出应为:

cp /project/Data/Product/ISIC/isic.xml src/XML/isic.xml
cp /project/Data/Commodity/htscodes.xml src/XML/htscodes.xml

1 个答案:

答案 0 :(得分:0)

好的,现在我看到你的例子,你更清楚你想要什么:你创建TARGETS的方式不适合你想做的事情。正如我在上面的评论中所说,你需要notdir

您可以使用VPATH执行您想要的操作,如下所示:

SOURCE_DIR = /project/Data
TARGET_DIR = src/XML
SOURCES = \
    $(SOURCE_DIR)/Airports/airports.xml \
    $(SOURCE_DIR)/Product/ISIC/isic.xml \
    $(SOURCE_DIR)/PortSources/ports.xml \
    $(SOURCE_DIR)/Commodity/htscodes.xml

vpath %.xml $(sort $(dir $(SOURCES)))

TARGETS = $(addprefix $(TARGET_DIR)/,$(notdir $(SOURCES)))

all: $(TARGETS)
.PHONY: all

$(TARGET_DIR)/%.xml : %.xml
        cp $< $@