第5章 make工程管理工具
本章介绍Linux下面的常用工程管理机制:make和Makefile,也介绍使用autoconf和automake生成Makefile的机制和方法。
在本章的学习中,读者应重点关注以下内容:
make的工作机制
Makefile的基本语法
使用Makefile典型工程
自动生成Makefile的流程
5.1 make和Makefile
make和Makefile提供了一种非常简单有效的工程管理方式。使用这种方式管理工程的原理很简单:Makefile是一个决定怎样编译工程的文本文件,有一定的书写规则。在工程更新的时候,使用GNU的make工具根据当前的Makefile对工程进行编译。
5.1.1 make机制概述
在Linux的程序开发环境下,一般不具有集成开发环境(IDE)。因此,当需要大量编译工程文件的时候,就需要使用自己的方法来管理。如果仅仅手动使用gcc的编译命令,将变得烦琐而单调,而且不利于工程管理。而如果使用Makefile进行工程管理,就可以较好地处理这个问题。
make 程序最初设计的目的是为了维护C程序文件,防止不必要的重新编译。例如,在使用命令行进行编译的时候,修改了一个工程中的头文件,如何确保包含这个头文件的所有文件都得到编译呢?这些工作可以让make程序来自动完成。make工具对于维护一些具有相互依赖关系的文件特别有用,它对文件和命令的联系(在文件改变时调用来更新其他文件的程序)提供一套编码方法。make工具的基本概念类似于Proglog语言,在使用的过程中只告诉make需要做什么,即提供一些规则,其他的工作由make自动完成。
make工具的工作是自动确定工程的哪部分需要重新编译,然后执行命令去编译它们。虽然这种方式多用于C程序,然而只要提供命令行的编译器,就可以将其用于任何语言。实际上,make工具不仅应用于编程,也可以用于描述一些文件改变时,需要自动更新另一些文件的任务。在程序开发的过程中,Makefile带来的好处就是自动化编译。当编译规则制定完成后,只需要一个make命令,整个工程就会根据Makefile判断是否需要更新来完成自动编译,极大地提高了软件开发的效率,降低了开发的复杂度。
make机制的运行环境需要一个命令行程序make和一个文本文件Makefile。
make是一个命令工具,具体来说是一个解释Makefile中的指令的命令工具。Makefile的工作原理是调用系统中的make命令解释当前的Makefile,完成其中指定的功能。在很多的IDE中都有这个命令,如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,Makefile已经成为一种在工程方面的编译方法。
Makefile里主要包含了5个方面的内容:显式规则、隐式规则、变量定义、文件指示和注释。
1.显式规则。显式规则说明了如何生成一个或多个目标。这需要由Makefile的书写者显式指出要生成的文件、文件的依赖文件及生成的命令。
2.隐式规则。由于make有自动推导的功能,会选择一套默认的方法进行make,所以隐式的规则可以让开发者比较、简略地书写Makefile,这是由make所支持的。
3.变量定义。在Makefile中需要定义一系列的变量,一般都是字符串,它类似C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
4.文件指示。包括三个部分,第一部分是在一个Makefile中引用另一个Makefile,就像C语言中的include一样包含进来;第二部分是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译宏#ifdef一样;第三部分就是定义一个多行的命令。
5.注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释符使用井号"#"字符,这个就像C/C++中的双斜杠"//"一样。如果需要在Makefile中使用井号"#"字符,可以用反斜杠进行转义,如:"\\#"。