jinfeng_wang

          G-G-S,D-D-U!

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            400 Posts :: 0 Stories :: 296 Comments :: 0 Trackbacks
          http://lamp.linux.gov.cn/Linux/inside_config_compile_install.html


          深入理解軟件包的配置、編譯與安裝

          作者:金步國(guó)


          版權(quán)聲明

          本文作者是一位自由軟件愛(ài)好者,所以本文雖然不是軟件,但是本著 GPL 的精神發(fā)布。任何人都可以自由使用、轉(zhuǎn)載、復(fù)制和再分發(fā),但必須保留作者署名,亦不得對(duì)聲明中的任何條款作任何形式的修改,也不得附加任何其它條件。您可以自由鏈接、下載、傳播此文檔,但前提是必須保證全文完整轉(zhuǎn)載,包括完整的版權(quán)信息和作譯者聲明。

          其他作品

          本文作者十分愿意與他人共享勞動(dòng)成果,如果你對(duì)我的其他翻譯作品或者技術(shù)文章有興趣,可以在如下位置查看現(xiàn)有作品的列表:

          BUG報(bào)告,切磋與探討

          由于作者水平有限,因此不能保證作品內(nèi)容準(zhǔn)確無(wú)誤,請(qǐng)?jiān)陂喿x中自行鑒別。如果你發(fā)現(xiàn)了作品中的錯(cuò)誤,請(qǐng)您來(lái)信指出,哪怕是錯(cuò)別字也好,任何提高作品質(zhì)量的建議我都將虛心接納。如果你愿意就作品中的相關(guān)內(nèi)容與我進(jìn)行進(jìn)一步切磋與探討,也歡迎你與我聯(lián)系。聯(lián)系方式:MSN: csfrank122@hotmail.com


          前言

          從源代碼安裝過(guò)軟件的朋友一定對(duì) ./configure && make && make install 安裝三步曲非常熟悉了。然而究竟這個(gè)過(guò)程中的每一步幕后都發(fā)生了些什么呢?本文將帶領(lǐng)你一探究竟。深入理解這個(gè)過(guò)程將有助于你在LFS的基礎(chǔ)上玩出自己的花樣來(lái)。不過(guò)需要說(shuō)明的是本文對(duì) Makefile 和 make 的講解是相當(dāng)近視和粗淺的,但是對(duì)于理解安裝過(guò)程來(lái)說(shuō)足夠了。

          概述

          用一句話來(lái)解釋這個(gè)過(guò)程就是:

          根據(jù)源碼包中 Makefile.in 文件的指示,configure 腳本檢查當(dāng)前的系統(tǒng)環(huán)境和配置選項(xiàng),在當(dāng)前目錄中生成 Makefile 文件(還有其它本文無(wú)需關(guān)心的文件),然后 make 程序就按照當(dāng)前目錄中的 Makefile 文件的指示將源代碼編譯為二進(jìn)制文件,最后將這些二進(jìn)制文件移動(dòng)(即安裝)到指定的地方(仍然按照 Makefile 文件的指示)。

          由此可見(jiàn) Makefile 文件是幕后的核心。要深入理解安裝過(guò)程,必須首先對(duì) Makefile 文件有充分的了解。本文將首先講述 Makefile 與 make ,然后再講述 configure 腳本。并且在講述這兩部分內(nèi)容時(shí),提供了盡可能詳細(xì)的、可以運(yùn)用于實(shí)踐的參考資料。

          Makefile 與 make

          用一句話來(lái)概括Makefile 與 make 的關(guān)系就是:
          Makefile 包含了所有的規(guī)則和目標(biāo),而 make 則是為了完成目標(biāo)而去解釋 Makefile 規(guī)則的工具。

          make 語(yǔ)法

          首先看看 make 的命令行語(yǔ)法:

          make [options] [targets] [VAR=VALUE]...

          [options]是命令行選項(xiàng),可以用 make --help 命令查看全部,[VAR=VALUE]是在命令行上指定環(huán)境變量,這兩個(gè)大家都很熟悉,將在稍后詳細(xì)講解。而[targets]是什么呢?字面的意思是"目標(biāo)",也就是希望本次 make 命令所完成的任務(wù)。憑經(jīng)驗(yàn)猜測(cè),這個(gè)[targets]大概可以用"ckeck","install"之類(lèi)(也就是常見(jiàn)的測(cè)試和安裝命令)。但是它到底是個(gè)啥玩意兒?不帶任何"目標(biāo)"的 make 命令是什么意思?為什么在安裝 LFS 工具鏈中的 Perl-5.8.8 軟件包時(shí)會(huì)出現(xiàn)"make perl utilities"這樣怪異的命令?要回答這些問(wèn)題必須首先理解 Makefile 文件中的"規(guī)則"。

          Makefile 規(guī)則

          Makefile 規(guī)則包含了文件之間的依賴(lài)關(guān)系和更新此規(guī)則目標(biāo)所需要的命令。

          一個(gè)簡(jiǎn)單的 Makefile 規(guī)則是這樣寫(xiě)的:

          TARGET : PREREQUISITES
          COMMAND
          
          TARGET
          規(guī)則的目標(biāo)。也就是可以被 make 使用的"目標(biāo)"。有些目標(biāo)可以沒(méi)有依賴(lài)而只有動(dòng)作(命令行),比如"clean",通常僅僅定義一系列刪除中間文件的命令。同樣,有些目標(biāo)可以沒(méi)有動(dòng)作而只有依賴(lài),比如"all",通常僅僅用作"終極目標(biāo)"。
          PREREQUISITES
          規(guī)則的依賴(lài)。通常一個(gè)目標(biāo)依賴(lài)于一個(gè)或者多個(gè)文件。
          COMMAND
          規(guī)則的命令行。一個(gè)規(guī)則可以有零個(gè)或多個(gè)命令行。

          OK! 現(xiàn)在你明白[targets]是什么了,原來(lái)它們來(lái)自于 Makefile 文件中一條條規(guī)則的目標(biāo)(TARGET)。另外,Makefile文件中第一條規(guī)則的目標(biāo)被稱(chēng)為"終極目標(biāo)",也就是你省略[targets]參數(shù)時(shí)的目標(biāo)(通常為"all")。

          當(dāng)你查看一個(gè)實(shí)際的 Makefile 文件時(shí),你會(huì)發(fā)現(xiàn)有些規(guī)則非常復(fù)雜,但是它都符合規(guī)則的基本格式。此外,Makefile 文件中通常還包含了除規(guī)則以外的其它很多東西,不過(guò)本文只關(guān)心其中的變量。

          Makefile 變量

          Makefile 中的"變量"更像是 C 語(yǔ)言中的宏,代表一個(gè)文本字符串(變量的值),可以用于規(guī)則的任何部分。變量的定義很簡(jiǎn)單:VAR=VALUE;變量的引用也很簡(jiǎn)單:$(VAR) 或者 ${VAR}。變量引用的展開(kāi)過(guò)程是嚴(yán)格的文本替換過(guò)程,就是說(shuō)變量值的字符串被精確的展開(kāi)在變量被引用的地方。比如,若定義:VAR=c,那么,"$(VAR) $(VAR)-$(VAR) VAR.$(VAR)"將被展開(kāi)為"c c-c VAR.c"。

          雖然在 Makefile 中可以直接使用系統(tǒng)的環(huán)境變量,但是也可以通過(guò)在 Makefile 中定義同名變量來(lái)"遮蓋"系統(tǒng)的環(huán)境變量。另一方面,我們可以在調(diào)用 make 時(shí)使用 -e 參數(shù)強(qiáng)制使系統(tǒng)中的環(huán)境變量覆蓋 Makefile 中的同名變量,除此之外,在調(diào)用 make 的命令行上使用 VAR=VALUE 格式指定的環(huán)境變量也可以覆蓋 Makefile 中的同名變量。

          Makefile 實(shí)例

          下面看一個(gè)簡(jiǎn)單的、實(shí)際的Makefile文件:

          CC=gcc
          CPPFLAGS=
          CFLAGS=-O2 -pipe
          LDFLAGS=-s
          PREFIX=/usr
          all : prog1 prog2
          prog1 : prog1.o
          $(CC) $(LDFLAGS) -o prog1 prog1.o
          prog1.o : prog1.c
          $(CC) -c $(CFLAGS) prog1.c
          prog2 : prog2.o
          $(CC) $(CFLAGS) $(LDFLAGS) -o prog2 prog2.o
          prog2.o : prog2.c
          $(CC) -c $(CPPFLAGS) $(CFLAGS) prog2.c
          clean :
          rm -f *.{o,a} prog{1,2}
          install : prog1 prog2
          if ( test ! -d $(PREFIX)/bin ) ; then mkdir -p $(PREFIX)/bin ; fi
          cp -f prog1 $(PREFIX)/bin/prog1
          cp -f prog2 $(PREFIX)/bin/prog2
          check test : prog1 prog2
          prog1 < sample1.ref > sample1.rz
          prog1 < sample2.ref > sample3.rz
          cmp sample1.ok sample1.rz
          cmp sample2.ok sample2.rz
          

          從中可以看出,make 與 make all 以及 make prog1 prog2 三條命令其實(shí)是等價(jià)的。而常用的 make check 和 make install 也找到了歸屬。同時(shí)我們也看到了 Makefile 中的各種變量是如何影響編譯的。針對(duì)這個(gè)特定的 Makefile ,你甚至可以省略安裝三步曲中的 make 命令而直接使用 make install 進(jìn)行安裝。

          同樣,為了使用自定義的編譯參數(shù)編譯 prog2 ,我們可以使用 make prog2 CFLAGS="-O3 -march=athlon64" 或 CFLAGS="-O3 -march=athlon64" && make -e prog2 命令達(dá)到此目的。

          Makefile 慣例

          下面是Makefile中一些約定俗成的目標(biāo)名稱(chēng)及其含義:

          all
          編譯整個(gè)軟件包,但不重建任何文檔。一般此目標(biāo)作為默認(rèn)的終極目標(biāo)。此目標(biāo)一般對(duì)所有源程序的編譯和連接使用"-g"選項(xiàng),以使最終的可執(zhí)行程序中包含調(diào)試信息。可使用 strip 程序去掉這些調(diào)試符號(hào)。
          clean
          清除當(dāng)前目錄下在 make 過(guò)程中產(chǎn)生的文件。它不能刪除軟件包的配置文件,也不能刪除 build 時(shí)創(chuàng)建的那些文件。
          distclean
          類(lèi)似于"clean",但增加刪除當(dāng)前目錄下的的配置文件、build 過(guò)程產(chǎn)生的文件。
          info
          產(chǎn)生必要的 Info 文檔。
          check 或 test
          完成所有的自檢功能。在執(zhí)行檢查之前,應(yīng)確保所有程序已經(jīng)被創(chuàng)建(但可以尚未安裝)。為了進(jìn)行測(cè)試,需要實(shí)現(xiàn)在程序沒(méi)有安裝的情況下被執(zhí)行的測(cè)試命令。
          install
          完成程序的編譯并將最終的可執(zhí)行程序、庫(kù)文件等拷貝到指定的目錄。此種安裝一般不對(duì)可執(zhí)行程序進(jìn)行 strip 操作。
          install-strip
          和"install"類(lèi)似,但是會(huì)對(duì)復(fù)制到安裝目錄下的可執(zhí)行文件進(jìn)行 strip 操作。
          uninstall
          刪除所有由"install"安裝的文件。
          installcheck
          執(zhí)行安裝檢查。在執(zhí)行安裝檢查之前,需要確保所有程序已經(jīng)被創(chuàng)建并且被安裝。
          installdirs
          創(chuàng)建安裝目錄及其子目錄。它不能更改軟件的編譯目錄,而僅僅是創(chuàng)建程序的安裝目錄。

          下面是 Makefile 中一些約定俗成的變量名稱(chēng)及其含義:

          這些約定俗成的變量分為三類(lèi)。第一類(lèi)代表可執(zhí)行程序的名字,例如 CC 代表編譯器這個(gè)可執(zhí)行程序;第二類(lèi)代表程序使用的參數(shù)(多個(gè)參數(shù)使用空格分開(kāi)),例如 CFLAGS 代表編譯器執(zhí)行時(shí)使用的參數(shù)(一種怪異的做法是直接在 CC 中包含參數(shù));第三類(lèi)代表安裝目錄,例如 prefix 等等,含義簡(jiǎn)單,下面只列出它們的默認(rèn)值。

          AR   函數(shù)庫(kù)打包程序,可創(chuàng)建靜態(tài)庫(kù).a文檔。默認(rèn)是"ar"。
          AS   匯編程序。默認(rèn)是"as"。
          CC   C編譯程序。默認(rèn)是"cc"。
          CXX  C++編譯程序。默認(rèn)是"g++"。
          CPP  C/C++預(yù)處理器。默認(rèn)是"$(CC) -E"。
          FC   Fortran編譯器。默認(rèn)是"f77"。
          PC   Pascal語(yǔ)言編譯器。默認(rèn)是"pc"。
          YACC Yacc文法分析器。默認(rèn)是"yacc"。
          ARFLAGS     函數(shù)庫(kù)打包程序的命令行參數(shù)。默認(rèn)值是"rv"。
          ASFLAGS     匯編程序的命令行參數(shù)。
          CFLAGS      C編譯程序的命令行參數(shù)。
          CXXFLAGS    C++編譯程序的命令行參數(shù)。
          CPPFLAGS    C/C++預(yù)處理器的命令行參數(shù)。
          FFLAGS      Fortran編譯器的命令行參數(shù)。
          PFLAGS      Pascal編譯器的命令行參數(shù)。
          YFLAGS      Yacc文法分析器的命令行參數(shù)。
          LDFLAGS     鏈接器的命令行參數(shù)。
          prefix      /usr/local
          exec_prefix $(prefix)
          bindir      $(exec_prefix)/bin
          sbindir     $(exec_prefix)/sbin
          libexecdir  $(exec_prefix)/libexec
          datadir     $(prefix)/share
          sysconfdir  $(prefix)/etc
          sharedstatedir $(prefix)/com
          localstatedir  $(prefix)/var
          libdir      $(exec_prefix)/lib
          infodir     $(prefix)/info
          includedir  $(prefix)/include
          oldincludedir  $(prefix)/include
          mandir      $(prefix)/man
          srcdir      需要編譯的源文件所在的目錄,無(wú)默認(rèn)值
          

          make 選項(xiàng)

          最后說(shuō)說(shuō) make 的命令行選項(xiàng)(以Make-3.81版本為準(zhǔn)):

          -B, --always-make
          無(wú)條件的重建所有規(guī)則的目標(biāo),而不是根據(jù)規(guī)則的依賴(lài)關(guān)系決定是否重建某些目標(biāo)文件。
          -C DIR, --directory=DIR
          在做任何動(dòng)作之前先切換工作目錄到 DIR ,然后再執(zhí)行 make 程序。
          -d
          在 make 執(zhí)行過(guò)程中打印出所有的調(diào)試信息。包括:make 認(rèn)為那些文件需要重建;那些文件需要比較它們的最后修改時(shí)間、比較的結(jié)果;重建目標(biāo)所要執(zhí)行的命令;使用的隱含規(guī)則等。使用該選項(xiàng)我們可以看到 make 構(gòu)造依賴(lài)關(guān)系鏈、重建目標(biāo)過(guò)程的所有信息,它等效于"-debug=a"。
          --debug=FLAGS
          在 make 執(zhí)行過(guò)程中打印出調(diào)試信息。FLAGS 用于控制調(diào)試信息級(jí)別:
          a
          輸出所有類(lèi)型的調(diào)試信息
          b
          輸出基本調(diào)試信息。包括:那些目標(biāo)過(guò)期、是否重建成功過(guò)期目標(biāo)文件。
          v
          除 b 級(jí)別以外還包括:解析的 makefile 文件名,不需要重建文件等。
          i
          除 b 級(jí)別以外還包括:所有使用到的隱含規(guī)則描述。
          j
          輸出所有執(zhí)行命令的子進(jìn)程,包括命令執(zhí)行的 PID 等。
          m
          輸出 make 讀取、更新、執(zhí)行 makefile 的信息。
          -e, --environment-overrides
          使用系統(tǒng)環(huán)境變量的定義覆蓋 Makefile 中的同名變量定義。
          -f FILE, --file=FILE, --makefile=FILE
          將 FILE 指定為 Makefile 文件。
          -h, --help
          打印幫助信息。
          -i, --ignore-errors
          忽略規(guī)則命令執(zhí)行過(guò)程中的錯(cuò)誤。
          -I DIR, --include-dir=DIR
          指定包含 Makefile 文件的搜索目錄。使用多個(gè)"-I"指定目錄時(shí),搜索目錄按照指定順序進(jìn)行。
          -j [N], --jobs[=N]
          指定并行執(zhí)行的命令數(shù)目。在沒(méi)有指定"-j"參數(shù)的情況下,執(zhí)行的命令數(shù)目將是系統(tǒng)允許的最大可能數(shù)目。
          -k, --keep-going
          遇見(jiàn)命令執(zhí)行錯(cuò)誤時(shí)不終止 make 的執(zhí)行,也就是盡可能執(zhí)行所有的命令,直到出現(xiàn)致命錯(cuò)誤才終止。
          -l [N], --load-average[=N], --max-load[=N]
          如果系統(tǒng)負(fù)荷超過(guò) LOAD(浮點(diǎn)數(shù)),不再啟動(dòng)新任務(wù)。
          -L, --check-symlink-times
          同時(shí)考察符號(hào)連接的時(shí)間戳和它所指向的目標(biāo)文件的時(shí)間戳,以兩者中較晚的時(shí)間戳為準(zhǔn)。
          -n, --just-print, --dry-run, --recon
          只打印出所要執(zhí)行的命令,但并不實(shí)際執(zhí)行命令。
          -o FILE, --old-file=FILE, --assume-old=FILE
          即使相對(duì)于它的依賴(lài)已經(jīng)過(guò)期也不重建 FILE 文件;同時(shí)也不重建依賴(lài)于此文件任何文件。
          -p, --print-data-base
          命令執(zhí)行之前,打印出 make 讀取的 Makefile 的所有數(shù)據(jù)(包括規(guī)則和變量的值),同時(shí)打印出 make 的版本信息。如果只需要打印這些數(shù)據(jù)信息,可以使用 make -qp 命令。查看 make 執(zhí)行前的預(yù)設(shè)規(guī)則和變量,可使用命令 make -p -f /dev/null 。
          -q, --question
          "詢問(wèn)模式"。不運(yùn)行任何命令,并且無(wú)輸出,只是返回一個(gè)查詢狀態(tài)。返回狀態(tài)為 0 表示沒(méi)有目標(biāo)需要重建,1 表示存在需要重建的目標(biāo),2 表示有錯(cuò)誤發(fā)生。
          -r, --no-builtin-rules
          取消所有內(nèi)嵌的隱含規(guī)則,不過(guò)你可以在 Makefile 中使用模式規(guī)則來(lái)定義規(guī)則。同時(shí)還會(huì)取消所有支持后追規(guī)則的隱含后綴列表,同樣我們也可以在 Makefile 中使用".SUFFIXES"定義我們自己的后綴規(guī)則。此選項(xiàng)不會(huì)取消 make 內(nèi)嵌的隱含變量。
          -R, --no-builtin-variables
          取消 make 內(nèi)嵌的隱含變量,不過(guò)我們可以在 Makefile 中明確定義某些變量。注意,此選項(xiàng)同時(shí)打開(kāi)了"-r"選項(xiàng)。因?yàn)殡[含規(guī)則是以內(nèi)嵌的隱含變量為基礎(chǔ)的。
          -s, --silent, --quiet
          不顯示所執(zhí)行的命令。
          -S, --no-keep-going, --stop
          取消"-k"選項(xiàng)。在遞歸的 make 過(guò)程中子 make 通過(guò) MAKEFLAGS 變量繼承了上層的命令行選項(xiàng)。我們可以在子 make 中使用"-S"選項(xiàng)取消上層傳遞的"-k"選項(xiàng),或者取消系統(tǒng)環(huán)境變量 MAKEFLAGS 中的"-k"選項(xiàng)。
          -t, --touch
          更新所有目標(biāo)文件的時(shí)間戳到當(dāng)前系統(tǒng)時(shí)間。防止 make 對(duì)所有過(guò)時(shí)目標(biāo)文件的重建。
          -v, --version
          打印版本信息。
          -w, --print-directory
          在 make 進(jìn)入一個(gè)目錄之前打印工作目錄。使用"-C"選項(xiàng)時(shí)默認(rèn)打開(kāi)這個(gè)選項(xiàng)。
          --no-print-directory
          取消"-w"選項(xiàng)??梢允怯迷谶f歸的 make 調(diào)用過(guò)程中,取消"-C"參數(shù)將默認(rèn)打開(kāi)"-w"。
          -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE
          設(shè)定 FILE 文件的時(shí)間戳為當(dāng)前時(shí)間,但不改變文件實(shí)際的最后修改時(shí)間。此選項(xiàng)主要是為實(shí)現(xiàn)了對(duì)所有依賴(lài)于 FILE 文件的目標(biāo)的強(qiáng)制重建。
          --warn-undefined-variables
          在發(fā)現(xiàn) Makefile 中存在對(duì)未定義的變量進(jìn)行引用時(shí)給出告警信息。此功能可以幫助我們調(diào)試一個(gè)存在多級(jí)套嵌變量引用的復(fù)雜 Makefile 。但是:我們建議在書(shū)寫(xiě) Makefile 時(shí)盡量避免超過(guò)三級(jí)以上的變量套嵌引用。

          configure

          此階段的主要目的是生成 Makefile 文件,是最關(guān)鍵的運(yùn)籌帷幄階段,基本上所有可以對(duì)安裝過(guò)程進(jìn)行的個(gè)性化調(diào)整都集中在這一步。

          configure 腳本能夠?qū)?Makefile 中的哪些內(nèi)容產(chǎn)生影響呢?基本上可以這么說(shuō):所有內(nèi)容,包括本文最關(guān)心的 Makefile 規(guī)則與 Makefile 變量。那么又是哪些因素影響著最終生成的 Makefile 文件呢?答曰:系統(tǒng)環(huán)境和配置選項(xiàng)。

          配置選項(xiàng)的影響是顯而易見(jiàn)的。但是"系統(tǒng)環(huán)境"的概念卻很寬泛,包含很多方面內(nèi)容,不過(guò)我們這里只關(guān)心環(huán)境變量,具體說(shuō)來(lái)就是將來(lái)會(huì)在 Makefile 中使用到的環(huán)境變量以及與 Makefile 中的變量同名的環(huán)境變量。

          通用 configure 語(yǔ)法

          在進(jìn)一步講述之前,先看看 configure 腳本的語(yǔ)法,一般有兩種:

          configure [OPTIONS] [VAR=VALUE]...

          configure [OPTIONS] [HOST]

          不管是哪種語(yǔ)法,我們都可以用 configure --help 查看所有可用的[OPTIONS],并且通常在結(jié)尾部分還能看到這個(gè)腳本所關(guān)心的環(huán)境變量有哪些。在本文中將對(duì)這兩種語(yǔ)法進(jìn)行合并,使用下面這種簡(jiǎn)化的語(yǔ)法:

          configure [OPTIONS]

          這種語(yǔ)法能夠被所有的 configure 腳本所識(shí)別,同時(shí)也能通過(guò)設(shè)置環(huán)境變量和使用特定的[OPTIONS]完成上述兩種語(yǔ)法的一切功能。

          通用 configure 選項(xiàng)

          雖然每個(gè)軟件包的 configure 腳本千差萬(wàn)別,但是它們卻都有一些共同的選項(xiàng),也基本上都遵守相同的選項(xiàng)語(yǔ)法。

          腳本自身選項(xiàng)

          --help
          顯示幫助信息。
          --version
          顯示版本信息。
          --cache-file=FILE
          在FILE文件中緩存測(cè)試結(jié)果(默認(rèn)禁用)。
          --no-create
          configure腳本運(yùn)行結(jié)束后不輸出結(jié)果文件,常用于正式編譯前的測(cè)試。
          --quiet, --silent
          不顯示腳本工作期間輸出的"checking ..."消息。

          目錄選項(xiàng)

          --srcdir=DIR
          源代碼文件所在目錄,默認(rèn)為configure腳本所在目錄或其父目錄。
          --prefix=PREFIX
          體系無(wú)關(guān)文件的頂級(jí)安裝目錄PREFIX ,默認(rèn)值一般是 /usr/local 或 /usr/local/pkgName
          --exec-prefix=EPREFIX
          體系相關(guān)文件的頂級(jí)安裝目錄EPREFIX ,默認(rèn)值一般是 PREFIX
          --bindir=DIR
          用戶可執(zhí)行文件的存放目錄DIR ,默認(rèn)值一般是 EPREFIX/bin
          --sbindir=DIR
          系統(tǒng)管理員可執(zhí)行目錄DIR ,默認(rèn)值一般是 EPREFIX/sbin
          --libexecdir=DIR
          程序可執(zhí)行目錄DIR ,默認(rèn)值一般是 EPREFIX/libexec
          --datadir=DIR
          通用數(shù)據(jù)文件的安裝目錄DIR ,默認(rèn)值一般是 PREFIX/share
          --sysconfdir=DIR
          只讀的單一機(jī)器數(shù)據(jù)目錄DIR ,默認(rèn)值一般是 PREFIX/etc
          --sharedstatedir=DIR
          可寫(xiě)的體系無(wú)關(guān)數(shù)據(jù)目錄DIR ,默認(rèn)值一般是 PREFIX/com
          --localstatedir=DIR
          可寫(xiě)的單一機(jī)器數(shù)據(jù)目錄DIR ,默認(rèn)值一般是 PREFIX/var
          --libdir=DIR
          庫(kù)文件的安裝目錄DIR ,默認(rèn)值一般是 EPREFIX/lib
          --includedir=DIR
          C頭文件目錄DIR ,默認(rèn)值一般是 PREFIX/include
          --oldincludedir=DIR
          非gcc的C頭文件目錄DIR ,默認(rèn)值一般是 /usr/include
          --infodir=DIR
          Info文檔的安裝目錄DIR ,默認(rèn)值一般是 PREFIX/info
          --mandir=DIR
          Man文檔的安裝目錄DIR ,默認(rèn)值一般是 PREFIX/man

          體系結(jié)構(gòu)選項(xiàng)

          玩交叉編譯的朋友對(duì)這些選項(xiàng)已經(jīng)很熟悉了,對(duì)于不使用交叉編譯的朋友也不必?fù)?dān)心,不要理它們就可以了。

          --build=BUILD
          工具鏈當(dāng)前的運(yùn)行環(huán)境,默認(rèn)是 config.guess 腳本的輸出結(jié)果。
          --host=HOST
          編譯出的二進(jìn)制代碼將要運(yùn)行在HOST上,默認(rèn)值是BUILD。
          --target=TARGET
          編譯出的工具鏈所將來(lái)生成的二進(jìn)制代碼要在TARGET上運(yùn)行,這個(gè)選項(xiàng)僅對(duì)工具鏈(也就是GCC和Binutils兩者)有意義。

          特性選項(xiàng)

          --enable-FEATURE
          啟用FEATURE特性
          --disable-FEATURE
          禁用FEATURE特性
          --with-PACKAGE[=DIR]
          啟用附加軟件包PACKAGE,亦可同時(shí)指定PACKAGE所在目錄DIR
          --without-PACKAGE
          禁用附加軟件包PACKAGE

          通用環(huán)境變量

          除了上述通用的選項(xiàng)外,下列環(huán)境變量影響著最終生成的 Makefile 文件:

          CPP
          C預(yù)處理器命令
          CXXCPP
          C++預(yù)處理器命令
          CPPFLAGS
          C/C++預(yù)處理器命令行參數(shù)
          CC
          C編譯器命令
          CFLAGS
          C編譯器命令行參數(shù)
          CXX
          C++編譯器命令
          CXXFLAGS
          C++編譯器命令行參數(shù)
          LDFLAGS
          連接器命令行參數(shù)

          至于設(shè)置這些環(huán)境變量的方法,你可以將它們 export 為全局變量在全局范圍內(nèi)使用,也可以在命令行上使用 [VAR=VALUE]... configure [OPTIONS] 的語(yǔ)法局部使用。此處就不詳細(xì)描述了。


          看完上述內(nèi)容以后,不用多說(shuō)你應(yīng)當(dāng)自然而然的明白該進(jìn)行如何對(duì)自己的軟件包進(jìn)行定制安裝了。祝你好運(yùn)!


          補(bǔ)充讀物

          根據(jù)d00m3d的推薦,LinuxSir.Org上的另外兩篇帖子:《編譯的一點(diǎn)體會(huì)》《關(guān)于庫(kù)的深入思考》,可以作為本文的進(jìn)一步讀物,更加有助于深入理解本文的主題。另外建立在本文基礎(chǔ)上的《編譯優(yōu)化指南》專(zhuān)門(mén)針對(duì)與優(yōu)化相關(guān)的問(wèn)題進(jìn)行了探討。推薦閱讀。

          posted on 2009-05-17 21:59 jinfeng_wang 閱讀(302) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): ZZLinux
          主站蜘蛛池模板: 临澧县| 班戈县| 石狮市| 荔浦县| 信宜市| 孙吴县| 偏关县| 额尔古纳市| 青河县| 滦平县| 元谋县| 邛崃市| 赣州市| 扶沟县| 江山市| 惠水县| 上饶市| 九龙县| 庆安县| 治县。| 囊谦县| 上杭县| 青海省| 台北县| 休宁县| 许昌市| 金阳县| 兰州市| 延边| 巩留县| 英吉沙县| 通化市| 高邑县| 裕民县| 西安市| 望城县| 峨眉山市| 界首市| 永丰县| 大化| 府谷县|