配置

仅从技术兴趣上看,作者提供源代码的目的在于移植该软件。为 UNIX® 系统开发的自由软件能够在现存的 UNIX® 系统上(无论是自由的还是私有的)几乎不加修改地使用。而这需要在编译这些软件之前对其进行配置。

有好几个配置系统。不过您得使用软件作者希望的那一个(有时可能有好几个)。一般,您可以:

Autoconf

原则

AutoConf 用以正确配置软件。它创建编译需要的文件(比如 Makefile),且有时会直接修改源代码(比如使用 config.h.in 文件)。

AutoConf 的规则十分简单:

  • 该软件的程序员了解配置他的软件需要进行哪些测试(比如:“您使用哪一版本的库文件”)。他使用一种精确的语法将这些测试编写进 configure.in 文件。

  • 并且,他通过运行 AutoConfconfigure.in 文件生成 configure 自动配置脚本。该脚本将在配置程序的时候运行所需的测试。

  • 最终用户执行该脚本,这样 AutoConf 就会为编译进行配置。

举例

AutoConf 使用示例:

$ ./configure
loading cache ./config.cache
checking for gcc... gcc
checking whether the C compiler (gcc  ) works... yes
checking whether the C compiler (gcc  ) is a cross-compiler... no
checking whether we are using GNU C... yes
checking whether gcc accepts -g... yes
checking for main in -lX11... yes
checking for main in -lXpm... yes
checking for main in -lguile... yes
checking for main in -lm... yes
checking for main in -lncurses... yes
checking how to run the C preprocessor... gcc -E
checking for X... libraries /usr/X11R6/lib, headers /usr/X11R6/include
checking for ANSI C header files... yes
checking for unistd.h... yes
checking for working const... yes
updating cache ./config.cache
creating ./config.status
creating lib/Makefile
creating src/Makefile
creating Makefile

为了更好地控制 configure,可以通过命令行或环境变量为其添加选项。比如:

$ ./configure --with-gcc --prefix=/opt/GNU

或者(在 bash 中):

$ export CC=`which gcc`
$ export CFLAGS=-O2
$ ./configure --with-gcc

或者:

$ CC=gcc CFLAGS=-O2 ./configure

是什么原因它不起作用?

一般而言,出错信息类似于 configure: error: Cannot find library guile (大部分 configure 脚本的出错信息都是如此)。

这表示 configure 脚本找不到某个库文件(例如上例中的 guile)。这是因为 configure 脚本在测试时会使用该库文件编译一个小测试程序,如果它不能成功编译该程序,就说明它也不能够编译该软件。所以它给出该出错信息。

  • 您可以在 config.log 文件尾部找到配置过程所执行的每一步骤,从中能够发现产生这一错误的原因。C 编译器的错误提示十分明了。这将帮您解决该问题。

  • 请检查提示的库文件是否已正确安装。如果没有,请(从源代码或已编译的二进制文件)安装之后再运行 configure。检查它是否已安装的有效方式是查找包含提示字符串的库文件,一般是 lib<名称>.so。比如,

    $ find / -name 'libguile*'

    或者:

    $ locate libguile
  • 请检查编译器是否能够访问该库文件:它是否在 /usr/lib/lib/usr/X11R6/lib (或是在由环境变量 LD_LIBRARY_PATH 指出的,详细解释参见“是什么原因它不起作用?”一节中的b)目录中。并键入 file libguile.so 以检查该文件是否为一库文件。

  • 请检查该库文件相应的头文件是否已安装于正确地方(通常是 /usr/include/usr/local/include/usr/X11R6/include)。如果您不知道您需要什么头文件,请检查您是否安装了所需库文件的相应开发版本(比如,对 libgtk+2.0 而言您安装了 libgtk+2.0-devel)。这一库文件的开发版本为使用该库进行编译的软件提供所需的“include”文件。

  • 请检查您拥有足够的磁盘空间(configure 脚本需要一些空间来保存中间文件)。请使用 df -h 来显示您系统中各分区的使用情况,并注意其中满的或即将满了的分区。

如果您不理解 config.log 文件中的错误信息,请在自由软件社区中提出您的问题(参见“技术支持”一节)。

而且,即使 configure 提示某个库文件不存在,也请检查一下它是否存在(比如,很可能会有某个非常奇怪的提示说您的系统中竟然没有 curses 库)。在那种情况下,很可能是 LD_LIBRARY_PATH 变量出错了!

Imake

imake 让您能够使用简单的规则生成 Makefile 文件以配置自由软件。这些规则指定需要编译哪些文件才能生成所需的二进制文件,而 imake 生成相应的 Makefile。可在 Imakefile 文件中指定这些规则。

有意思的是 imake 使用站点相关(架构相关)的信息。这非常适用于使用 X Window 系统 的应用程序。不过 imake 也用于许多其他的应用程序。

使用 imake 最为简单的方法是进入解压后的主目录,然后运行 xmkmf 脚本,而它又会调用 imake 程序。

$ xmkmf -a
$ imake -DUseInstalled -I/usr/X11R6/lib/X11/config
$ make Makefiles

如果本机没有正确安装,请重新编译并安装 X11R6

各种 shell 脚本

请阅读 INSTALLREADME 文件以了解进一步信息。通常,您需要执行 install.shconfigure.sh 文件。然后,该安装脚本或是非交互的(它自己决定需要什么),或者会向您询问有关您系统的信息(比如是路径)。

如果您无法确定应该运行哪个文件,您可以(在 bash 下)键入 ./,并按 TAB 键(跳格键)两次。bash (在其默认配置下)会自动用该目录中的可执行文件来补全(亦即某个可执行配置脚本)。如果有好几个可执行文件,它将显示这些文件的列表。然后您只需选中正确的那个。

另一个特例是安装 perl 模块。这种模块的安装是通过执行一个以 perl 编写的配置脚本完成的。通常需要执行的命令为:

$ perl Makefile.PL

其他

某些自由软件组织混乱,特别是在其初期开发阶段(不过它们会提醒其用户!)。有时它们会要求您“手动”更改某些配置文件。通常,这些文件是 Makefile 文件(参见“Make”一节)和 config.h 文件(其名称是约定俗成的)。

我们建议不要采用这种维护方式,除非用户确实明白他们在作什么。这需要许多知识以及一些成功的动力,不过正所谓熟能生巧嘛。