1、Makefile用来告诉make命令如何编译和链接文件,规则是:
1) 如果这个工程没有编译过,那么所有C文件都要编译并被链接
2) 如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3) 如果这个工程的头文件被改变了,那么需要编译引用了这几个头文件的C文件并链接目标程序。
2、注意:makefile文件中每行必须要以[table]键开始
3、可以使用include标识符,语法是:include <filename>
4、GNU的make工作时的执行步骤如下:
1) 读入所有的makefile
2) 读入被include指定的其他makefile
3) 初始化文件中的变量
4) 推导隐晦规则,并分析所有规则
5) 为所有的目标文件创建依赖关系链
6) 根据依赖关系,决定哪些目标要重新生成
7) 执行生成命令
1-5为第一阶段:如果定义的变量被使用了,那么make会把其展开在使用的位置。
5、在makefile编写规则中可以使用的通配符:“*”,“?”,“[…]”。
6、特殊变量VPATH,在make寻找文件的依赖关系时,该变量把一个路径告诉make,让他自动寻找。(多个目录之间使用“:”分割)。
7、vpath是make工具的一个关键字,比VPATH更灵活:
1)vpath<pattern> <dir>:为符合模式<pattern>的文件指定搜索目录
2)vpath<pattern>:清楚符合模式<pattern>的文件的所有目录
3)vpath:清除所有已被设置好的文件搜索目录
Vpath使用方法中的<pattern>需要包含“%”字符,表示匹配0或者若干字符(相当与*)。例子:$(objs): %.o: %.c
8、自动化变量:
“$<”:依赖目标中的第一个目标名字。
“$@”: 表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。
“$%”: 仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a (bar.o)",那么,"$%"就是"bar.o","$@"就是"foo.a"。如果目标不是函数库文件(Unix下是[.a],Windows 下是[.lib]),那么,其值为空。
“$?”: 所有比目标新的依赖目标的集合,以空格分隔。
“$^”:所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。
“$+”:这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标。
“$*”:这个变量表示目标模式中"%"及其之前的部分。如果目标是"dir/a.foo.b",并且目标的模式是"a.%.b",那么,"$*"的值就是"dir/a.foo"。
“$(@D)”:表示"$@"的目录部分(不以斜杠作为结尾&