2009-08-07

打造你自己的ArchLinux編譯環境

前陣子我寫過ArchLinux推廣安裝教學
曾經說過ArchLinux的無縫升級與快速更新等特點
現在我再來簡單介紹一下同樣也很吸引人的ABS



ABS既"Arch Build System",也就是Arch的編譯系統
跟FreeBSD還有Gentoo的ports一樣
ABS提供源碼讓我們可以在本地編譯安裝各種軟體
如此我們可以編譯出針對自己硬體最佳化的操作平台


那要怎麼用呢?
首先我們必須先安裝ABS
sudo pacman -S abs


安裝完我們先編輯abs.conf
sudo vi /etc/abs.conf


如果你有開testing,那你就把testing的禁用去掉
如果沒有就保持禁用,如下:
REPOS=(core extra community !testing)


安裝完後,我們必須取得"目錄樹"(ABS Tree)
sudo abs


然後ABS會將取得的PKGBUILD存放在/var/abs底下
目錄結構會按照源裡的分類,如testing、core、extra等


接下來就是要找到你想要編譯的套件了!
接著我們來安裝懶人工具,幫助你尋找你要的套件位置
sudo pacman -S pkgfile



裝完之後,假設我要來找Firefox的PKGBUILD
只需要在終端底下敲入:
[lawliet@Archi ~]$ pkgfile firefox
extra/firefox


它就會返回這樣的一個訊息
照著這個位置去找就可以取得firefox的PKGBUILD了
然後你就可以直接makepkg編譯打包了!



通常Arch內建的編譯參數都比較鬆
你可以根據自己的機器做些調整,獲得最大的性能
這裡先編輯/etc/makepkg.conf
sudo vi /etc/makepkg.conf


這個參數是我自己的,這裡僅供參考,使用AMD處理器的人應該略過!
其它處理器的參數查詢可以參照Arch Wiki,內有詳細的清單
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=core2 -O3 -msse -msse2 -msse3 -pipe -fomit-frame-pointer"
#CFLAGS="-march=core2 -O2 -pipe -fomit-frame-pointer"
#CFLAGS="-march=prescott -O3 -pipe -fomit-frame-pointer"
#CFLAGS="-march=prescott -O2 -pipe -fomit-frame-pointer"
#CFLAGS="-march=i686 -O3 -pipe -fomit-frame-pointer"
#CFLAGS="-march=i686 -O2 -pipe -fomit-frame-pointer"
CXXFLAGS="${CFLAGS}"
#LDFLAGS="-W1,O1,--as-need"


然後找到MAKEFLAGS="-j3"
這裡是使用的處理器核心數量
"通常都是核心數再+1"
如果你是雙核心那就是-j3
四核心就是-j5



再來如果你跟我一樣是重度編譯者,經常反覆編譯同一個套件
例如Firefox我一天大約需要編譯五到十次不等
其它這類需要經常編譯的東西例如git或svn這類每天或三天兩頭就一個版本的套件
我們可以使用Ccahe這個套件進行加速編譯的動作

Ccache,它可以把"再次編譯"的速度
提高五到十倍左右,也就是原本需要編譯兩個鐘頭的套件
使用Ccache後,再次編譯它最快只要12分鐘而已!
加速非常明顯,強烈建議經常需要編譯同一個套件的人使用,效果非常明顯!


安裝Ccache:
sudo pacman -S ccache


編輯makepkg.conf
sudo vi /etc/makepkg.conf


找到這段,並去掉禁用
BUILDENV=(fakeroot !distcc color !ccache !xdelta)



不管你是要二進制還是編譯
在ArchLinux進行這些動作都非常方便!

接下來稍微說一下gcc的編譯與版本切換
為什麼要切換gcc的版本呢?
因為有的時候我們可能會遇到gcc自己本身的問題
造成源碼編譯不過去,或者是源碼本身就不嚴謹
因為容錯過寬或太窄導致編譯到最後很容易會出現問題
所以一般經常編譯的人都會準備兩個版本以上的gcc

