如何告诉Makefile哪个依赖项满足哪个目标

时间:2014-06-12 12:12:55

标签: makefile dependencies rules

我正在创建一个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 的一部分,我从未使用过)?

2 个答案:

答案 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来创建文件夹,特别是如果两个或多个目标依赖于文件夹。