曾經說過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連結既可
錯字:
回覆刪除「前鎮子」
「為蛇麼」
另外,為甚麼旁邊是PCBSD的廣告?我只是有點好奇,沒別的意思:P
難得看到中文用戶這麼推廣Arch linux
回覆刪除推一下
推廣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)