定义规则

快速开始

规则描述了何时以及如何创建某些文件(规则的目标 )。如果目标文件的创建所需的任何文件(目标的先决条件 )比目标文件更新,它也可以用于更新目标文件。

规则遵循以下语法:(请注意,遵循规则的命令选项卡缩进 )

targets: prerequisites
        <commands>

其中目标先决条件是文件名或特殊保留名称和命令 (如果存在)由 shell 执行以构建/重建过时的目标

要执行规则,只需从 Makefile 所在的同一目录在终端中运行 make 命令即可。在不指定目标的情况下运行 make 将执行 Makefile 中定义的第一个规则。按照惯例, Makefile 中的第一个规则通常称为 alldefault ,通常将所有有效的构建目标列为先决条件。

make 仅在目标已过期时执行规则,这意味着它不存在或其修改时间早于其任何先决条件。如果先决条件列表为空,则只有在首次调用规则以构建目标时才会执行该规则。但是,当规则不创建文件且目标是虚拟变量时,将始终执行规则。

Version = GNU make

模式规则

模式规则用于指定多个目标并从目标名称构造先决条件名称。与普通规则相比,它们更通用,更强大,因为每个目标都有自己的先决条件。在模式规则中,目标和先决条件之间的关系是基于前缀(包括路径名和后缀或两者)构建的。

想象一下,我们想通过分别编译 C 脚本 foo.cbar.c 来构建目标 foo.obar.o。这可以通过使用以下普通规则来完成:

foo.o: foo.c
    cc -c $< -o $@

bar.o: bar.c
    cc -c $< -o $@

其中自动变量 $< 是第一个先决条件的名称,$@ 是目标的名称(可在此处找到自动变量的完整列表 )。

但是,由于目标共享相同的后缀,现在可以使用以下模式规则替换上述两个规则:

%.o: %.c
    cc -c $< -o $@

隐含规则

隐式规则告诉 make 如何使用习惯方法来构建某些类型的目标文件,这些目标文件经常被使用。make 使用目标文件名来确定要调用的隐式规则。

我们在上一节中看到的模式规则示例实际上并不需要在 Makefile 中声明,因为 make 具有 C 编译的隐式规则。因此,在以下规则中,在构建 foo 之前,将使用 C 编译的隐式规则构建先决条件 foo.obar.o

foo : foo.o bar.o
    cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS)

可以在此处找到隐式规则的目录及其使用的变量。