返回

Makefile的规则背后的故事

见解分享

重新发现Make:规则背后的力量

过去,我曾认为Makefile只是一种将一组组的shell命令列出来的简便方法。过了一段时间,我才明白它们是有多么的强大、灵活以及功能齐全。这篇文章带您领略其中一些有关规则的特性。

规则的定义

规则rule是指示make应该如何并且何时构建一个被称作为目标target的文件的指令。目标可以是任何文件,包括可执行文件、库、文档或其他类型的文件。依赖是一组文件,当它们中的任何一个发生改变时,目标文件就需要被重新构建。

显式规则和隐式规则

显式规则explicit rule是明确指定目标文件和依赖文件的规则。例如,以下规则指定了一个名为“foo”的可执行文件,它依赖于“foo.c”和“foo.h”两个源文件:

foo: foo.c foo.h
    cc -c foo.c
    cc -o foo foo.o

隐式规则implicit rule是Make内置的一组规则,它可以自动推导出目标文件的依赖文件。例如,以下隐式规则指定了一个名为“foo.o”的目标文件,它依赖于“foo.c”源文件:

%.o: %.c
    cc -c 
%.o: %.c
    cc -c 
%.o: %.c
    cc -c $<
lt;
lt;

模式

模式pattern是用于匹配目标文件和依赖文件的通配符。例如,以下规则使用模式“*.c”来匹配所有以“.c”结尾的文件:

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

这与以下规则等价:

foo.o: foo.c
    cc -c foo.c
bar.o: bar.c
    cc -c bar.c

变量

变量variable是可以在Makefile中使用的符号。变量的值可以在Makefile中设置,也可以从命令行传递。例如,以下变量指定了编译器的位置:

CC = gcc

然后,可以在Makefile中使用这个变量来编译源文件:

%.o: %.c
    $(CC) -c 
%.o: %.c
    $(CC) -c $<
lt;

命令

命令command是Make用来构建目标文件的指令。命令可以是任何shell命令,也可以是Make内置的命令。例如,以下命令使用gcc编译器来编译源文件:

cc -c 
cc -c $<
lt;

规则的组合

规则可以组合起来以创建更复杂的构建过程。例如,以下规则使用“foo.o”和“bar.o”两个目标文件来构建可执行文件“foo”:

foo: foo.o bar.o
    cc -o foo foo.o bar.o

总结

Make的规则是一种强大的工具,可以用来构建各种各样的文件。通过理解规则的概念,您可以创建灵活且可维护的Makefile,从而使您的构建过程更加高效。