像我自己就經常在gcc 4.4.1跟gcc 4.5之間作切換
就我的編譯經驗,gcc 4.5或許不能比gcc 4.4.1提高多少性能
但gcc 4.5卻能把不少gcc 4.4.1編譯不過去的都編譯完成
不過gcc 4.5還在開發中,建議不要用它來編譯核心或是系統重要套件!

一般來說gcc應該保持穩定,同樣一份源碼的gcc用-O3跟-O2對結果會有很大的不同
我一開始以為用-O3可以加快不少編譯速度,事實上編譯速度確實是提高不少
但是編譯出來的東西幾乎不太能用,不穩定或根本無法執行!
後來自己重編穩定版本後才發現原來是參數的問題!

另外在本機編譯新版gcc通常需要編譯兩次
例如我用gcc 4.4編譯gcc 4.5,然後安裝gcc 4.5
再用gcc 4.5再編譯一次gcc 4.5,這樣子新版本的gcc才能發會自己的特性
而不會受限於舊版gcc所造成的特性無法發揮或不正常發揮等問題!



gcc版本切換方法:

查詢當前gcc版本
[lawliet@Arch]$ gcc -v
使用內建 specs。
目的:i686-pc-linux-gnu
配置為:../configure --prefix=/usr --enable-shared --enable-languages=c,c++,fortran,objc,obj-c++ --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info --enable-__cxa_atexit --disable-multilib --libdir=/usr/lib --libexecdir=/usr/lib --enable-clocale=gnu --disable-libstdcxx-pch --with-tune=generic
執行緒模型:posix
gcc version 4.4.1 (GCC)


我的做法通常會將目前gcc版本做個備分
cd /usr/bin


調出有gcc檔名的檔案
[lawliet@Arch bin]$ ls -l gcc*
lrwxrwxrwx 1 root root 13 2009-08-07 14:00 gcc -> gcc-4.4
-rwxr-xr-x 1 root root 209932 2009-07-03 04:44 gcc-4.4
-rwxr-xr-x 3 root root 212480 2009-08-06 20:02 gcc-4.5
-rwxr-xr-x 1 root root 16058 2009-07-24 10:26 gccbug
-rwxr-xr-x 1 root root 16141 2009-08-06 20:02 gccbug-4.5


備份當前gcc版本
sudo cp gcc gcc-bak


把gcc連結到新版gcc上
sudo ln -s gcc-4.5 gcc


檢查是否正確連結
[lawliet@Arch bin]$ gcc -v
使用內建 specs。
目的:i686-pc-linux-gnu
配置為:../configure --prefix=/usr --enable-shared --enable-languages=c,c++ --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info --enable-__cxa_atexit --disable-multilib --libdir=/usr/lib --libexecdir=/usr/lib --enable-clocale=gnu --disable-libstdcxx-pch --with-tune=generic --disable-werror --enable-checking=release --program-suffix=-4.5 --enable-version-specific-runtime-libs
執行緒模型:posix
gcc version 4.5.0 20090723 (experimental) (GCC)


之後如果需要換到其它版的gcc,一樣修改gcc連結既可

3 則留言:

  1. 錯字:
    「前鎮子」
    「為蛇麼」
    另外,為甚麼旁邊是PCBSD的廣告?我只是有點好奇,沒別的意思:P

    回覆刪除
  2. 難得看到中文用戶這麼推廣Arch linux

    推一下

    回覆刪除
  3. 推廣Archlinux的一篇好文章,大大真是有心人

    若真要調整編譯參數,建議新手參考http://www.gentoo.org/doc/en/gcc-optimization.xml
    其中有論及,若是使用gcc4.x版本,最好選擇-O2參數來編譯(In 3.x, -O3 has been shown to lead to marginally faster execution times over -O2, but this is no longer the case with gcc 4.x,......,Using -O3 is not recommended for gcc 4.x)

    回覆刪除