对GNU make的理解 。基于手册 GNU Make 。
完整的makefile包括的东西:显示规则、隐式规则、变量的定义、指示符和注释。
这里主要说的是隐式规则,是根据目标文件的命名而自动推导出来的规则。make根据目标文件的名字,自动产生目标的依赖文件 并使用默认的命令来对目标进行更新。
还需要注意的是makefile中的第一个规则之后的以[TAB]字符开始的行,make会交给shell执行。
举例:
%: %.c
和下面和这条语句。
%: %.$(TARGET)
@
这两条语句主要是根据make的隐含规则来自动寻找匹配。“%”是模式匹配规则,后面详细说明。
第一个其实是一条“不执行”语句。
第二条语句中有个@符号,可以省略这里为了说明前面有一个tab。第二条语句是会根据make隐含规则自动寻找%:%.$(TARGET)的匹配。
这里插一句:makefile中使用“%”时需要用转义“\”加“%”,“*”也一样。如果使用$就需要“$$”来表示,换行要用在末尾加“\",末尾加\后不再输入字符了。
还有一个符号是管道符号”|“,意思是出现在管道符|左边的依赖文件如果有更新,目标会随之更新,管道符|右边的依赖文件有更新不会导致目标被重建。
再来说说,makefile伪目标。
伪目标不代表一个真正的文件名,在执行make时可以指定这个目标来执行其所在规则定义的命令。理解成标签吧。
.PHONY:clean
clean:
-rm -rf *.o
在这里有一个推荐的作法就是使用内嵌的隐含变量”RM“来代替"rm -f",$(RM).
接着说说Makefile的特殊目标。这些特殊目标有很多一般用得到的很少,了解了解。
.PHONY 的所有 依赖被作为伪目标。
.SUFFIXES 的所有依赖指出了一系列在后缀规则中需要检查的后缀名。
.DEFAULT 被用在重建那些没有具体规则的目标。
.PRECIOUS 所有依赖的文件在make过程中会被特殊处理:当命令在执行过程中被中断时make不会删除它们。
.INTERMEDIATE 的依赖文件在make时被作为中间过程对待。
.SECONDARY 的依赖文件被作为中间过程文件对待,但不会被自动删除。
.DELETE_ON_ERROR 如果规则的命令执行错误,将删除已经被修改的目标文件 。
.IGNORE 如果给目标”.IGONRE”指定依赖文件,则忽略创建这个文件所执行命令的错误。
.LOW_RESOLUTION_TIME 的依赖文件被make认为是低分辨率时间戳。
.LOW_RESOLUTION_TIME:dst
dst:src
cp -p src dst
.SILENT 出现在此依赖列表中的文件,mkae的创建这些文件时,不打印出重建此文件所执行的命令。
.EXPORT_ALL_VARIABLE 将之后所有的变量传递给子make进程。
.NOTPARALLEL 所有 命令按照串行方式执行
多目标。
多目标常用在以下两种情况:
仅需要一个描述依赖关系的规则,而不需要在规则中定义命令。kbd.o commmand.o files.o:command.h
对于多个具有类似重建命令的目标,重建这些目标的命令并不需要是绝对相同的,我们可以在命令行中使用make的自动环变量”$@“来引用具体一个目标。
bigoutput littleoutput:test.g
generate test.g -$(subst output,,$@) > $@
其等价于:
bigoutput:test.g
generate test.g -big > bigoutput
littleoutput:test.g
generate test.g -little > littleoutput
多规则目标。
举个例子:
object=foo.o bar.o
foo.o:defs.h
bar.o:defs.h test.h
$(objects):config.h
当.o文件 在其源文件所擢的头文件"config.h"发生变量之后能够自动的被 重建。这样做的好处是:我们可以在源文件中增加或者删除了包含的头文件以后不用修改已经存在的makefile规则,只需要增加或者删除某一个.o文件依赖的头文件。
未完待续。