Makefile的规则背后的故事
2023-10-22 23:31:57
重新发现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,从而使您的构建过程更加高效。