Linux下軟體釋出技巧

查志強發表於2014-06-19

【原文:http://www.sudu.cn/info/html/edu/20070930/68136.html

Linux現在能夠被越來越多的人認識及使用,在很大程度上可以歸結為其具有強大的C編譯器――gcc、便於交流的環境――Internet,以及雄厚的師資――有數不清的程式設計師在開發數不清的程式碼。

  有了Linux和Internet,我們可以很容易地在世界範圍內釋出軟體作品,與他人交流開發心得與技巧。當我們完成了自己的軟體作品,怎麼樣才能讓其他人以快捷、方便的方式與自己分享成果、理解開發思想呢?這就是我們要討論的Linux下軟體打包和釋出的方法。

  在Linux尚未流行之前,Linux下軟體打包和釋出應用僅僅停留在程式設計師中,因此軟體分發基本都使用原始碼方式,便於大家相互學習和交流。隨著大量普通使用者和商業應用的參與,原始碼方式就顯得過於繁瑣,對使用者要求太高,而且耗費時間,所以編譯好的二進位制檔案釋出方式開始流行起來。這就是Linux下兩種主要的軟體釋出方式:原始碼方式和二進位制方式。原始碼方式通常是將原始檔以tar、tgz格式打包,解包後進行配置、編譯和安裝;二進位制方式以Red Hat公司的RPM(Red Hat Package Manager)格式最廣泛,它可以完成所有的步驟,自動將軟體安裝到系統中。

  tgz原始碼方式

  使用這種原始碼方式釋出的軟體,一般需要進行下列步驟:

  1.解開壓縮檔案,如tar、gz、bz2或tgz。

  2.執行./configure [--options] 進行軟體的配置。

  3.執行make、make install等命令編譯程式碼,並安裝到系統中。

  因此,如果要釋出軟體,就需要生成可供配置的configure檔案和進行編譯安裝的Makefile。

  下面以一個簡單的例子來說明。假設要釋出一個標準的hello程式,它打出“Hello, world!”的文字,該源程式命名為hello.c。在這個目錄下(注意只有原始檔hello.c,不需要編譯hello.o或者hello),首先執行命令autoscan:

  $autoscan

  這樣會生成configure.scan檔案,它包含了系統配置的基本選項。作為一個簡單的例子,其中很多東西是不需要的,所以可以修改這個檔案,讓它僅僅包含下面幾行:

  AC_INIT(hello.c)

  AM_INIT_AUTOMAKE(hello, 0.1)

  AC_PROG_CC

  AC_OUTPUT(Makefile)

  然後把這個檔案複製為configure.in,作為配置的輸入檔案。

  由於使用了m4巨集(AM_INIT... 語句),必須執行aclocal命令生成相應的巨集檔案:

  $aclocal

  在當前目錄中會產生aclocal.m4檔案。

  然後執行autoconf,以生成configure執行指令碼:

  $autoconf

  這樣關於配置的部分就完成了,下面是和編譯生成有關的。

  我們需要手工編輯一個文字檔案――Makefile.am,內容如下:

  AUTOMAKE_OPTIONS=foreign

  bin_PROGRAMS=hello

  hello_SOURCES=hello.c

  這個檔案應該很好理解,foreign告訴系統這是一個普通的應用軟體,該程式名稱為hello,而hello程式包含的源程式(SOURCES)只有hello.c這個檔案。接著執行:

  $automake --add-missing

  automake會自動生成所有必須的檔案,包括Makefile.in等重要檔案。

  最後進行壓縮、打包,整個工作就完成了。

  獲得這個壓縮包的使用者只需要進行前面提到的三個安裝步驟,就可以順利地得到hello應用程式了。

  RPM二進位制方式

  正如前面介紹的,使用原始碼方式釋出軟體無論是對作者還是使用者都比較麻煩。於是,Red Hat公司開發出一種直接安裝編譯好的二進位制檔案方式,並可根據不同的平臺釋出不同的版本。使用者只需要一個命令,就可以完成所有要安裝的步驟,十分適合普通使用者使用。那麼,如何把自己的軟體製作成RPM包呢?

  下面以Red Hat Linux為例,在預設情況下,和RPM包相關的目錄是/usr/src/redhat/下的SOURCES、SPECS和RPMS。其中SOURCES目錄存放需要製作的原始碼檔案,一般是tgz格式壓縮;SPECS目錄存放編寫的spec檔案,這些檔案指示RPM製作工具如何進行打包工作;而RPMS下有i386、i586、noarch等子目錄,分別對應不同的體系結構,如Intel 80386、586處理器等,noarch則是通用的,製作完成的RPM包就存放在這些目錄中。

  仍然以前面的hello為例,直接將hello.c壓縮成hello.tgz格式:

  $tar cfvz hello.tgz hello.c

  然後把hello.tgz拷貝到/usr/src/redhat/SOURCES下,並在/usr/src/redhat/SPECS/下編寫一個簡單的hello.spec檔案,內容如下:

  Name: hello program

  Summary: My first linux software

  Version: 0.1

  Release: 1

  Copyright: OpenSource

  Group: Extensions/Chinese

  Source: hello.tgz

  Packager: NetSnake

  %description

  This is a example software, just for see README for detail,

  NetSnake, some day.

  %changelog

  *Fri Dec 27 2002 NetSnake

  -build for the first time.

  %prep

  %setup

  %build

  make hello

  %install

  install -m 755 hello /usr/local/bin/hello

  %files

  %doc README

  /usr/local/bin/hello

  這個spec檔案是整個製作過程的關鍵,它控制著整個軟體包的製作流程,因此我們需要仔細分析一下。

  前面的Name、Summary等都是關於軟體性質、版本等的說明,可以看作是一個概述和總攬,其中Version和Release將會影響到生成軟體包的名稱。例如這裡版本是0.1,釋出是1,那麼做出來的RPM包就是hello-0.1-1.i386.rpm。而Group指的是在X-Window下生成快捷方式的位置,Chinese就是在“中文”下生成子目錄。然後就進入了具體的製作流程,所有以“%”開頭的巨集語句都表示製作流程中的一步。

  由此不難看出,製作過程大概需要這樣幾步:

  ◆ %description是對整個軟體的註釋,比如寫一些粗略的功能說明,可以分成若干行;

  ◆ %prep和%setup可以認為是預處理階段,對於小軟體來說沒什麼實質性用途;

  ◆ 接下來就是%build階段,這時候會將所有打包檔案解開,並根據實際情況將原始檔編譯為二進位制檔案(make hello);

  ◆ Build完成之後是%install,這個步驟通過%config、%file、%doc等巨集將編譯好的軟體、文件、配置檔案等安裝到指定的位置;

  ◆ 最後是所有被安裝到系統中的檔案列表。

  這就是整個RPM包安裝過程。它與Makefile比較起來要簡單得很多,因為它將所有操作集中到一個檔案中,非常有利於整理和糾錯。

  接下來就需要執行,以生成自己的RPM軟體包:

  $rpm -ba hello.spec

  需要注意的是,在新版本的Red Hat 8.0 下,製作RPM包的命令已經完全從rpm命令中分離出來,成為了一個單獨的rpmbuild,所以應該是rpmbuild -ba hello.spec。

  如果不用-target=[i486][i586]...指定體系結構,預設會是i386,這樣,會在/usr/src/redhat/RPMS/i386/下生成hello-xx-xxx.i386.rpm檔案。

  總的來說,原始碼方式的缺點是使用者安裝比較麻煩,而且容易出現各種錯誤;優點是可控制性強、靈活。RPM方式剛好相反,使用者安裝簡單,易於使用,但是基本不能按照自己的意思對軟體進行配置。這兩種釋出方法各有千秋,具體選擇哪種釋出方式可以根據自己的需要確定。

相關文章