5.1 源码的安装方式

由于Linux系统中使用的绝大多数软件都是开源软件,软件作者在发布软件时直接提供的就是软件的源代码。用户在取得应用软件的源码文件后,可以根据自身需求对软件进行修改或定制,然后在自己的系统上重新编译,即可生成能在该系统上执行的程序文件。通过源码安装,用户可以获得最新的应用程序,定制更灵活、丰富的功能,而且使软件可以跨越计算机平台,在所有版本的Linux系统中使用。但是源码安装方式过于复杂,耗时长,对用户的软件开发能力要求也比较高。源码安装方式的特点可概括如下。

Linux系统软件大都是开源软件,这些软件总是以源码形式最先发布。下载应用程序的最新源码并编译安装,可在程序功能、安全补丁等方面得到及时更新。

对于RPM格式封装的应用程序,在编译源代码程序时绑定功能也一并安装到Linux主机上,可能造成安全隐患。RPM软件包的更新并没有源代码,而通过对程序源代码进行重新配置并编译安装后,可以定制更灵活、更丰富的功能。

当需要对现有的程序源代码进行适当修改,以便增加新的功能时,必须释放出该软件的源代码,进行修改后再重新编译安装。

源码安装软件一般由以下几个步骤组成:下载解压源码、分析安装平台环境(ifconfigure)、编译安装软件(make、make install)等,下面分别来介绍。

5.1.1 下载解压源码

Linux下软件的源码一般都是C或者C++语言编写的,并且都会在软件的官方网站上提供源码包下载,例如apache开源项目的官方网站为http://www.apache.org。此外,网上的很多开源社区也提供一些常用软件的源码供下载。源码被打包成压缩文件,常见的源码打包压缩格式有.tar.gz、.tar.baz2等。可以先从网站上下载源码文件,然后再传到所在的Linux系统下。如果Linux系统处于联网状态下,也可以直接在系统内通过wget之类的下载命令将源码压缩包直接下载到Linux系统中。

下载完成后,把相应的软件包解压缩即可。针对下载软件包的不同,在使用不同的方法进行解压。解压完毕后进入解压生成的目录中,在这个目录下,一般都存在一个REDAME文件,这个文本文件非常重要,它详细介绍了这个软件所能完成的功能、授权许可、安装需求、安装注意事项、安装方式等。由于Linux各个版本的差异以及安装环境的不同,软件的安装方式也不尽相同,所以在安装软件前,一定要事先阅读这个README文件,从而确保安装的正确性。

5.1.2 分析安装平台环境

在软件包解压完毕之后,进入源码目录,一般都会有configure和README这两个文件。README是对软件的介绍和安装说明。Linux下软件的安装受到操作系统安装环境的影响,比如某些软件在安装或者运行过程中需要调用操作系统本身的库文件,或者需要运行系统的某个工具等,但是如果系统中不存在这个库文件或者这个工具,那么安装或者运行软件就会失败。

为了避免这类问题的出现,在安装软件前需要分析操作系统环境,检测当前系统是否拥有安装软件所需的所有文件和工具,如果系统缺少某个文件,就给出提示,直到满足软件的所有需求为止。这就是configure文件的功能。configure文件一般是个可执行文件,可以在当前目录下直接输入“./configure”进行软件安装的环境测试,如果提示缺少某些安装包,就需要进行安装,直到测试通过。通常,源码安装都需要GCC或者CC编译器,这些编译器一般在安装系统时定制安装包中的开发工具选项下,其实这也是第2章安装Linux系统中要求选择开发工具包的原因所在。

此外,在执行configure分析软件需求时,还可以在“./configure”后面加上软件的安装路径以及安装所需的模块等选项,来定制用户需要的软件功能。

5.1.3 编译安装软件

