1. 程式人生 > >linux 原始碼編譯安裝軟體包./configure 詳解

linux 原始碼編譯安裝軟體包./configure 詳解

在linux上使用程式原始碼編譯安裝軟體包的時候第一步是./configure命令,對這個命令的作用很好奇,蒐集了一下:

Linux環境下,如果通過原始碼編譯安裝程式的簡單過程可以 描述為:./configure–>make–>make install。其中./configure配置指令碼功能就是對你的系統做很多的測試,以用來檢測出你的安裝平臺的目標特徵,比如它會檢測你是不是有CC 或GCC,它是個shell指令碼,是autoconf的工具的基本應用,它會產生一個輸出檔案’./Makefiles’,接下來make程式通過該檔案 來實現編譯。

  ‘configure’指令碼有大量的命令列選項.對不同的軟體包來說,這些選項可能會有變化,但是許多基本的選項是不會改變的.帶上’–help’選項執行’configure’指令碼可以看到可用的所有選項.儘管許多選項是很少用到的,但是當你為了特殊的需求而configure一個包時,知道他們的存在是很有益處的.下面對每一個選項進行簡略的介紹:

configure指令碼選項的配置內容基本上分成9塊內容,分別是:

1. 配置區【Configuration】
2. 程式安裝目錄區【Installation directories】
3. 程式名稱區【Program names】
4. 系統型別區【System types】
5. 可選特性區【Optional Features】
6. 可選安裝包區【Optional Packages】
7. 影響安裝的環境變數區【Some influential environment variables】
8. 其他資訊

1. configuration

這塊內容主要是對./configure指令碼本身執行的過程進行配置,如是否顯示執行結果給使用者,是否建立cache檔案啊。由於這些選項都比較簡單,就不翻譯了。

