本文参照自狄泰软件学院:《门徒计划》课程
make和makefile的区别:
make是一个应用程序,用来解释程序之间的依赖关系,并根据依赖关系自动维护编译工作,执行宿主操作系统中的各种命令
makefile是一个描述文件,定义了一系列的规则来指定源文件编译的先后顺序,拥有特定的语法规则,支持函数定义合函数调用,能够直接集成操作系统的各种命令。
两者的关系是makefile中描述用于指导make程序如何完成工作,make根据根据马克file中的规则执行命令,最后完成编译输出
最简单的makefile示例
hello:
echo "hello makefile"
hello为目标,下面一行是实现目标所需执行的命令
要注意的是目标后的命令需要用Tab键('\t')隔开而不是四个空格
依赖的定义:
targets :通常是需要生成的文件目标名,make所需要执行的命令名称
prerequisities:当前目标所需要的依赖的其它目标或文件
command:完成目标所需要执行的命令
目标、依赖、命令都可以有多个,目标和依赖需要由空格隔开,但是每条命令必须以[Tab]字符开始
要知道续行符 :\ 可以将内容分开写到下一行,提高可读性
依赖规则:
当目标对应的文件不存在,执行对应命令,当依赖在时间上比目标更新,执行对应命令,当依赖关系连续发生时,对应依赖立链上的每一个目标
伪目标的引入:默认情况下,make认为目标对应着一个文件,make比较目标文件和依赖文件的新旧关系,决定是否执行命令,make以文件处理作为第一优先级(如果目标和当前文件夹有同名的文件,make会认为是文件ps:两者没有关系,这样会导致不能够执行命令,所以引入伪目标)
makefile中的伪目标,通过.PHONY关键字声明伪目标,伪目标不对应任何的实际文件,而且不管伪目标的依赖是否更新,命令总是执行
伪目标的语法:先声明,后使用 本质:伪目标是make中特殊的目标.PHONY的依赖
伪目标的妙用:规则调用(函数调用)
.PHONY : clean rebuild all
## other rules ##
rebuild : clean all
clean :
rm *.o hello.out
原理:当一个目标的依赖包含伪目标时,伪目标所定义的命令总会执行
注意:.PHONY是标准make才有的关键字(ps:其他的非标准的make可能没有),可以使用这样的技巧来代替.PHONY
原理是:如果一个规则没有命令或者依赖,并且它的目标不是一个存在的文件名;在执行此规则时,目标总会被认为是最新的