如果想在一个makefile中引用其他的文件,也就是包含进其他的makefile文件到此Makefile文件,像C语言一样儿,使用include命令
include filename 如:include others.mk
这样就相当于在include文件的地方原封不动的把others.mk的内容展开到此处,filename中可以包含通配符,路径等,如:
include *.mk ../make_dir/test.mf
就是包含当前目录下的所有的mk后缀的文件,还有上一层目录下make_dir目录中的test.mf文件。如果make工具在指定的目录中并没有找到对应的文件,那么make就会去下面几个地方继续寻找:
- 如果在make命令行中指定了—include-dir参数,那make就会去这个参数指定的目录中去寻找对应的文件。
- 如果usr/local/bin/或者usr/include存在,make也会去这里寻找。
如果找到对应的文件,那么make会继续执行makefile的展开工作,如果没有找到对应的文件,那么make也会继续工作,继续装载其他的文件,只会在此处生成一个警告信息,直到makefile完全读取完成,这时,make会回过头继续寻找刚才没有找到的文件,如果再次没有查找到对应的文件,这是make就会报一条fatal error(致命错误),从而中止make工作。如何使make在最后即使没找到对应的文件报错误之后也继续进行make工作呢,那就是在可能出现错误的include前加上一个-(减号),这样make就是忽略错误继续执行,这个-(减号)可以用在多处,比如用在clean的时候,-rm *.o,这就表明,在删除目录文件的时候如果出现问题也不要理会,继续删除操作。
说到这里不得不说的一个东西就是MAKEFILES环境变量,这个环境变量的值是N个空格分开的文件名,如果系统中有这个环境变量,那么make在执行的时候就会把这个环境变量的值,做一个相当于引入的操作,即把环境变量中定义的几个文件都会引用进来,而且其里面定义的目标不会当做最终目标来构建执行,出现错误也不会停止,官方的说法是不建议使用这个环境变量,尤其在多个makefile时,每个makefile都会读取这个环境变量一次,稍有不慎可能就引起不必要的麻烦,如果想包含什么文件,还是直接include XXX来的好。
说完这个再说一下文件搜索,通常一个工程中,可能头文件会放在一个目录中,实现的对应的文件放在另一个目录中,难道我们还要在编写makefile的时候每一个都手动的去加上一个路径么?当然不必,make工具已经想到这一点了。VPATH变量就是解决这个问题的,如,Makefile所在的当前目录中有source和header二个目录分别放着实现文件与头文件(假设),那么搜索路径就可以这么来写:
VPATH = ./source:./header(中间用冒号分隔)
这样儿make在当前目录找不到就会按次序去source和header目录下去寻找文件了。用这个变量有时候可能不太灵活,有时候可能只希望在某个目录下查找指定的文件。那第vapth就该出场了(大小写之分)。
用vpath可以按模式来指定要在某个目录下搜索什么样儿的文件,用法如下:
- vpath (要搜索的文件) (目录)
- vapth (目录)
- vpath
第一种,在指定的目录下搜索指定模式的文件,这里的模式指的是可以使用通配符的匹配模式,目录就是指定的搜索目录。如:vpath %.cpp ./source意思就是在当前目录下的source目录下搜索所有以cpp后缀的文件,如果有多个目录就使用空格或者冒号分隔。
第二种,清除符合某个指定模式的所有目录,如:vpath %.mm 这样就是清除了之前为所有mm后缀的文件设置的搜索的路径。
第三种,直接就一个vpath,意思就是清除所有的文件之前设置的搜索路径。
这大致就是makefile的文件包含与路径搜索设置的简单用法。