-h, --help display this help and exit
--help=short display options specific to this package
--help=recursive display the short help of all the included packages
-V, --version display version information and exit
-q, --quiet, --silent do not print `checking...' messages
--cache-file=FILE cache test results in FILE [disabled]
-C, --config-cache alias for `--cache-file=config.cache'
-n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or `..']

–cache-file=FILE
  ‘configure’會在你的系統上測試存在的特性(或者bug!),為了加速隨後進行的配置,測試的結果會儲存在一個cache file裡,尤其當configure一個複雜的原始碼樹時,一個很好的cache file的存在會對效能有很大幫助。

–help
  輸出幫助資訊.即使是有經驗的使用者也偶爾需要使用使用’–help’選項,因為一個複雜的專案會包含附加的選項.例如,GCC包裡的’configure’指令碼就包含了允許你控制是否生成和在GCC中使用GNU彙編器的選項.

–no-create
  ‘configure’中的一個主要函式,會製作輸出檔案.此選項阻止’configure’生成這個檔案.你可以認為這是一種演習(dry run),儘管快取(cache)仍然被改寫了.

–quiet
–silent
  當’configure’進行他的測試時,會輸出簡要的資訊來告訴使用者正在作什麼.這樣作是因為’configure’可能會比較慢,沒有這種輸出的話使用者將會被扔在一旁疑惑正在發生什麼.使用這兩個選項中的任何一個都會把你扔到一旁.(譯註:這兩句話比較有意思,原文是這樣的:If there was no such output, the user would be left wondering what is happening. By using this option, you too can be left wondering!)

–version
  列印用來產生’configure’指令碼的Autoconf的版本號.

2. Installation directories

這個區塊是./configure指令碼中經常被配置的選項區,這裡的主要作用就是配置你要安裝的軟體的安裝後的目錄,預設情況下(使用者沒有主動配置),./configure會將軟體安裝在/usr/local/bin/和/usr/local/lib/等目錄下面。

--bindir=DIR user executables [EPREFIX/bin]
--sbindir=DIR system admin executables [EPREFIX/sbin]
--libexecdir=DIR program executables [EPREFIX/libexec]
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
--libdir=DIR object code libraries [EPREFIX/lib]
--includedir=DIR C header files [PREFIX/include]
--oldincludedir=DIR C header files for non-gcc [/usr/include]
--datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
--datadir=DIR read-only architecture-independent data [DATAROOTDIR]
--infodir=DIR info documentation [DATAROOTDIR/info]
--localedir=DIR locale-dependent data [DATAROOTDIR/locale]
--mandir=DIR man documentation [DATAROOTDIR/man]
--docdir=DIR documentation root [DATAROOTDIR/doc/mysql]
--htmldir=DIR html documentation [DOCDIR]
--dvidir=DIR dvi documentation [DOCDIR]
--pdfdir=DIR pdf documentation [DOCDIR]
--psdir=DIR ps documentation [DOCDIR]

–prefix=PREFIX(檔案安裝的位置,預設為:/usr/local)
  ‘–prefix’是最常用的選項.製作出的’Makefile’會檢視隨此選項傳遞的引數,當一個包在安裝時可以徹底的重新安置他的結構獨立部分. 舉一個例子,當安裝一個包,例如說Emacs,下面的命令將會使Emacs Lisp file被安裝到”/opt/gnu/share”:
$ ./configure –prefix=/opt/gnu/share

–exec-prefix=EPREFIX
  與’–prefix’選項類似,但是他是用來設定結構倚賴的檔案的安裝位置.編譯好的’emacs’二進位制檔案就是這樣一個問件.如果沒有設定這個選項的話,預設使用的選項值將被設為和’–prefix’選項值一樣.

–bindir=DIR
  指定二進位制檔案的安裝位置.這裡的二進位制檔案定義為可以被使用者直接執行的程式, 預設為EPREFIX/bin.

–sbindir=DIR
  指定超級二進位制檔案的安裝位置.這是一些通常只能由超級使用者執行的程式.預設為EPREFIX/sbin

–libexecdir=DIR(包目錄,程式呼叫)
  指定可執行支援檔案的安裝位置.與二進位制檔案相反,這些檔案從來不直接由使用者執行,但是可以被上面提到的二進位制檔案所執行.預設為EPREFIX/libexec.

–datadir=DIR
  指定通用資料檔案的安裝位置.預設為PREFIX/share

–sysconfdir=DIR(/etc配置檔案目錄, 預設為PREFIX/etc)
  指定在單個機器上使用的只讀資料的安裝位置.

–sharedstatedir=DIR
  指定可以在多個機器上共享的可寫資料的安裝位置. 預設為 PREFIX/com

–localstatedir=DIR
  指定只能單機使用的可寫資料的安裝位置. 預設為PREFIX/var

–libdir=DIR(庫檔案目錄)
  指定庫檔案的安裝位置. 預設為PREFIX/lib

–includedir=DIR
  指定C標頭檔案的安裝位置.其他語言如C++的標頭檔案也可以使用此選項. 預設為PREFIX/include

–oldincludedir=DIR
  指定為除GCC外編譯器安裝的C標頭檔案的安裝位置. 預設為/usr/include

–infodir=DIR
  指定Info格式文件的安裝位置.Info是被GNU工程所使用的文件格式. 預設為PREFIX/info

–mandir=DIR(幫助文件的安裝目錄)
  指定手冊頁的安裝位置.預設為PREFIX/man

–srcdir=DIR
  這個選項對安裝沒有作用.他會告訴’configure’原始碼的位置.一般來說不用指定此選項,因為’configure’指令碼一般和原始碼檔案在同一個目錄下.

3. Program names

如果你想改變安裝後程序的名稱,如你安裝qq程式,但是你不想稱呼它為“qq“,而想叫它為“360”,那麼可以通過下面這些選項來配置了。

–program-prefix=PREFIX
  指定將被加到所安裝程式的名字上的字首.例如,使用’–program-prefix=g’來configure一個名為’tar’的程式將會使安裝的程式被命名為’gtar’.當和其他的安裝選項一起使用時,這個選項只有當他被`Makefile.in’檔案使用時才會工作.

–program-suffix=SUFFIX
  指定將被加到所安裝程式的名字上的字尾.

–program-transform-name=PROGRAM
  這裡的PROGRAM是一個sed指令碼.當一個程式被安裝時,他的名字將經過`sed -e PROGRAM’來產生安裝的名字.

4. System types

一個程式開發完成以後,對原始碼進行編譯,將編譯後的檔案釋出出去形成所謂的各個平臺的安裝版本(非開源的都是這麼幹的,開源的也可以這樣編譯後產生不同執行平臺的編譯版本),這就是所謂的交叉編譯。下面介紹有關這平臺相關性的選項。
–build=BUILD
  指定軟體包安裝的系統平臺.如果沒有指定,預設值將是’–host’選項的值.

–host=HOST
  指定軟體執行的系統平臺.如果沒有指定,將會執行`config.guess’來檢測.

