我正在创建一个Makefile来驱动从XML文档存档中生成EPUB3电子书。我无法理解如何告诉 make 另一个目标可以满足特定的文件名或目录依赖关系。
大致简化:
dir:
mkdir testing
files: testing
echo foobar >testing/blort
这当然会产生:
% make files
make: *** No rule to make target `testing', needed by `files'. Stop.
文件目标需要存在 testing 目录才能生效。如何通过执行目标 dir 告诉 make 可以创建目录?
(在这个简化的案例中,答案是使测试依赖关系成为目标 dir 而不是硬连线目录名。)
但实际上,这些配方很长并且做了大量的其他工作(例如从XML文档中提取元数据)并使用变量而不是硬编码的文件名。 有没有办法告诉 make 通过执行另一个目标可以满足一个特定的文件名或目录依赖?或者我需要将整个事情分解为原子(基本上每个目标一个shell命令??
实际上,有没有办法告诉 make 目标 x 创建文件 y ?模式规则是否可以这样( make 的一部分,我从未使用过)?
答案 0 :(得分:1)
有没有办法告诉make目标x创建文件y
您需要调整术语。 目标是创建的东西。 配方(shell命令或其他)创建目标。 先决条件是用于创建目标的文件或目标,如果先决条件比目标更新,则需要更新目标(使用配方)。 Make将首先将每个先决条件视为目标,递归,并尝试确保它是最新的。
然后你写下你的规则:
<target> : [<prerequisite> [<prerequisite> ...]]
<recipe>
因此,如果您想编写一个从先决条件 x 创建文件 y 的规则,您可以写下:
y : x
<recipe>
在上面的示例中,您依赖于先决条件testing
,但您没有构建目标testing
的规则。您有一个构建目标dir
的规则,这没有帮助。重写规则:
testing:
mkdir testing
(虽然这不是处理目录的好方法)。
答案 1 :(得分:1)
如果您对makefile中的文件夹有依赖关系,则应使用order-only-prerequisites而不是正常的先决条件。 对于仅订购先决条件,文件夹将仅创建一次,make将不关心时间戳。
示例:
all: testing/file1.txt testing/file2.txt
testing:
@mkdir -p testing
testing/file1.txt: | testing
<generate testing/file1.txt>
testing/file2.txt: | testing
<generate testing/file2.txt>
它认为你总是应该使用make-targets来创建文件夹,特别是如果两个或多个目标依赖于文件夹。