1.makefile文件的内容主要包含以下几个内容:
- 显示规则:显示规则说明了如何生成一个或者多个目标文件。即makefile的书写者明显的指出要生成的文件,文件的依赖关系,生成命令。如果有多个目标,默认第一个目标为最终目标。
- 隐晦规则:由于make有自动推导的功能,所以隐晦规则可以让我们比较粗略地书写makefile。
- 变量定义:makefile中可以定义一系列的变量,变量一般都是字符串,和C中的宏相似。当makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
- 文件指示:一个makefile文件中可以引用另一个makefile。
- 注释:makefile中只有行注释,注释符:#,这个和java中的//一样。如果需要在makefile中使用“#”,可以使用反斜杠转义。
关于“隐晦规则”后续会进行学习说明。
注:makefile中的命令必须以Tab开始。
2.文件引用
语法:
include <filename>
注:
- filename中可以包含路径和通配符
- include前面可以有一些空字符,但是不可以以Tab键开始
示例:
有以下几个文件:a.mk b.mk c.mk foo.make
还有一个变量$(bar),其包含了e.mk f.mk
那么: include foo.make *.mk $(bar)
等价于 include foo.make a.mk b.mk c.mk e.mk f.mk
3.通配符的使用
make支持三种通配符:* ? [...]
- *:匹配0或多个字符
- ?:匹配任意单一字符
- [...]:匹配...中的任意单一字符
4.文件搜索
由于在一些大的工程中,源文件数量很多,所以当make需要找寻文件的依赖关系时,就需要知道文件的路径。
以下是设置路径的方法:
- makefile文件中的特殊变量“VPATH”
- make的关键字“vpath”(全部小写)
(1)VPATH:
当makefile中指定了这个变量,make就会在当前目录找不到的情况下到指定的目录文件中去找寻;否之,make只会在当前的目录文件中去寻找依赖文件和目标文件。
例如:VPATH=src:../headers
说明:
- 目录之间由":"分隔,所以上面的定义指定了两个目录:src ../headers
- 当前目录永远是最高级优先搜索的地方
(2)关键字:vpath
和上面的VPATH变量很类似,但是更为灵活。
使用方法有以下三种:
- vpath <pattern> <directories>
为符合模式<pattern>的文件指定搜索目录<directories>
- vpath <pattern>
清除符合模式<pattern>的文件的搜索目录
- vpath
清除所有已经被设置好了的文件搜索目录
说明:
- vpath使用方法中的<pattern>需要包含“%”字符,意思是匹配零个或者若干个字符
eg “%.h” :所有以“.h”结尾的文件
- <pattern>指定了要搜索的文件集,<directories>则指定了文件的搜索目录
eg vpath %.h ../headers :表示make在 ./headers目录下搜索所有以 .h 结尾的文件(如果在当前目录下没有找到的话)
- 可以连续的使用vpath,以指定不同的策略,make会按照语句顺序执行
eg vpath %.c foo
vpath % blish
vpath %.c bar