程序设计一般有一个固定的流程:编辑源代码文件、将源代码文件编译成可执行文件以及对成果进行调试。make程序可让将一个项目中的源文件编译成可执行文件之类的工做自动化。make这个词的意思是“制做”,你想制做什么后面就加什么参数,制做的方法也就是配方须要你指定,也就是makefile中的规则。shell
若是你会shell编程的话,你会发现上述功能写个脚本也能作到。相对于脚本,make的优势是:它能够根据文件之间的依赖关系和时间戳判断应该从新执行那些步骤,以产生须要的程序。有了这个信息,make能够优化编译的过程,跳过非必要的步骤。这样是Make的核心优点。编程
如今有许多自动构建工具,用来产生makefile,好比cmake,qmake等。大部分人都不用手写makefile,可是读懂makefile的能力仍是要有的。函数
基本上,makefile包含了一组用来编译应用程序的规则,其它的元素都是为了更好的描述规则。第一条规则被认为是默认规则。
一项规则能够分为三个部分:工做目标(target),它的必要条件(prerequisite),以及所要执行的命令(command):工具
target:<prereq1> <prereq2> ... <commands>
make的工做机制很简单。它首先未来自命令行的参数做为工做目标,若是没有指定,则取第一个规则中的目标,称为为默认工做目标。而后按顺序查找全部该目标依赖的文件,并依次把依赖文件做为目标在makefile中查找相应的规则...按此递归下去造成依赖树。树的叶子节点在makefile中没有相应的规则更新他们,因此他们必须是已经存在的,不然make报错:所需文件不存在并且没有更新他们的规则。(产生也视为更新操做。)make的规则树的搜索创建是先序遍历过程,而规则的执行是后序遍历过程。优化
规则的执行:若是某个必要条件比目标“新”,则将此规则的命令交给shell执行。而若是工做目标最“新”,则什么也不作。命令只是一些shell程序,它并不必定须要产生一个叫作"target"
的文件。target
和prerequisites
也并不必定要求是文件名。ui
这种要更新目标先更新必要条件的思想是Make的精髓所在。它保证工做步骤合理而且高效的执行。当某个文件发生改变时,只有依赖它的目标才会被更新,也只有相应的命令会被执行。命令行
假设有一个简单的程序,包括两个源文件main.c和lib.c,他们都包含了头文件header1.h和header2.h,把编译后造成的可执行程序命名为prog,那么makefile能够写为:设计
all: prog prog: main.o lib.o gcc -o prog main.o lib.o main.o : main.c header1.h header2.h gcc -c main.c lib.o : lib.c header1.h header2.h gcc -c lib.c
如今你只要执行make就会自动执行相应的shell命令把程序编译好了。调试
固然这只是个说明makefile工做方式的简单例子,并不比直接输入编译命令快多少。可是makefile能够借助变量、函数等工具完成很是复杂的规则描述,对于要反复调试的程序显然很是方便快捷。code