在验证软件安装环境后,正式进入软件的编译步骤。在进行编译前,首先要了解关于编译的一些基础知识。在Linux系统下,make是经常用到的编译命令。无论是安装软件还是项目开发,都会经常用到编译安装命令,也就是make和make install命令。对于一个包含很多源文件的应用程序,使用make和makefile工具可以简单快速地解决各个源文件之间复杂的依赖关系,同时,make工具还可以自动完成所有源码文件的编译工作,并且可以只对上次编译后修改过的文件进行增量编译。因此,熟练掌握了make和makefile工具之后,源码安装软件就变得像Windows下安装软件一样简单。

make工具最主要的功能是通过makefile文件来实现的,makefile文件是按照某种语法来进行编写的,文件中定义了各个源文件之间的依赖关系,说明了如何编译源文件及生成可执行文件,通过描述各个源程序之间的关系来使make工具自动完成编译工作。在Linux系统下,一般习惯用Makefile替代makefile文件,在configure执行通过测试后,就会在当前目录下生成这个文件,一般情况下在命令行输入make时,make命令会默认去寻找当前目录下的Makefile文件。如果需要使用其他文件,就要在make命令选项后指定相应的文件名。例如设定编译规则文件为make_file,就需要使用以下命令来指定。

  [root@WEBServer ~]#make -f make_file

下面通过实例讲解Makefile的编写原则和内容。

【例5-1】 test程序由三个源文件file1.c、file2.c、file3.c及库文件LS编译生成,这三个源文件还分别包含了头文件1.h、2.h和3.h。通常,C编译器将会输出三个目标文件file1.o、file2.o和file3.o。假定file1.c和file3.c都要声明用到一个apcs文件,但是file2.c不用,也就是在file1.c和file3.c文件中都有类似#include "apcs"的声明。

下面这段代码就是对test程序的描述。

  1: #It is an example for describing makefile
  2: test: file1.o file2.o file3.o
  3: cc file1.o file2.o file3.o -LS -o test
  4: file1.o: file1.c 1.h apcs
  5: gcc -c file1.c
  6: file3.o: file3.c 3.h apcs
  7: gcc -c file3.c
  8: file2.o: file2.c c.h
  9: gcc -c file2.c

这个对test程序的描述文档其实就是一个Makefile文件,其中,第一行为注释行,第二行指定test程序由file1.o、file2.o和file3.o链接生成,第三行描述了如何从test所依赖的文件来建立可执行文件,接下来的第四行、第六行、第八行定义了三个目标文件以及它们依赖的.c、.h和apcs文件,第五行、第七行、第九行则定义了如何从目标依赖的文件生成可执行文件。

在了解Makefile文件结构后,用户就可以控制编译的选项,定制自己所需的软件功能。接下来,只需在命令行输入make命令,即可进入编译阶段,根据软件源程序的大小和系统的硬件配置进行编译。编译所需的时间不定。编译完毕,会在当前目录以及子目录下生成相应的可执行文件。接下来就进入最后的安装软件阶段,在命令行输入make install命令,开始安装软件,安装进程首先创建安装目录,如果没有指定安装目录,安装程序默认在系统的/usr/local目录下创建安装目录,然后将相应的文件和可执行程序从源码目录复制到安装目录下,这样安装就完成了。具体的,编译安装步骤如下。

(1)解压缩包——tar命令

使用tar命令解开压缩包,释放出源代码文件。

(2)配置——./configure命令

该过程主要是生成Makefile文件。配置工作通常由源代码目录中的configure脚本文件完成,配置结果将保存到源码目录中的Makefile文件中。若在配置过程中出现错误,通常是缺少相关依赖软件包所致,一般只需根据提示安装相应软件即可。“./configure”表示执行当前目录下的configure脚本文件,不同应用程序其配置参数会存在区别,具体配置参数可在源代码目录中执行“./configure –help”命令查看。但是有一个“--prefix”参数却是大多数开源软件所通用的,该配置参数用于指定软件包安装的目标文件夹。配置界面如图5-1、图5-2所示。

图5-1 配置./configure界面1

图5-2 配置./configure界面2

(3)编译——make命令

执行make命令将源代码文件转变为二进制可执行程序。编译的过程主要是根据makefile文件中的配置信息,将源代码编译、连接成可执行程序。

