精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>● FreeBSD>>《FreeBSD使用大全》第二版>>3.5.4 使用make维护文件依赖关系

主题:3.5.4 使用make维护文件依赖关系
发信人: sungang(笨刚)
整理人: sungang(2003-09-16 11:57:41), 站内信件
3.5.4 使用make维护文件依赖关系

通常应用程序都比较复杂,那么其源程序就不仅包括一个文件,而是由多个文件构成,这样应用程序的编译和连接过程就相对复杂得多。最简单的情况下可以使用shell程序来自动完成这个任务,然而由于编译过程分为编译和连接,因为并不是每次都更改了所有的文件,实际上只需要重新编译改动的程序就可以了,没有改动过的程序,其目标文件是不变的,没有必要重新编译。

而如果使用shell脚本,每次都要完全重新编译所有的代码,不但浪费了处理器资源,也使得每次作一次小改变就得编译所有的文件,效率低下。最好是能够按照需要,编译改动过的代码文件,而对没有更新过的文件就不必重新编译,这样就节约了系统的处理能力。

如果要使用shell脚本来处理这些依赖关系来,则要求根据文件的更新时间进行维护,需要的shell脚本就比较复杂,几乎是不可能实现的。Unix提供了一个程序──make,来帮助按照代码之间的时间依赖关系来进行维护工作。

make与其他解释语言不同,不是直接告诉make需要执行的命令,而是给定一些依赖规则,即在依赖文件更新的条件下应该执行什么处理。一旦启动make,那么make就自动分析文件的更新时间,完成剩下的工作。

规定make规则的文件一般命名为Makefile,这是一个make指令的集合,这个文件中包括目标定义、执行命令、宏定义和make伪指令。下面为一个简单的Makefile:

CC = /usr/bin/gcc

hello:   hello.c

      $(CC) -o hello hello.c

clean: 

      echo delete files!

       rm hello

这个例子中首先定义了一个宏CC,然后定义一个执行目标hello,这个目标依赖于hello.c文件,一旦hello.c更新,就需要执行下面的编译指令。注意,位于定义目标之后的执行命令应该使用一个 “Tab” 制表符引导,而不是其他空白字符。执行命令中首先将宏替换为它的值,再执行egcc命令编译程序。

一个Makefile文件中可以定义多个目标,如上面例子中的hello和clean,如果不使用任何命令行参数来启动make,那么缺省使用第一个目标。为了应用其他的make目标,则必须使用make的命令行参数。

$ make clean

delete files!

make使用的缺省文件名为当前目录下的makefile或Makefile,如果使用其他文件,必须使用命令行参数-f指定文件名。

$ make -f newmakefile

GNU的make命令首先查看的文件名为GNUmakefile。

使用了make,对大型的应用软件进行维护就会容易一些。然而,即便如此,软件仍然存在不同系统之间的移植问题。因为不同的系统有一些与系统相关的定义,这些定义需要在Makefile中依据不同的系统重新设置,例如X Window的目录等,这样要完成可以适合多个不同系统的Makefile文件,仍然具有困难。

有一些工具能帮助进行这些系统相关的设置,并生成Makefile文件,例如X Window系统使用xmkmf命令和imake模板文件来产生本地的Makefile文件,这样就能正确侦知本地系统中有关X Window的正确设置,但软件开发者首先要完成Imakefile文件,以使用xmkmf。

另一种流行的方法是GNU的autoconf工具,它使用configure命令用来侦测很多系统相关的设置,如编译器、头文件、库函数等等,然后使用预设置的Makefile.in模板文件来产生相应的Makefile。有了这些工具,进行编译各种多平台的应用程序都不再是困难的了。

需要注意的是,虽然基本语法相同,但在一些细节上,FreeBSD本身的make和GNU的make的语法是不同的,因此autoconf工具产生的Makefile有时候是不能用FreeBSD系统的make编译的。

[关闭][返回]