【发布时间】:2019-06-04 20:20:21
【问题描述】:
我正在开发一个在输出目录中创建多个文件的生成文件。为了创建这些文件,输出目录需要已经存在,否则文件创建失败。
这是一个演示我遇到的问题的最小示例:
.PHONY: default
default: dir/file.dat dir/other.dat
# In order to create these files, their parent directory must exist
dir/%.dat: | dir/
touch "$@"
# To create a directory, use mkdir -p
%/:
mkdir -p "$@"
当我运行 makefile 时,我收到一个错误,即不存在生成 dir 的规则。调试运行显示 make 正在从 "dir/" 中删除尾随 "/":
root@69654136a2ae:~# make -rdf dirs.mk
GNU Make 3.81
[snipped]
Considering target file `default'.
File `default' does not exist.
Considering target file `dir/file.dat'.
File `dir/file.dat' does not exist.
Considering target file `dir'.
File `dir' does not exist.
Looking for an implicit rule for `dir'.
No implicit rule found for `dir'.
Finished prerequisites of target file `dir'.
Must remake target `dir'.
make: *** No rule to make target `dir', needed by `dir/file.dat'. Stop.
顺便说一句,在命令行上请求一个目录目标就可以了:
root@69654136a2ae:~# make -rdf dirs.mk /some/dir/
GNU Make 3.81
[snipped]
Updating goal targets....
Considering target file `/some/dir/'.
File `/some/dir/' does not exist.
Looking for an implicit rule for `/some/dir/'.
Trying pattern rule with stem `/some/dir'.
Found an implicit rule for `/some/dir/'.
Finished prerequisites of target file `/some/dir/'.
Must remake target `/some/dir/'.
mkdir -p "/some/dir/"
我怎样才能做我想做的事?
理想情况下,我正在寻找一个通用的解决方案。上面的例子只有一个子目录,但实际项目会有很多子目录,所以我想避免到处复制粘贴解决方案。
【问题讨论】:
-
我无法重现该问题。与 Cygwin 一起为我工作。虽然最后我得到了
rm dir/make: unlink: dir/: Operation not permitted,这是一个不相关的问题。 -
我无法重现该问题。您使用的是哪个版本的 Make?
-
@JosephQuinsey,我使用 GNU Make 3.81 重现了这个问题
-
@leiyc:使用 make 3.81,我得到一个不同的错误:
make: *** No rule to make target 'dir/file.dat', needed by 'default'. Stop.mkdir永远不会被调用。 -
@JosephQuinsey,当您将
-rd选项与make一起使用时,您将看到Trying rule prerequisitedir'。`/不见了。