Tarball 的管理与建议

使用原始码管理软件所需要的基础软件

从原始码的说明我们晓得要制作一个 binary program 需要底下这些基础的软件:

  • gcc 或 cc 等 C 语言编译器 (compiler)
  • make 及 autoconfig 等软件
  • 需要 Kernel 提供的 Library 以及相关的 Include 文件

在 CentOS 当中,如果你已经有网络可以连上 Internet 的话 透过 yum 的软件群组安装功能,你可以这样做:

  • 如果是要安装 gcc 等软件发展工具,请使用『 yum groupinstall "Development Tools" 』
  • 若待安装的软件需要图形介面支持,一般还需要『 yum groupinstall "X Software Development" 』
  • 若安装的软件较旧,可能需要『 yum groupinstall "Legacy Software Development" 』

Tarball 安装的基本步骤

  1. 取得原始档:将 tarball 文件在 /usr/local/src 目录下解压缩;
  2. 取得步骤流程:进入新创建的目录底下,去查阅 INSTALL 与 README 等相关文件内容 (很重要的步骤!);
  3. 相依属性软件安装:根据 INSTALL/README 的内容察看并安装好一些相依的软件 (非必要);
  4. 创建 makefile:以自动侦测程序 (configure 或 config) 侦测作业环境,并创建 Makefile 这个文件;
  5. 编译:以 make 这个程序并使用该目录下的 Makefile 做为他的参数配置档,来进行 make (编译或其他) 的动作;
  6. 安装:以 make 这个程序,并以 Makefile 这个参数配置档,依据 install 这个标的 (target) 的指定来安装到正确的路径

大部分的 tarball 软件之安装的命令下达方式:

1. ./configure
这个步骤就是在创建 Makefile 这个文件罗!通常程序开发者会写一支 scripts 来检查你的 Linux 系统、相关的软件属性等等,这个步骤相当的重要, 因为未来你的安装资讯都是这一步骤内完成的!另外,这个步骤的相关资讯应该要参考一下该目录下的 README 或 INSTALL 相关的文件!

2. make clean
make 会读取 Makefile 中关於 clean 的工作。这个步骤不一定会有,但是希望运行一下,因为他可以去除目标文件!因为谁也不确定原始码里面到底有没有包含上次编译过的目标文件 (*.o) 存在,所以当然还是清除一下比较妥当的。 至少等一下新编译出来的运行档我们可以确定是使用自己的机器所编译完成的嘛!

3. make
make 会依据 Makefile 当中的默认工作进行编译的行为!编译的工作主要是进行 gcc 来将原始码编译成为可以被运行的 object files ,但是这些 object files 通常还需要一些函式库之类的 link 后,才能产生一个完整的运行档!使用 make 就是要将原始码编译成为可以被运行的可运行档,而这个可运行档会放置在目前所在的目录之下, 尚未被安装到预定安装的目录中;

4. make install
通常这就是最后的安装步骤了,make 会依据 Makefile 这个文件里面关於 install 的项目,将上一个步骤所编译完成的数据给他安装到预定的目录中,就完成安装啦!

一般 Tarball 软件安装的建议事项 (如何移除?升级?)

Linux distribution 默认的安装软件的路径,以 apache 这个软件来说明的话:

/etc/httpd
/usr/lib
/usr/bin
/usr/share/man
//分别代表『配置档、函式库、运行档、线上说明档』

但是如果你每个软件都选择在这个默认的路径下安装的话, 那么所有的软件的文件都将放置在这四个目录当中,因此,如果你都安装在这个目录下的话, 那么未来再想要升级或移除的时候,就会比较难以追查文件的来源罗! 而如果你在安装的时候选择的是单独的目录,例如我将 apache 安装在 /usr/local/apache 当中,那么你的文件目录就会变成:

/usr/local/apache/etc
/usr/local/apache/bin
/usr/local/apache/lib
/usr/local/apache/man

移除该软件就简单的多了! 只要将该目录移除即可视为该软件已经被移除罗!以上面为例,我想要移除 apache 只要下达『rm -rf /usr/local/apache』 就算移除这个软件。
这个方式虽然有利於软件的移除,但在运行某些命令的时候,与该命令是否在 PATH 这个环境变量所记录的路径有关,以上面为例,我的 /usr/local/apache/bin 肯定是不在 PATH 里面的,所以运行 apache 的命令就得要利用绝对路径了,否则就得将这个 /usr/local/apache/bin 加入 PATH 里面。另外,那个 /usr/local/apache/man 也需要加入 man page 搜寻的路径当中

