我有大量的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
目标最终会解决:
因此,例如,如果/project/Data/Product/ISIC/isic.xml
比src/XML/isic.xml
更新,/project/Data/Product/Commodity/htscodes.xml
比src/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
答案 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 $< $@