56 FreeBSD连载:手工编译安装程序( 二 )


make
通常应用程序都比较复杂,那么其源程序就不仅包括一个文件,而是由多个文件构成,这样应用程序的编译和连接过程就相对复杂得多 。最简单的情况下可以使用shell程序来自动完成这个任务,然而由于并不是每次都更改了所有的文件,每次都完全重新编译所有的代码,不但浪费了处理器资源,也使得每次作一次小改变就得编译所有得文件,效率低下 。最好是能够按照需要,编译改动过的代码文件,而对没有更新过的文件就不必重新编译,这样就节约了系统的处理能力 。
如果要使用shell脚本来处理这些依赖关系来,则要求根据文件的更新时间进行维护,需要的shell脚本就比较复杂 。Unix提供了一个程序──make,来帮助按照代码之间的时间依赖关系来进行维护工作 。
make与其他解释语言不同,不是直接告诉make需要执行的命令,而是给定一些依赖规则,即在什么条件下应该执行什么处理,那么make就自动分析文件的更新时间,完成剩下的工作 。规定make规则的文件一般命名为Makefile,这是一个make指令的集合,这个文件中包括目标定义、执行命令、宏定义和make伪指令 。下面为一个简单的Makefile:
CC = /usr/local/bin/egcchello: hello.c$(CC) -o hello hello.cclean:echo delete files!rm hello这个例子中首先定义了一个宏CC,然后定义一个执行目标hello,这个目标依赖于hello.c文件,一旦hello.c更新,就需要执行下面的编译指令 。注意,位于定义目标之后的执行命令应该使用一个 “Tab” 制表符引导,而不是其他空白字符 。执行命令中首先将宏替换为它的值,再执行egcc命令编译程序 。
一个Makefile文件中可以定义多个目标,如上面例子中的hello和clean,如果不使用任何命令行参数来启动make,那么缺省使用第一个目标 。为了应用其他的make目标,则必须使用make的命令行参数 。
$ make cleandelete files!make使用的缺省文件名为当前目录下的makefile或Makefile,如果使用其他文件,必须使用命令行参数-f指定文件名 。
$ make -f newmakefileGNU的make命令首先查看的文件名为GNUmakefile 。
使用了make,对大型的应用软件进行维护就会容易一些 。然而不同的系统有一些与系统相关的定义,这些定义需要在Makefile中依据不同的系统重新设置,例如X Window的目录等,这样要完成可以适合多个不同系统的Makefile文件,仍然具有困难 。有一些工具能帮助进行这些系统相关的设置,并生成Makefile文件,例如X Window系统使用xmkmf命令和imake模板文件来产生本地的Makefile文件,这样就能正确侦知本地系统中有关X Window的正确设置,但软件开发者首先要完成Imakefile文件,以使用xmkmf 。而GNU的软件使用autoconf工具,它使用configure命令用来侦测很多系统相关的设置,如编译器、头文件、库函数等等,然后使用预设置的Makefile.in模板文件来产生相应的Makefile 。有了这些工具,进行编译各种多平台的应用程序都不再是困难的了 。
未完,待续 。。。

推荐阅读