一个简单的范例、利用 ntp 来示范

  • 解压缩下载的 tarball ,并参阅 README/INSTALL 文件
    [root@www ~]# cd /usr/local/src   <==切换目录
    [root@www src]# tar -zxvf /root/ntp-4.2.4p7.tar.gz  <==解压缩到此目录
    ntp-4.2.4p7/         <==会创建这个目录喔!
    ntp-4.2.4p7/libopts/
    ....(底下省略)....
    [root@www src]# cd ntp-4.2.4p7/
    [root@www ntp-4.2.4p7]# vi INSTALL  <==记得 README 也要看一下!
    # 特别看一下 28 行到 54 行之间的安装简介!可以了解如何安装的流程喔!
    
  • 检查 configure 支持参数,并实际建置 makefile 守则档

      [root@www ntp*]# ./configure --help | more  <==查询可用的参数有哪些
        --prefix=PREFIX         install architecture-independent files in PREFIX
        --enable-all-clocks     + include all suitable non-PARSE clocks:
        --enable-parse-clocks   - include all suitable PARSE clocks:
      # 上面列出的是比较重要的,或者是你可能需要的参数功能!
    
      [root@www ntp*]# ./configure --prefix=/usr/local/ntp \
      >  --enable-all-clocks --enable-parse-clocks  <==开始创建makefile
      checking for a BSD-compatible install... /usr/bin/install -c
      checking whether build environment is sane... yes
      ....(中间省略)....
      checking for gcc... gcc           <==也有找到 gcc 编译器了!
      ....(中间省略)....
      config.status: creating Makefile  <==现在知道这个重要性了吧?
      config.status: creating config.h
      config.status: executing depfiles commands
    
  • 最后开始编译与安装
    [root@www ntp*]# make clean; make
    [root@www ntp*]# make check
    [root@www ntp*]# make install
    # 将数据给他安装在 /usr/local/ntp 底下
    

利用 patch 升级原始码

  • 测试旧版程序的功能
    [root@www ~]# tar -zxvf main-0.1.tgz
    [root@www ~]# cd main-0.1
    [root@www main-0.1]# make clean main
    [root@www main-0.1]# ./main
    version 0.1
    Please input your name: VBird
    Please enter the degree angle (ex> 90): 45
    Hi, Dear VBird, nice to meet you.
    The Sin is:  0.71
    The Cos is:  0.71
    
  • 查阅 patch file 内容

    [root@www main-0.1]# vim ~/main_0.1_to_0.2.patch
    diff -Naur main-0.1/cos_value.c main-0.2/cos_value.c
    --- main-0.1/cos_value.c        2009-06-09 22:52:33.000000000 +0800
    +++ main-0.2/cos_value.c        2009-06-12 00:45:10.000000000 +0800
    @@ -6,5 +6,5 @@
    {
          float value;
    ....(底下省略)....
    
      //patch 的基本语法如下:
      patch -p数字 < patch_file
    
  • 升级原始码,并且重新编译程序

      [root@www main-0.1]# patch -p1 < ../main_0.1_to_0.2.patch
      patching file cos_value.c
      patching file main.c
      patching file Makefile
      patching file sin_value.c
      # 请注意,鸟哥目前所在目录是在 main-0.1 底下喔!注意与 patch 文件的相对路径!
      # 虽然有五个文件,但其实只有四个文件有修改过喔!上面显示有改过的文件!
    
      [root@www main-0.1]# make clean main
      [root@www main-0.1]# ./main
      version 0.2
      Please input your name: VBird
      Please enter the degree angle (ex> 90): 45
      Hi, Dear VBird, nice to meet you.
      The sin(45.000000) is:  0.71
      The cos(45.000000) is:  0.71
      # 你可以发现,输出的结果中版本变了,输出资讯多了括号 () 喔!
    
      [root@www main-0.1]# make install   <==将他安装到 /usr/local/bin 给大家用
      cp -a main /usr/local/bin
      [root@www main-0.1]# main           <==直接输入命令可运行!
      [root@www main-0.1]# make uninstall <==移除此软件!
      rm -f /usr/local/bin/main
      //只不过升级了原始码并非软件就升级!你还是得要将该软件进行编译后,才会是最终正确的软件喔! 因为 patch 的功能主要仅只是升级原始码文件而已