我想要依赖所有文件夹的内容。调用规则时会创建我的文件夹。
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
,因此该目录尚不存在。
有可能解决这个问题吗?
谢谢。
答案 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