makefile规则整理

实际开发中,makefile改的多,写的少。

为了后面不要在编译链接这种地方花费太多的时间,在这里系统性的整理其规则:

基本格式
TARGET : PREREQUISITES
command1
command2
... TARGET:1个目标(.o,lable,可执行文件等等) PREREQUISITES: 一个或者多个,依赖的文件 command:
任意的shell命令;
当依赖的文件中,只要有文件修改日期比TARGET的修改日期新,或者TARGET不存 在,就会触发下面的command执行;
命令需要以TAB键开头,默认的是/bin/sh;
如果下一个命令需要建立在上一个执行,那么需要写到同一行,用分号分隔开;
命令失败,make会退出规则执行,命令前加一个'-'可以忽略出错,继续执行;
makefile的查找顺序

默认情况下,当前目录下依次查找:“GNUmakefile”、“makefile”、“Makefile”
makefile中的“include”可以将其余位置的makefile文件内容展开到当前文件;
makefile的执行顺序

第一个目标是终极目标,终极目标有且仅有一个;
不跟lable的make命令执行,会找到第一个目标开始生成,一层一层往下找依赖关系生成目标,直到第一个TARGET生成后结束;
其中的command命令执行失败,不会影响make的继续运行;
但是依赖文件的生成失败,会导致makefile报错退出;
用.PHONY可以声明一些labe,控制make的执行顺序;
makefile特殊变量

VPATH:寻找依赖文件时,当前路径下没有的情况下,可以自动去这个变量路径找
makefile自动变量

$@
规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。 $<
依赖目标中的第一个目标名字 $?
所有比目标新的依赖目标的集合。以空格分隔 $^
所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,去除重复的依赖目标,只保留一份 $+
所有依赖目标的集合。不去除重复的依赖目标
静态规则
TARGETS:TARGET-PATTERN:PRE-PATTERN
command 这个用法其实就是将“多目标规则”和“目标依赖文件模式通配”相结合。
TARGET-PATTERN通配TARGETS,PRE-PATTERN是对TARGET-PATTERN进行一个二次解析的替换,最终类似与:TARGETS:PRE-PATTERN的效果。
命令参数

make -h :输出help信息(其实有这个就足够了)
make -n :不执行命令,只显示命令,用于调试
make -s :禁止命令显示
make -C :cd到一个目录,然后执行make
make -f :指定make文件
make -B :认为所有的目标都更新,重编译
变量的使用

1. $(var)进行var的使用;
2. $$,表示$字符
3. := ,覆盖之前的值,值决定于它在makefile中的位置,而不是整个makefile展开后的最终值
4. ?= ,如果没有被赋值过就赋予等号后面的值
5. = , make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值
6. +=, 追加变量的值
05-11 22:37