–target=GARGET
–target選項用來配置編譯工具,它只有在建立交叉編譯 環境的時候用到,正常編譯和交叉編譯都不會用到。他用–build主機上的編譯器,編譯一個新的編譯器(binutils, gcc,gdb等),這個新的編譯器將來編譯出來的其他程式將執行在target指定的系統上。

  指定軟體面向(target to)的系統平臺.這主要在程式語言工具如編譯器和彙編器上下文中起作用.如果沒有指定,預設將使用’–host’選項的值.通過–build選項來指定執行程式碼編譯工作的主機,通常該值預設是cofig.guess(該shell指令碼和./configure在同一目錄)來猜即可(一般就是你執行編譯操作的主機),當然你也可以通過這個選項指定具體的值。
編譯的程式在什麼機器上執行是由–host選項指定的,其預設值都是–build,當兩者不一樣的時候就是所謂的交叉編譯。

5. Optional Features

當你想在./configure時使用某個特性的時候,可以來配置該區塊中的選項值,它主要分為disable和enable兩大類,具體有哪些特性可以用過“./configure –help“來查詢。下面主要來總的介紹下這2類配置。

–disable-FEATURE
當你想禁用某個FEATURE的時候可以使用它(尤其是某些軟體可能預設開啟某些特性,而實際上你是不需要的),
例如:$ ./configure –disable-gui

-enable-FEATURE[=ARGUMENT]
相反的,一些軟體包可能提供了一些預設被禁止的特性,這時你可以使用“–enable-FEATURE“來起用它,一個特性可能會接受一個可選的引數值。
例如:$ ./configure –enable-buffers=128.
–enable-FEATURE=no’與上面提到的’–disable-FEATURE’是同義的

6. Optional Packages

軟體的包安裝的時候,可能會存在依賴。加上a軟體依賴於b軟 件,那麼在安裝a軟體的時候,必須要先安裝b軟體,而此時b軟體偏偏不在系統的預設查詢目錄(即系統無法查詢到,或者你不想使用系統預設的b軟體而想使用 你自己安裝的b軟體(整個系統有2個b軟體)),你就可用通過with選項來指定具體的軟體包地址,通過without選項來指定不使用指定的軟體包。

--with-PACKAGE[=ARGUMENT]
--without-PACKAGE
'--with-PACKAGE=no'與下面將提到的'--without-PACKAGE'是同義的.

例如:

$ ./configure --with-tcl=/usr/local --with-tk=/usr/local
$ ./configure --without-gnu-ld
--with-PACKAGE[=ARG]

關於這些這個選項區塊,有些軟體會有類似下面2個比較特殊的選項。
–x-includes=DIR
這個選項是’–with-PACKAGE’選項的一個特例,它提供了向’configure’指令碼指明包含X11標頭檔案的目錄的方法。
–x-libraries=DIR
類似的,’–x-libraries’選項提供了向’configure’指令碼指明包含X11庫的目錄的方法。
關於第5/6兩塊,和具體程式的相關性就比較高了,很多程式的不同配置都可以在這裡面指定。

7. Some influential environment variables

這塊主要是影響編譯器的編譯環境變數

8. 原始碼安裝包的解除安裝

最後一個問題,一個軟體包通過編譯原始碼安裝後,如何完全的解除安裝呢?
如果原先的source還在的話,很多source的 Makefile都有寫uninstall規則,直接在Souce裡make uninstallmake install & make clean)就可行,不過如果碰到無良作者沒寫的,那一句一句看Makefile裡install部分他都幹了些什麼,然後挨個刪除。如果source沒 了,那就悲劇了。
8.1如何解除安裝用原始碼包安裝的軟體?

最好是看README和INSTALL ;一般的情況下都有說,但大多軟體沒有提供原始碼包的解除安裝方法;
我們可以找到軟體的安裝點刪除。主要看你把它安裝在哪了。(先刪除程序再刪除執行檔案等)

比如:

如果安裝軟體時,指定個目錄。這個問題也不會難;

比如用原始碼包安裝gaim 的

#./configure --prefix=/opt/gaim
#make
#make install

如果安裝mlterm

#./configure --prefix=/opt/mlterm

#make

#make install

把原始碼包安裝的軟體,都指定安裝在 /opt目錄中,這樣不就知道了??

如果刪除,就刪除相應的軟體目錄;

有些軟體要在解壓安裝目錄中執行 make uninstall ,這樣就解除安裝掉了

9.linux下軟體的基本安裝和解除安裝

