一、Makefile的注释:
Make file中只有行注释,在Unix的Shell脚本一样,其注释是用”#“字符,类似于C++中的"//”,如果要在Makefile中使用“#” 要用“\”进行转义 :“\#”
在makefile中的命令,必须要以【Tab】键开始
二、引用其他的Makefile
在Make file中可以使用include关键字可以把别的Makefile包含进来,被包含的文件要放在当前文件的包含位置。Make file的语法: Include <filename>
filename可以是当前操作系统Shell的文件模式(可以包含路径和通配符)在Include前面可以有一些空字符,但是不能是【Tab】键开始的,include和<filename>可以用一个或者多个空格隔开。
Make执行时会首先在当面目录下寻找,如果没有找到还会再一下目录中寻找。
①如果Make执行时,有"-I" 或 ”--include-dir“参数,那么make就会在这个参数所指定的目录下去寻找。
②如果目录<prefix>/include 例如(/usr/local/bin 或/usr/include) 存在的话,make也会去寻找
如果文件没有找到的话,make会生成一条警告信息,但不会马上出现致命错误。make命令会继续载入其他文件,一旦完成makefile 的读取,make会再次去重新寻找,如果还是没有找到才会提示知名报警。如果你想让make不去理会这些无法读取的文件继续执行,可以在 include前面加一个减号”-“:-include <filename>
三、通配符的使用,
当我们想定义一系列比较相似的文件,通配符会非常方便我们使用。
make支持三种通配符:” * “ ,” ?“ , ”[...]“这是和Unix的B-Shell相同的。波浪号”~“字符在文件名中也有比较特殊的用途。如果时”~/test“,这就表示当前用户的$HOME目录下的test目录
(*.c)表示所有后缀为c的文件,如果文件名中本身有”*“中,那么可以用转义字符”\*“来表示”*“字符。而不是任意长度的字符串。
例子一:
cleam:
rm -f *.o
例子二:
Print: *.c
lpr -p $?
touch print
例子三:
objects = *.o
"$?"是一个自动化变量
例子三要注意一下,并不时指所有的.o文件,他就是指(*.o)这个字符串
如果你想要他指所有的【.o】文件集合,可以这么写
object :=$(wildcard *.o)
wildcard 是一个关键字,后面在关键字中统一说
四、文件搜寻
在一些大的工程中,有大量的源文件,我们一帮会将源文件分类,存放在不同的路径中。当make需要寻找依赖关系时,我们可以在文件前面加上路径,让make自动去寻找。
方法一:
Makefile中的特殊变量“VPATH”就是用来完成这个功能的,如果没有这个变量,make只会从当前目录中去寻找依赖的文件和目标文件,如果定义了这个变量,make就会在当前目录找不到的情况下去指定目录去寻找
VPATH = src:../headers
上面的定义指定两个目录,“src”和“../headers”,make会按照这个顺序进行搜索。目录由“:”分割。
方法二:
使用make的“vpath”(小写)关键字,这个不是变量,时一个make的关键字,相比VPATH它更加的灵活,它的使用方法由三种:
①vpath<pattern><directories>
为符合模式<pattern>的文件指定索引目录<directories>
②vpath<pattern>
清除符合模式<pattern>的文件的搜索目录
③vpath
清除所有已被设置好了的文件搜索目录
vapth使用方法中<pattern>需要包含“%”字符。“%”的意思是匹配零或若干字符例如“%.h”表示所有以.h结尾的文件。非常类似我们linux下的“*”。<pattern>指定了要搜索的文件集。<directories>则指定了文件集的搜索目录。
例如: vaph %.h ../headers
该句表示 要求make在“../headers”目录下搜索所有.h文件(当需要的文件在当前目录中没有找到时)。
除此以外,我很可以连续的使用vpath,来指定不同的搜索策略。make会按照语句的先后顺序来执行搜索。
vpath %.c foo:bar
vpath % blish
这个句子表示“.c”结尾的文件 先在foo目录查找,后在bar目录查找 最后再去blish目录中查找。