4.3. Make工具介绍¶
无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令。 不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install。 利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。 而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那对程序员来说简直就是一场灾难。 而make工具则可自动完成编译工作,并且可以只对程序员在上次编译后修改过的部分进行编译。 因此,有效的利用make和makefile工具可以大大提高项目开发的效率。 同时掌握make和makefile之后,您也不会再面对着Linux下的应用软件手足无措了。
在 Sphinx 中使用的 make 功能相对比较简单,可以看作是对 Sphinx 命令的一个简单封装。 其作用主要是简化了 Sphinx 命令中参数的输入。 如果不用 make 工具,使用 Shell 脚本也可以完成相同的任务, 但既然有 make 工具,当然要使用它来简化这些工作。
4.3.1. Make程序的命令行选项和参数¶
Make命令参数的典型序列如下所示:
make [-f makefile文件名][选项][宏定义][目标]
这里用[]括起来的表示是可选的。命令行选项由破折号“–”指明,后面跟选项,如
make –e
如果需要多个选项,可以只使用一个破折号,如
make –kr
也可以每个选项使用一个破折号,如
make –k –r
甚至混合使用也行,如
make –e –kr
Make命令本身的命令行选项较多,这里只介绍在开发程序时最为常用的三个,它们是:
– -k
: 如果使用该选项,即使make程序遇到错误也会继续向下运行;如果没有该选项,在遇到第一个错误时make程序马上就会停止,那么后面的错误情况就不得而知了。我们可以利用这个选项来查出所有有编译问题的源文件。
– -n
: 该选项使make程序进入非执行模式,也就是说将原来应该执行的命令输出,而不是执行。
– -f
: 指定作为makefile的文件的名称。 如果不用该选项,那么make程序首先在当前目录查找名为makefile的文件,如果没有找到,它就会转而查找名为Makefile的文件。如果您在Linux下使用GNU Make的话,它会首先查找GNUmakefile,之后再搜索makefile和Makefile。按照惯例,许多Linux程序员使用Makefile,因为这样能使Makefile出现在目录中所有以小写字母命名的文件的前面。所以,最好不要使用GNUmakefile这一名称,因为它只适用于make程序的GNU版本。
当我们想构建指定目标的时候,比如要生成某个可执行文件,那么就可以在make命令行中给出该目标的名称;如果命令行中没有给出目标的话,make命令会设法构建makefile中的第一个目标。 我们可以利用这一特点,将all作为makefile中的第一个目标,然后将让目标作为all所依赖的目标,这样,当命令行中没有给出目标时,也能确保它会被构建。
4.3.2. Makefile概述¶
上面提到,make命令对于构建具有多个源文件的程序有很大的帮助。 事实上,只有make命令还是不够的,前面说过还必用须makefile告诉它要做什么以及怎么做才行,对于程序开发而言,就是告诉make命令应用程序的组织情况。
我们现在对makefile的位置和数量简单说一下。 一般情况下,makefile会跟项目的源文件放在同一个目录中。 另外,系统中可以有多个makefile,一般说来一个项目使用一个makefile就可以了;如果项目很大的话,我们就可以考虑将它分成较小的部分,然后用不同的makefile来管理项目的不同部分。
make命令和Makefile配合使用,能给我们的项目管理带来极大的便利,除了用于管理源代码的编译之外,还用于建立手册页,同时还能将应用程序安装到指定的目录。