文件夹的内容为makefile规则依赖项

时间:2017-12-14 09:35:10

标签: makefile gnu-make

我想要依赖所有文件夹的内容。调用规则时会创建我的文件夹。

create-content:
 mkdir -p sample_dir/subdir1
 touch sample_dir/file1
 touch sample_dir/subdir1/file2

list-content: create-content $(shell find sample_dir)
 echo $^

我想要这个输出:

 make list-content
 create-content sample_dir sample_dir/file1 sample_dir/subdir1 sample_dir/subdir1/file2

但我有:

make list-content
create-content

问题是shell函数是在make上调用的,而不是在规则运行时调用的。 因此在shell之前调用create-content,因此该目录尚不存在。 有可能解决这个问题吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

答案是否定的......是的。

不,你不能因为make在运行第一个配方之前构建了它的所有依赖图。因此,如果配方创建了依赖关系图的新节点,那么要注意到为时已晚。

但是有一个简单的解决方法:告诉make调用make(递归make)。尽管许多人说,递归制作并不总是有害的。它有时甚至是特定问题的唯一解决方案。这是你的情况。并且通过一些make magic(条件)你可以用两种不同的行为来隐藏它,具体取决于sample_dir的存在:

create-content:
    @mkdir -p sample_dir/subdir1 && \
    touch sample_dir/file1 && \
    touch sample_dir/subdir1/file2

ifeq ($(wildcard sample_dir),)
list-content: create-content
    @$(MAKE) --no-print-directory $@
else
list-content: create-content $(shell find sample_dir)
    @echo $^
endif

现在,list-content的先决条件已经完成。演示:

$ rm -rf sample_dir
$ make list-content
create-content sample_dir sample_dir/file1 sample_dir/subdir1 sample_dir/subdir1/file2
$ make list-content
create-content sample_dir sample_dir/file1 sample_dir/subdir1 sample_dir/subdir1/file2