make--隐式规则 路径搜索及实例
一.隐式规则
问题一
.PHONY : allall: @echo "command-1"VAR:=testall: @echo "all:$(VAR)"
make之后的结果如图所示
可以得出的结论是
A.makefile中出现同名目标时
依赖:所有的依赖将合并在一起,成为目标的最终依赖
命令:当多处出现同一目标时,make发出警告;所有之前定义的命令被最后定义的命令取代
注意:当使用include关键字包含其他文件时,需要确保被包含文件中的同名目标只有依赖,没有命令;否则,同名目标的命令将被覆盖
隐式规则
1.make提供了一些常用的,例行的规则实现
2.当相应目标的规则未提供时,make尝试隐式规则
3.make提供了生成目标文件的隐式规则
4.隐式规则会使用预定义变量完成编译工作
5.改变预定义变量将部分改变隐式规则的行为
6.当存在自定义规则时,不再使用隐式规则
深入理解隐式规则
A.当make发目标的依赖不存在时
1.尝试通过依赖名逐一查找隐式规则
2.并且通过依赖名推导可能需要的源文件
隐式规则的副作用
1.编译行为难以控制--大量使用隐式规则可能产生意想不到的编译行为
2.编译效率低下--make从隐式规则和自定义规则中选择最终使用的规则
隐式规则链
当依赖的目标不存在时,make会极力组合各种隐式规则对目标进行创建,进而产生意料之外的编译行为---需要名为N.o的目标:N.y->N.c>N.o
查看隐式规则
隐式规则的禁用
A.局部禁用
1.在makefile中自定义规则
2.在makefile在定义模式(如:%.o:%.p)
B.全局禁用
make -r
后缀规则的简介
1.后缀规则是旧式的"模式规则"
2.可以通过后缀描述的方式自定义规则
双后缀规则--定义一对文件后缀(依赖文件后缀和目标文件后缀),如:.cpp<==>%.o:%.cpp
单后缀规则--定义单个文件后缀(源文件后缀),如.c<==>%:%.c
关于后缀规则的注意事项
1.后缀规则中不允许有依赖
2.后缀规则必须有命令,否则无意义
3.后缀规则逐步被模式规则取代
小结:
1.当多处出现同一目标的命令时,只有最后定义的命令有效
2.make提供了一系列的而隐式规则可使用
3.当makefile中未定义相关规则时,尝试使用隐式规则
4.隐式规则中可能使用make中的预定义变量
5.改变预定义变量可部分改变预定义规则的行为
6.隐式规则可能造成意想不到的编译行为
7.在实际工程项目中尽量不使用隐式规则
8.后缀规则是一种旧式的模式规则
9.后缀规则正逐步被模式规则取代
二.路径搜索
A.常用的源码管理方式
项目中的makefile必须能够正确的定位源文件和依赖文的文件,最终编译可执行程序代码如下图
如图所示:inc文件夹是头文件,而src文件夹是源文件,makefile文档程序如图所示,make之后的结果如图所示
生成该结果的原因是在当前文件夹中不存在func.c
特殊的预定义变量VPATH(全大写)
1.VPATH变量的值用于指示make如何查找文件
2.不同文件夹可作为VPATH的值同时出现
3.文件夹的名字之间需要用分隔符进行区分
make对于VPATH值的处理方式
1.当前文件找不到需要的文件时,VPATH会被使用
2.make会在VPATH指定的文件夹中依次搜索文件
3.当多个文件夹存在同名时,选择第一次搜索到的文件
注意事项:
1.VPATH只能决定make的搜索路径,无法决定命令的搜索路径
2.对于特定的编译命令(gcc),需要独立指定编译搜索路径
3.
对之前示例的修改及运行结果如图所示
VPATH存在的问题--当inc文件夹意外出现源文件(C/Cpp文件),那么可能产生编译错误
替换方案:vpath关键字(全小写)
1.为不同类型的文件指定不同的搜索路径
2.语法--在Directory中搜索符合Pattern的规则的文件
运行的实例及运行结果如图所示
取消搜索规则:
1.取消已经设置的某个搜索规则
.vpath Pattern
2.取消所有已经设置的规则
.vpath
三 路径搜索的几个问题
问题1:当VPATH和vpath同时出现时,make会如何处理
运行的实例及结果图
当把src2中的func.c改成func.cpp再次进行make
运行的结果
对比得出的结论
1.make首先在当前文件夹搜索需要的文件
2.如果失败
a.make优先在vpath指定的文件夹中搜索目标文件
b.当vpath搜索失败时,转而搜索VPATH指定的文件夹
问题2--当使用vpath对同一个Pattern指定多个文件夹时,make会如何处理
实例及运行结果如图所示
结论:
1.make首先在当前文件夹搜索需要的文件
2.如果失败
a.make以自上而下的顺序搜索vpath指定的文件夹
b.当找到目标文件,搜索结束
问题3--通过VPATH指定搜索路径后,make如何决定目标文件的最终位置
将第一次运行的结果生成的app.out放置src文件夹下的运行make结果图如图所示
结论:
1.当app.out完全不存在--make在当前文件夹下创建app.out
2.当src文件夹中存在app.out--所有目标和依赖的新旧关系不变,make不会重新创建app.out;当依赖文件被更新,make在当前文件夹下创建app.out
四 小结:
1.VPATH变量用于指示make如何查找文件
2.make会在VPATH指定的文件夹中依次搜索文件
3.vpath关键字可以为不同类型的文件指定不同的搜索路径
4.vpath比VPATH更灵活易用,可动态设置/取消搜索路径
5.尽量使用vpath为不同文件指定搜索路径
6.不要在源码文件夹中生成目标文件
7.为编译得到的结果创建独立的文件夹