autoconf 原始碼編譯 ./configure
本篇主要講已經存在一個autoconf 管理的原始碼,怎麼將其編譯成功
AUTOCONF和AUTOMAKE
- AUTOCONF和AUTOMAKE是非常有用的用來發布C程式的東西.AUTOCONF產生AUTOMAKE
- 典型的程式安裝步驟要用到GNU的AUTOCONF和AUTOMAKE
編譯流程
1/
閱讀 README 或者 INSTALL
2/
./configure //一般後面要加很長的引數
3/
make
1/閱讀README或者INSTALL
一般這樣的檔案裡面都有些怎麼編譯及安裝
2/執行configure指令碼
不要想當然的從網上的教程找來一條執行命令,出錯了,說沒有選項,不知道怎麼辦 去 執行 ./configure -h 檢視支援的選項
指定引數,執行configure指令碼
效果:產生各個資料夾下的Makefile及其他檔案
通過執行的時候加一些選項來生成與預設配置不同的Makefile,一般目的是為了裁剪軟體,因為軟體太大,或者某些功能我們不需要,所以可以通過加一些選項來禁止掉我們不需要的功能
configure指令碼
configure指令碼位於待安裝程式原始碼根目錄下面
configure指令碼是用來檢測你的安裝平臺的目標特徵的.它會對你的系統做很多的測試,以用來檢測出你的安裝平臺的目標特徵,比如它會檢測你是不是有CC或GCC
configure指令碼有大量的命令列選項,對不同的軟體包來說,這些選項可能會有變化,但是許多基本的選項是不會改變的.
使用’./configure –help’命令就可以看到可用的所有選項,儘管許多選項是很少用到的,但是當你為了特殊的需求而配置一個包時,這些選項是必不可少的.
configure: POSIX shell script, ASCII text executable, with very long lines
-rwxr-xr-x 1 root root 730195 2月 5 2004 configure *
Usage: ./configure [OPTION]… [VAR=VALUE]…不是所有的原始碼裡面都有configure檔案,有些原始碼包裡面沒有configure,但是有直接寫好的Makefile
引數
1.1配置區【Configuration】
這塊內容主要是對./configure指令碼本身執行的過程進行配置,如是否顯示執行結果給使用者,是否建立cache檔案啊。很少配置
--cache-file=FILE
'configure'會在你的系統上測試存在的特性(或者bug!),為了加速隨後進行的配置,測試的結果會儲存在一個cache file裡,尤其當configure一個複雜的原始碼樹時,一個很好的cache file的存在會對效能有很大幫助。
--no-create
'configure' 中的一個主要函式會製作輸出檔案(./Makefile),此選項阻止'configure'生成這個檔案,你可以認為這是一種演習(dry run),儘管快取(cache)仍然被改寫了。
1.2程式安裝目錄區【Installation directories】
configure指令碼中經常被配置的選項區,這裡的主要作用就是配置你要安裝的軟體的安裝後的目錄,預設情況下(使用者沒有主動配置),./configure會將軟體安裝在/usr/local/bin/和/usr/local/lib/等目錄下面。
//如果你想指定你安裝的程式的具體目錄,就用這2個選項,他們之間的區別就只有是否平臺相關性。通過指定這2個選項後,你的程式就完全的被安裝在你指定的目錄下面了,此時以後刪除該程式,只需要簡單的移除該目錄下所有內容就可以了。
--prefix=PREFIX install architecture-independent files in PREFIX [/usr/local]
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX]
//你想進一步指定軟體安裝後的具體目錄(如可執行檔案的目錄,共享庫的目錄等),你可以使用如下選項來配置.(只舉3個例子)
--bindir=DIR user executables [EPREFIX/bin]
--libdir=DIR object code libraries [EPREFIX/lib]
--includedir=DIR C header files [PREFIX/include]
1.3程式名稱區【Program names】
如果你想改變安裝後程序的名稱,如你安裝qq程式,但是你不想稱呼它為“qq“,而想叫它為“360”,那麼可以通過下面這些選項來配置了。
--program-prefix=PREFIX prepend PREFIX to installed program names
--program-suffix=SUFFIX append SUFFIX to installed program names
--program-transform-name=PROGRAM run sed PROGRAM on installed program names
1.4系統型別區【System types】
一個程式開發完成以後,對原始碼進行編譯,將編譯後的檔案釋出出去形成所謂的各個平臺的安裝版本(非開源的都是這麼幹的,開源的也可以這樣編譯後不同執行平臺的編譯版本),這就是所謂的交叉編譯。下面介紹有關這平臺相關性的選項。
//通過--build選項來指定執行程式碼編譯工作的主機,通常該值預設是cofig.guess(該shell指令碼和./configure在同一目錄)來猜即可(一般就是你執行編譯操作的主機),當然你也可以通過這個選項指定具體的值。
--build=BUILD configure for building on BUILD [guessed]
//編譯的程式在什麼機器上執行是由--host選項指定的,其預設值都是--build,當兩者不一樣的時候就是所謂的交叉編譯。--host=arm-linux arm平臺 --host=arm-none-linux-gnueabi 什麼?
--host=HOST cross-compile to build programs to run on HOST [BUILD]
//--target選項用來配置編譯工具,它只有在建立交叉編譯環境的時候用到,正常編譯和交叉編譯都不會用到。他用--build主機上的編譯器,編譯一個新的編譯器(binutils, gcc,gdb等),這個新的編譯器將來編譯出來的其他程式將執行在target指定的系統上。如果沒有指定,預設將使用’–host’選項的值.
--target=TARGET configure for building compilers for TARGET [HOST]
1.5可選特性區【Optional Features】
當你想在./configure時使用某個特性的時候,可以來配置該區塊中的選項值,它主要分為disable和enable兩大類
//當你想禁用某個FEATURE的時候可以使用它(尤其是某些軟體可能預設開啟某些特性,而實際上你是不需要的),例如:--disable-gui --disable-shared
--disable-FEATURE
//當你想禁用某個FEATURE的時候可以使用它(尤其是某些軟體可能預設開啟某些特性,而實際上你是不需要的),例如:$ ./configure --disable-gui
//`--enable-FEATURE=no'與上面提到的'--disable-FEATURE'是同義的
//一些軟體包可能提供了一些預設被禁止的特性,這時你可以使用“--enable-FEATURE“來起用它,一個特性可能會接受一個可選的引數值。例如:--enable-buffers=128 --enable-shared[=PKGS] build shared libraries [default=yes]
-enable-FEATURE[=ARGUMENT]
1.6可選安裝包區【Optional Packages】
軟體的包安裝的時候,可能會存在依賴。加上a軟體依賴於b軟體,那麼在安裝a軟體的時候,必須要先安裝b軟體,而此時b軟體偏偏不在系統的預設查詢目錄(即系統無法查詢到,或者你不想使用系統預設的b軟體而想使用你自己安裝的b軟體(整個系統有2個b軟體)),你就可用通過with選項來指定具體的軟體包地址,通過without選項來指定不使用指定的軟體包。
//通過without選項來指定不使用指定的軟體包。--without-gnu-ld
--without-PACKAGE
//'--with-PACKAGE=no'與將提到的'--without-PACKAGE'是同義的.
--with-PACKAGE[=ARGUMENT]
1.7影響安裝的環境變數區【Some influential environment variables】
這塊主要是影響編譯器的編譯環境變數。
//指明交叉編譯器的路徑 CC=/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-gcc
CC C compiler command
1.8其他資訊
3/make
在執行configure指令碼之後,已經產生了 makefile,直接make就可以了.
- 效果:根據Makefile編譯原始碼,連線,生成目標檔案,可執行檔案。
- 目標為all,因為all是第一個目標,所以make 和make all 一個效果
- make 工具一般是修改當前目錄,及當前目錄下的目錄,所以不用加sudo,如果有許可權問題,則可以用chown 命令 修改當前目錄的所屬使用者
- 某些原始碼裡面make 會產生時間戳,所以make 會產生一些.h檔案,以至於 make -n 會報錯
else
但是往往不是一番風順,可能會遇到各種各樣的問題.
1/
可能需要的依賴包沒安裝
2/
可能編譯器版本和原始碼不適配
3/
makefile 的tab 問題
4/
原始碼需要修改
- 這個步驟在某些原始碼移植中是不用的,因為我們可以用./configure 加一些選項生成可以被make直接解析的Makefile,但有時候我們修改Makefile是為了修改編譯器並適配編譯器的選項,因為部分configure沒有適配編譯器
- 某些make 編譯的時候需要設定環境變數,我還沒有遇到過這種情況
- 如果修改的話
```c
/*針對arm平臺*/
CC=/home/linux/gcc-4.6.4/bin/arm-none-linux-gnueabi-gcc
LDSHARED=/home/linux/gcc-4.6.4/bin/arm-none-linux-gnueabi-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map
CPP=/home/linux/gcc-4.6.4/bin/arm-none-linux-gnueabi-gcc -E
AR=/home/linux/gcc-4.6.4/bin/arm-none-linux-gnueabi-ar rc
RANLIB=/home/linux/gcc-4.6.4/bin/arm-none-linux-gnueabi-ranlib
/*適配編譯器*/
刪除Makefile中的-fforce-mem,因為arm-none-linux-gnueabi-gcc不支援該引數
/*針對其他平臺*/
大概也是這些東西,具體問題,具體分析.
這些東西是需要搜尋的,都是探索著一部一部做出來的
注意:一定要完善路徑
```
## make clean 與 make distclean
make clean:清除編譯產生的可執行檔案及目標檔案(object file,*.o)
make distclean:除了清除可執行檔案和目標檔案外,把configure所產生的Makefile也清除掉。
---
## Makefile中的其他目標
#### make dist
#### 將程式和相關的檔案包裝成一個壓縮檔案以供釋出。執行完在目錄下會產生一個以PACKAGE-VERSION.tar.gz為名稱的檔案。 PACKAGE和VERSION這兩個變數是根據configure.in檔案中AM_INIT_AUTOMAKE(PACKAGE,VERSION)的定義。在此範例中會產生test-1.0.tar.gz的檔案。
#### make distcheck
和makedist類似,但是加入檢查包裝後的壓縮檔案是否正常。這個目標除了把程式和相關檔案包裝成tar.gz檔案外,還會自動把這個壓縮檔案解開,執行 configure,並且進行make all 的動作,確認編譯無誤後,會顯示這個tar.gz檔案可供釋出了。這個檢查非常有用,檢查過關的包,基本上可以給任何一個具備GNU開發環境的人去重新編譯。
##注意
1. 一定要確保上一步完成之後才能做下一步
2. 出問題去找度娘
3. 有時候移植一個原始碼需要另一些原始碼生成的.h和動態連結檔案
4. 不同的configure 有不同的配置選項,雖然意思一樣,但是表現形式不同
5. make之後,再次make前最好執行make clean .不clean,就不會清除上次編譯結果。再make,也許會將上次的結果link進來。當然,makefile寫的好也許不會。clean一下更保險。
---
## 關於解除安裝
####很多source的Makefile都有寫uninstall目標,直接在Souce裡make uninstall(make install & make clean)就可行.
####如果作者沒寫,那就要一句一句看Makefile裡install部分都改了哪些東西,然後再改回來.
####如果source沒了,那你就不用搞了,呵呵噠.
---
## make產生的錯誤
1. cc1: error: unrecognized command line option '-fforce-mem'
make[2]: *** [version.lo] Error 1
make[2]: Leaving directory `/home/linux/project/source/libmad-0.15.1b'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/linux/project/source/libmad-0.15.1b'
make: *** [all] Error 2
Makefile:2: * * * missing separator. Stop.
Makefile:2: * * * missing separator. Stop.
makefile中的tab的長度導致的,在makefile中的命令需要以tab鍵開始,在.vimrc檔案中發現沒有設定tab鍵的預設長度,然後在.vimrc中新增配置 set tabstop=4
關於網上一些原始碼編譯教程的問題
- 如果想省事,請一定要遵循別人的教程做,教程說下哪個版本的原始碼,你就下哪個版本的原始碼,你就下哪個版本的原始碼,你就下哪個版本的原始碼.
- 如果按照教程搞不定,要不就是你的步驟問題,要不就是教程的問題,要不就是你的環境的問題.