dbm数据库源代码分析(17):Makefile文件和其他文件

   (1)Makefile文件。make工具使用Makefile文件来对整个项目进行编译、安装、打包发布等。gdbm项目的Makefile文件内容如下:
     1)收集系统的配置信息,并定义一些变量来保存它们,以便后面构建时能方便地使用它们。主要有:
       a)目录信息和构建工具:项目顶级目录top_builddir、源代码目录srcdir、编译器CC=gcc、库构建工具LIBTOOL=./libtool;
       b)安装工具:INSTALL=/usr/bin/install、INSTALL_PROGRAM及INSTALL_DATA;
       c)文档生成工具:MAKEINFO=makeinfo、TEXI2DVI=texi2dvi;
       d)依赖的库及编译器选项:LIBS、CFLAGS等;
       e)安装目录:包括可执行程序、库文件、手册页的安装目录。如libdir=/usr/local/lib、includedir=/usr/local/include、infodir=/usr/local/info、man3dir=/usr/local/man/man3等。
     2)收集项目各个模块的文件信息,并定义一些变量来保存它们。主要有后缀规则(编译的源文件和目标文件后缀)、每个模块的源文件列表、头文件列表、目标文件列表、libtool目标文件列表、可执行程序列表、文档文件列表、生成的库文件列表、以及发布包中的文件列表等;
     3)默认编译目标all:一般依赖于生成各个模块的库文件目标;
     4)安装目标install:用于安装gdbm。先在mkinstalldirs脚本中指定库文件libgdbm.la、头文件gdbm.h、man(3)手册页gdbm.3、info手册页gdbm.info的安装目录,然后用INSTALL_DATA指定的工具安装它们,la型的库文件一般用libtool来安装;
     5)安装兼容包的目标install-compat:安装ndbm和dbm部分。先在mkinstalldirs脚本中指定库文件libgdbm_compat.la、头文件ndbm.h和dbm.h的安装目录,然后安装它们;
     6)生成各个模块的库文件目标:有目标libgdbm.la、libgdbm_compat.la;
     7)目标gdbm.h:生成头文件gdbm.h,直接把gdbm.proto、gdbm.proto2以及gdbmerrno.h中一个全局变量复制到gdbm.h中;
     8)用来生成测试程序和转换程序的各个目标:testgdbm、testndbm、testdbm、conv2gdbm等;
     9)生成文档的目标:gdbm.info、gdbm.dvi。调用相应生成工具把gdbm.textinfo源文件输出为相应格式的文档;
     10)目标clean:清除之前编译生成的目标文件、可执行文件及配置文件;
     11)目标distclean:清除所有生成的文件,回到./configure之前的状态;
     12)目标dist:用tar和gzip工具将程序打包发布,包扩展名为.tar.gz;
     13)项目各个模块中生成.o目标文件的目标:dbm、ndbm、gdbm三大模块要生成的各个目标文件;
     14)测试程序和转换程序.o目标文件的目标:testgdbm.o、testndbm.o、testdbm.o、conv2gdbm.o等目标。

   其他未解剖的构建性文件主要还有aclocal.m4、configure脚本(由configure.in生成,configure.in前面已经解剖过了)、config.guess、config.sub、install-sh、config.status、libtool。一般都是由Autotools工具根据系统和项目的配置信息自动生成,我们无需过问。这些文件都比较长且很繁锁,因为自动工具在生成它们要考虑各种平台的差异(如BSD、System V、HP UNIX等等)、同一平台不同版本的变迁、以及同一平台上不同用户的不同配置等。这里只对其中一些文件作一些简单的介绍。
   (2)config.guess:GNU构建系统区分三类机器,运行构建用的编译器的“构建”机器、运行构建的软件包的“主机”机器、编译器用来产生代码的“目标”机器。这个脚本用来猜测“构建”机器的类型,并输出脚本所运行的系统的配置名(configure name)。
   (3)config.sub:使系统的配置名规范化。
   (4)config.status:这是一个动态生成的脚本文件,用于检测一些与编译器具体相关的参数,它由configure脚本生成。这个文件可用来重新创建configure脚本。
   (5)libtool:libtool 是一个通用库支持脚本,将使用动态库的复杂性隐藏在统一、可移植的接口中;使用libtool的标准方法,可以在不同平台上创建并调用动态库。可以认为 libtool是gcc的一个抽象,其包装了gcc(或者其他的编译器),用户无需知道细节,只要告诉libtool需要编译哪些库即可,libtool 将处理库的依赖等细节。libtool只与后缀名为lo、la为的libtool文件打交道。libtool 主要的一个作用是在编译大型软件的过程中解决了库的依赖问题;将繁重的库依赖关系的维护工作承担下来,从而释放了程序员的人力资源。libtool提供统一的接口,隐藏了不同平台间库的名称的差异等细节,生成一个抽象的后缀名为la高层库libxx.la(其实是个文本文件),并将该库对其它库的依赖关系,都写在该la的文件中。该文件中的dependency_libs记录该库依赖的所有库(其中有些是以.la文件的形式加入的);libdir则指出了库的安装位置;library_names记录了共享库的名字;old_library记录了静态库的名字。
   注意Linux中.o .a .so .la .lo的区别。.o是编译出的目标文件;.a是静态库,其实就是把若干.o文件打成了一个包;.so为动态链接库(共享库);.lo是使用libtool编译出的目标文件,其实就是在.o文件中添加了一些信息;.la是使用libtool编译出的库文件,其实是个文本文件,记录同名动态库的和静态库的相关信息。

   最后只剩下三个文档文件gdbm.3、gdbm.info、gdbm.textinfo了。也作一下简单的介绍。
   (6)gdbm.3:用来生成man(3)手册页的源文件,它主要的功能就是对手册页的格式进行排版,一般直接安装到/usr/local/man/man3下。这样就可以用命令man gdbm或man 3 gdbm自动对其进行排版并显示排版结果。我们也可用groff(或nroff)工具对它进行处理,以输出为ASCII文本(-Tascii选项)或PostScript(-Tps选项)等。
   (7)gdbm.info:info手册页(与man手册页类似,都是提供程序的帮助信息),直接安装到/usr/local/info下,就可以用命令info gdbm来查看了。它是由makeinfo工具根据gdbm.textinfo源文件生成而来的。是八进制的流文件,也可用cat命令查看其内容。
   (8)gdbm.textinfo:Textinfo源文件,可用输出为各种格式的文档,如info文档、普通文本、HTML、DVI、PDF、XML、Docbook等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值