(4)检测——make test/make check命令

顾名思义,这一步就是对上一步make命令的检查。要确保make是没有错误的,也就是这一步的test、check要全部是通过,error为0。这一步可省略。

(5)安装——make install命令

编译完成后,就可以执行“make install”命令将软件的执行程序、配置文件等相关文件复制到Linux系统中了,即应用程序最后的“安装”过程。如图5-3所示为编译安装ntfs- 3g包。

图5-3 编译安装ntfs-3g

5.1.4 源码编译安装程序的卸载

如果要重新安装源码编译安装包,以上一节编译安装的ntfs-3g为例,若打算重新安装,则需要先删除,直接运行下面的命令就可以了:

  #make uninstall
  #make clean

如果是编译过程出错,要重新编译,命令如下:

  make clean

然后再执行如下命令即可:

  ./configure
  make && make install

5.1.5 源码安装实例

通常的安装方法是在安装包的目录下执行以下命令。

  gunzip soft1.tar.gz;
  cd soft1
  #. /configure         #配置
  make                  #调用make
  make install          #安装源代码
  #make clean                   #删除安装时产生的临时文件
  #make uninstall               #卸载软件

【例5-2】在Linux下以源码安装方式安装Apache Http server。

(1)下载及解压apache源码

  [root@WEBServer~]#mkdir /apache               #在根目录下创建一个apache目录
  [root@WEBServer~]#cd /apache                  #切换到apache目录
  [root@WEBServer apache]#wget \                #下载apache源码
  >http://apache.mirror.phpchina.com/httpd/httpd-2.2.9.tar.bz2
  [root@WEBServer apache]#tar -jxvf httpd-2.2.9.tar.bz2 #解压apache源码
  [root@WEBServer apache]#ls            #显示解压结果
  httpd-2.2.9   httpd-2.2.9.tar.bz2

(2)测试安装环境

  [root@WEBServer apache]#cd httpd-2.2.9 #切换到httpd-2.2.9目录下
  [root@WEBServer httpd-2.2.9]#./configure  --prefix=/opt/apache2.2.9\
  >--enable-so\
  >--enable-mods-shared=most\
  >--enable-proxy-balancer=shared\
  >--enable-proxy-http=shared\
  >--enable-proxy-ajp\
  >--enable-rewrite

上面的代码中指定apache的安装目录为/opt/apache2.2.9,同时指定了需要编译的apache模块。

下面分别介绍这些模块代表的含义(更详细的介绍参看apache说明文档)。

--enable-so选项:表示使apache支持DSO模式。

--enable-mods-shared=most选项:表示动态编译大部分常用模块,当然也可以有选择地加载一些模块。most的意思是只包含通常用的模块,并且以动态加载模式加载。

--enable-proxy-balancer=shared选项:表示使apache支持负载均衡功能,即动态编译apache的负载均衡模块。

--enable-proxy-http=shared选项:表示动态编译apache的http代理模块。

--enable-proxy-ajp选项:表示动态编译apache的proxy-ajp模块。

--enable-rewrite选项:表示使apache支持地址重写功能,即动态编译apache的rewrite模块。

(3)编译安装软件

  [root@WEBServer httpd-2.2.9]#make
  [root@WEBServer httpd-2.2.9]#make install

安装完毕后,apache被安装到/opt/apache2.2.9下,接下来就可以使用apache软件了。

【例5-3】将Linux图形中文软件fcitx源码安装到/opt/fcitx目录中。

完整的安装步骤如下:

  [root@localhost fcitx]# tar jxvf fcitx-3.2-050827.tar.bz2
  [root@localhost fcitx]#cd fcitx
  [root@localhost fcitx]# ./configure --prefix=/opt/fcitx
  [root@localhost fcitx]# make
  [root@localhost fcitx]# make install

调用fcitx命令如下。

  [root@localhost]#/opt/fcitx/bin/fcitx

如果希望只要执行fcitx命令就能调用fcitx,可配置环境变量,或者在/usr/bin中增加一个fcitx的链接。