rpm包打包過程詳解(二)——製作原始碼安裝包
製作原始碼安裝包(.tar.gz)
1. 解決依賴的軟體:
系統環境:[紅帽企業Linux.6.4.64位伺服器版].rhel-server-6.4-x86_64
原始碼製作中使用到的軟體為GNU M4,GNU autoconf,GNU automake;GNU autoconf,GNU automake兩者之間存在依賴關係:在安裝automake之前要完成autoconf的安裝。
該系統中這幾個軟體包分別是:
autoconf-2.63-5.1.el6.noarch.rpm
automake-1.11.1-4.el6.noarch.rpm
2. 編寫要打包的C程式;
3. 執行autoscan命令。#Autoscan ,autoscan掃描原始碼生成autoscan.log
4. 修改configure.scan檔案。並將檔案重新命名為:configure.in,只有這樣執行autoconf才會識別出來這個檔案。
-*-Autoconf -*-
# Process this file with autoconf to produce aconfigure script.
AC_PREREQ([2.68])
AC_INIT(server,1.0)
#AC_INIT([FULL-PACKAGE-NAME], [VERSION],[BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([server.c])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE(server,1.0)
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, andcompiler characteristics.
# Checks for library functions.
AC_OUTPUT([Makefile])
5. 執行aclocal命令,生成aclocal.m4
6. 執行autoconf命令,根據configure.in和aclocal.m4生成configure檔案。#autoconf,configure是一個指令碼,它能設定源程式來適應各種不同的作業系統平臺,並且根據不同的系統來產生合適的Makefile,從而可以使你的原始碼能在不同的作業系統平臺上被編譯出來。
configure.in檔案的內容是一些巨集,這些巨集經過autoconf處理後會變成檢查系統特性、環境變數、軟體必須的引數的shell指令碼。configure.in檔案中的巨集的順序並沒有規定,但是你必須在所有巨集的最前面和最後面分別加上AC_INIT巨集和AC_OUTPUT巨集。
7. 編寫Makefile.am。
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=server
server_SOURCES=server.c
Makefile.am是用來生成Makefile.in的,需要你手工書寫。Makefile.am中定義了一些內容:
AUTOMAKE_OPTIONS 這個是automake的選項。在執行automake時,它會檢查目錄下是否存在標準GNU軟體包中應具備的各種檔案,例如AUTHORS、ChangeLog、NEWS等檔案。我們將其設定成foreign時,automake會改用一般軟體包的標準來檢查。
bin_PROGRAMS 這個是指定我們所要產生的可執行檔案的檔名。如果你要產生多個可執行檔案,那麼在各個名字間用空格隔開。
helloworld_SOURCES 這個是指定產生“helloworld”時所需要的原始碼。如果它用到了多個原始檔,那麼請使用空格符號將它們隔開。比如需要helloworld.h,helloworld.c那麼請寫成helloworld_SOURCES= helloworld.h helloworld.c。
如果你在bin_PROGRAMS定義了多個可執行檔案,則對應每個可執行檔案都要定義相對的filename_SOURCES。
8. 執行automake命令。執行之前需要新建config.h.in檔案
#touch config.h.in
#automake --add-missing,選項--add-missing的定義是“add missing standard files to package”,它會讓automake加入一個標準的軟體包所必須的一些檔案。
我們使用automake,根據configure.in和Makefile.am來產生Makefile.in。我們用automake產生出來的Makefile.in檔案是符合GNU Makefile慣例的。
9. 接下來這幾步就跟安裝原始碼包步驟一樣了。其實我們只需要./configure就可以進行打包。後面兩步只是為了驗證一下。
#./configure,把Makefile.in變成了最終的Makefile檔案。
#make,根據Makefile編譯原始碼,連線,生成目標檔案server.o,可執行檔案server;
#makeinstall如果想把這個程式安裝在你的系統裡,這個簡單的命令就可以了。安裝的目錄一般在/usr/local/bin目錄。
10. 執行make dist命令, 產生髮布軟體包檔案。#make dist . 這個命令將會將可執行檔案及相關檔案打包成一個tar.gz壓縮的檔案用來作為釋出軟體的軟體包。它會在當前目錄下生成一個名字類似“PACKAGE-VERSION.tar.gz”的檔案。PACKAGE和VERSION,是我們在configure.in中定義的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。這裡就是server-1.0.tar.gz
注意事項:
1. Configure.scan一定要重新命名為configure.in,否則autoconf不識別。
2. Configure.in中的AC_OUTPUT(Makefile)必須和Makefile.am名字保持一致,否則automake會出錯。