用于目录的GNU Makefile通配符

时间:2017-06-07 08:04:07

标签: makefile gnu-make

我有几个可能包含子目录的目录,如果该目录中的任何文件发生更改,我会将每个目录压缩到一个文件中。

例如,我有2个目录dir1 dir2,我想将它们压缩为comp_dir1.tar.gz和comp_dir2.tar.gz。

我写了以下代码:

comp_%.tar.gz : %/$(shell find % -name "*")
    tar -czvf $@ $<

但是我得到了错误:

find: ‘%’: No such file or directory

很明显,我不能在shell命令中使用“%”。

有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

在任何情况下,您需要的是要压缩的目录列表。使用它,您可以使用GNU Make功能Remaking Makefiles生成“依赖文件”,其中包括在这些目录中找到的所有文件。这是一个有效的例子:

DIRECTORIES:=dir1 dir2
ARCHIVES:=$(addsuffix .tar.gz,$(addprefix comp_,$(DIRECTORIES)))

all: $(ARCHIVES)

comp_%.tar.gz.d: %
    echo $(@:.d=) $(@): $(shell find $< -name "*") > $(@)

# include the dependency files, this will cause GNU make to attempt creating
# them using the above pattern rule.
-include $(addsuffix .d,$(ARCHIVES))

comp_%.tar.gz: %
    tar czvf $@ $<

.PHONY: all