Linux軟體的安裝和解除安裝一直是困擾許多新使用者的難題。在Windows中,我們可以使用軟體自帶的安裝解除安裝程式或在控制面板中的“新增/刪除程式”來實現。與其相類似,在Linux下有一個功能強大的軟體安裝解除安裝工具,名為RPM。它可以用來建立、安裝、查詢、更新、解除安裝軟體。該工具是在命令列下使用的。在Shell的提示符後輸入rpm,就可獲得該命令的幫助資訊。

(1)軟體的安裝

Linux下軟體的安裝主要有兩種不同的形式。

第一種安裝檔名為xxx.tar.gz#原始碼包
另一種安裝檔名為xxx.i386.rpm#rpm二進位制包

rpm包就是已經編譯過的檔案打包了。原始碼包就是用c語言寫的程式碼,我們可以看到程式碼,可以自己更改。

以第一種方式發行的軟體多為以原始碼形式傳送的;第二種方式則是直接以二進位制形式傳送的。

對於第一種,安裝方法如下:

1 .首先,將安裝檔案拷貝至你的目錄中。例如,如果你是以root身份登入上的,就將軟體拷貝至/root中。

#cp xxx.tar.gz /root

2 .由於該檔案是被壓縮並打包的,應對其解壓縮。命令為:

#tar xvzf filename.tar.gz 如果是filename.tar.bz2格式的,應該是tar jxvf filename.tar.bz2來解壓

3.執行該命令後,安裝檔案按路徑,解壓縮在當前目錄下。用ls命令可以看到解壓縮後的檔案。通常在解壓縮後產生的檔案中,有“Install”的檔案。該檔案為純文字檔案,詳細講述了該軟體包的安裝方法

4.執行解壓縮後產生的一個名為configure的可執行指令碼程式。它是用於檢查系統是否有編譯時所需的庫,以及庫的版本是否滿足編譯的需要等安裝所需要的系統資訊。(是否有庫檔案並且庫檔案必須符合系統要求)為隨後的編譯工作做準備。
命令為: #./configure

如果您想把軟體安裝到指定目錄,應該用#./configure --prefix=/您自己指定的目錄,比如我想把一個mlterm安裝到/opt/mlterm目錄中,應該如下輸入

#./configure --prefix=/opt/mlterm

5.檢查通過後,將生成用於編譯的MakeFile檔案。此時,可以開始進行編譯了。編譯的過程視軟體的規模和計算機效能的不同,所耗費的時間也不同。

命令為: `#make`

6.成功編譯後,鍵入如下的命令開始安裝:

#make install

7.安裝完畢,應清除編譯過程中產生的臨時檔案和配置過程中產生的檔案。鍵入如下命令:

#make clean
#make distclean

至此,軟體的安裝結束。

總結:
./configure 配置軟體屬性,安裝目錄,檢查編譯所需的庫檔案是否存在(符合條件的)等,生成編譯所需要的makefile 檔案.

make生成 編譯軟體

make install 安裝軟體

make clean,make distclean 清除安裝過程中生成的臨時檔案和配置檔案

對於第二種,其安裝方法要簡單得多。

同第一種方式一樣,將安裝檔案拷貝至你的目錄中。然後使用rpm來安裝該檔案。命令如下:

#rpm -ivh filename.i386.rpm

rpm將自動將安裝檔案解包,並將軟體安裝到預設的目錄下。並將軟體的安裝資訊註冊到rpm的資料庫中。

引數i的作用是使rpm進入安裝模式。

(2)軟體的解除安裝

1.軟體的解除安裝主要是使用rpm來進行的。解除安裝軟體首先要知道軟體包在系統中註冊的名稱。鍵入命令:

#rpm -qa  #即可查詢到當前系統中安裝的所有的軟體包。

2.確定了要解除安裝的軟體的名稱,就可以開始實際解除安裝該軟體了。鍵入命令:

#rpm -e [package name]

即可解除安裝軟體。引數e的作用是使rpm進入解除安裝模式。對名為[package name]的軟體包進行解除安裝。由於系統中各個軟體包之間相互有依賴關係。如果因存在依賴關係而不能解除安裝,rpm將給予提示並停止解除安裝。你可以使用如下的命令來忽略依賴關係,直接開始解除安裝:

#rpm -e [package name] -nodeps 忽略了軟體包中的依賴關係

忽略依賴關係的解除安裝可能會導致系統中其它的一些軟體無法使用

如果想知道rpm包安裝到哪裡了呢?

#rpm -ql [package name] 顯示軟體套件的檔案列表