Ports & Package
2024-07-26 00:29:18
供稿:網(wǎng)友
在 Windows 底下要安裝新的應(yīng)用程式時,通常就是執(zhí)行一下 SETUP.EXE
,選選安裝目錄,回答幾個簡單問題,然後 SETUP.EXE 就會幫你把該做
的事做好。但是在 UN*X 的世界里通常不是就不是這麼簡單了,除非你
買的是商業(yè)軟體,不然一般你拿到的會是一包一包的 source code,而
不是現(xiàn)成弄好的可執(zhí)行檔。
在 Windows 的世界里,一方面因為應(yīng)用程式是一個個的商品,為了商品
的利益,廠商不可能把形同命脈的 source code 丟出來給你;另一方面
也因為 Windows 就只在 Intel 系列的平臺上面執(zhí)行(當(dāng)做沒有 NT 可
以在 Alpha 上面跑這一回事存在 :P ),它就不需要考慮編成 binary
後在不同平臺上面的適應(yīng)性。反觀 UN*X 的世界,UN*X 是架構(gòu)在各式各
樣不同的平臺上面,你絕對沒辦法用同一套 binary 吃遍所有的系統(tǒng)。
而且在 UN*X 世界中,許多程式的作者并不把能從他寫的程式獲得多少
利益擺在最重要的位置,而是希望他所寫的程式能讓更多的人受惠,并
希望他的程式能變好,所以他們會把 source code 放出來,大家一
起來集思廣益,讓程式更好。
在 UN*X 下的程式,一般都是用 C 語言來寫的。雖然 C 語言有它的標(biāo)
準(zhǔn),而且本身已經(jīng)有很好的可攜性,但是在不同的 UN*X 系統(tǒng)下,卻還
是會有 "大同小異" 的問題存在。雖然整個程式的大體架構(gòu)、語法大致
相同,但是不同的系統(tǒng)間還是有些小小的差異,比如說 head file 的不
同啦、資料型態(tài)資料大小的不同啦、系統(tǒng)目錄結(jié)構(gòu)的不同啦....etc。因
為這些大同小異,所以即使你在一個系統(tǒng)上面寫的程式能在這個系統(tǒng)上
面正常的 compile,正確的執(zhí)行,但是拿到另一個系統(tǒng)上面卻未必行得
通,通常必需視不同的系統(tǒng)做不同的修改。這種把 A 系統(tǒng)上面可以正常
運作的程式,弄成在 B 系統(tǒng)上面也能正常運作的工作,就稱為 "PORT"
。
簡單的 PORT 可能改改目錄位置,加上幾個 #ifdef 之類的東東就可以
解決了,但是有時候如果遇到像是程式和系統(tǒng)的關(guān)連太深、程式用到一
些 A 系統(tǒng)內(nèi)部提供但 B 系統(tǒng)卻沒有的功能時,那 PORT 的工作就不是
那麼簡單了。但是,如果你選用了 FreeBSD,那就只有一句話:啊~福
氣啦!在 FreeBSD coreteam 有系統(tǒng)的整理之下,目前 FreeBSD 已經(jīng)有
超過二千種各式各樣應(yīng)用程式的 ports,使用這些 ports,你不需要自
己再去看 source 改 code,所有需要修改的部份都已經(jīng)有人代勞,幫你
改得好好的,你所需要做的事情非常的簡單:make install。是的,就
是這麼一道指令,一切 OK。
因為目前 FreeBSD 只能在 Intel 系列的系統(tǒng)上跑,所以如果你覺得用
ports 還要自己 compile 很麻煩,F(xiàn)reeBSD 提供你另一項選擇:package
。所謂的 package 就是有人幫你把程式都 compile 成 binary 了,并
把這些 binary 及一些相關(guān)的文件、檔案壓成一個 *.tgz 檔,你只需要
直接用 pkg_add 就可以進(jìn)行安裝,把這些 binary 放進(jìn)系統(tǒng)里面,直接
就可以使用了,方便省事。不過一般如果可以的話還是比較建議使用
ports 來安裝。
package 就是別人幫你 compile 好的 ports,而 ports 就是要自己從
source code 來 compile 出 binary,但是已經(jīng)有人把該修改的東東修
改好了,你無需再煩心如何讓這個程式能在 FreeBSD 上正常的 compile
正常的運作。一般的 ports/package 都會把東東放到 /usr/local 目錄
下面,執(zhí)行檔就放到 /usr/local/bin,設(shè)定資料放在 /usr/local/etc
,library 放在 /usr/local/lib,manual 放在 /usr/local/man。
package 是一個一個的 tgz 檔,你可以在
ftp://freebsd.csie.nctu.edu.tw/pub/packages-* 目錄下面找到所有
的 package,如果你用的是 FreeBSD 2.2*,就找 packages-2.2,若是
3.0*,則是 packages-3.0。packages-* 目錄下面還把各種 packages
依照功能等特性分類,讓你可以更方便的找到你所要的東東。在這里就
拿 audio/amp-0.7.6.tgz 來說,用 tar -tvzf amp-0.7.6.tgz 可以看
到它的內(nèi)容如下:
-rw-r--r-- root/bin 181 Nov 6 17:54 1997 +CONTENTS
-rw-r--r-- root/bin 19 Nov 6 17:54 1997 +COMMENT
-rw-r--r-- root/bin 514 Nov 6 17:54 1997 +DESC
-rw-r--r-- root/wheel 4358 Nov 6 09:14 1997 +MTREE_DIRS
-r-xr-xr-x bin/bin 94208 Nov 6 17:53 1997 bin/amp
-r--r--r-- bin/bin 853 Nov 6 17:53 1997 man/man1/amp.1.gz
其中 +COMMENT 這個檔案簡單介紹一下這個 package,而 +DESC 里面則
是較詳細(xì)的介紹或是一些注意事項等。+CONTENTS 里面則是列出了這個
package 里面有哪些檔案,它們會被安裝到哪里去。你用 pkg_add 來安
裝或是用 pkg_delete 來反安裝 package 時會參考到這些資料。
+MTREE_DIRS 里面放的是要丟給 mtree 的資料,用來設(shè)定檔案目錄的權(quán)
限等等的。接下來有幾個目錄、檔案。這些目錄都是相對於 /usr/local
的,也就是說這里面的 bin/amp 到時候會安裝到 /usr/local/bin/amp
之下。和 package 相關(guān)的幾個指令詳述如下:
pkg_info:用來查看這個 package 是什麼。它會把 package 里面的
+COMMENT 和 +DESC 抓出來,解說一下這個 package 的功能等資料。
pkg_add:用來安裝 package。它會按照 package 里面的設(shè)定,把各個
檔案拷到正確的位置,然後在 /var/db/pkg 下面造出該 package 的目
錄,把 +CONTENTS +COMMENT +DESC 等檔案拷過去。以前面的 amp 來說
,使用 pkg_add amp-0.7.6.tgz 會建立并把這三個檔案拷到
/var/db/pkg/amp-0.7.6 目錄下去。
pkg_delete:用來反安裝 package。它會到 /var/db/pkg/[package] 目
錄下面找出這個 package 安裝了哪些東東,把它們通通移除,最後會把
/var/db/pkg/[package] 目錄也移除。比如說要反安裝前面安裝過的
amp,直接執(zhí)行 pkg_delete amp-0.7.6 即可。
如果你凡事都喜歡自己來事必親躬,那麼你可以自己從 ports 里面做
compile,如果你看得懂 source,還可以自己改改 code,做做 tuning
,量身訂做弄出一個最適合自己的專用程式來。這種一手掌控的快感,
是你用 Windows 系統(tǒng)時所無法享受到的。ports 主要分為兩部份,一部
份就是原始的 source code,這些 source 大部份都放在
ftp://freebsd.csie.nctu.edu.tw/pub/distfiles 里面。另一部份則是
這個 ports 如果要在 FreeBSD 下面編譯、執(zhí)行的話所需要的修改及擺
放的位置等設(shè)定,這一部份主要是放在
ftp://freebsd.csie.nctu.edu.tw/pub/ports-* 目錄下面。這個目錄和
package 一樣,也是依照不同的應(yīng)用特性來做分類。還是拿 amp 來說,
在 audio/amp 目錄下面,你可以看到:
drwxr-xr-x 2 UPLOAD UPLOAD 512 Oct 9 00:24 CVS
-rw-r--r-- 1 UPLOAD UPLOAD 528 Sep 3 08:35 Makefile
drwxr-xr-x 3 UPLOAD UPLOAD 512 Oct 9 00:24 files
drwxr-xr-x 3 UPLOAD UPLOAD 512 Oct 9 00:24 patches
drwxr-xr-x 3 UPLOAD UPLOAD 512 Oct 9 00:24 pkg
Makefile 指定了這個 ports 該如何編譯、source code 要去哪里抓、
需要先安裝哪些其它相關(guān)的 ports、如何 instal.... 等等的訊息。
files 目錄下一般是放 source code 的 md5 checksum,以免抓到錯誤
的 source code 包裹。patches 里面放的是這個 ports 如果要改用到
FreeBSD 下面所需要做的修改。pkg 目錄下面是這個 ports 的相關(guān)資料
,和 package 里面那些 +CONTENTS +COMMENT +DESC 有相同的功效。如
果你要使用 ports,必需把該目錄下的所有東東(嗯,其實 CVS 都沒用
到)照原來的目錄結(jié)構(gòu)整個抓下來,如果你是用 ncftp,就用 get -R
來抓。一般抓下來的 ports 應(yīng)該是放在 /usr/ports/ 下的對應(yīng)目錄下
,如 amp 就應(yīng)該放在 /usr/ports/audio/amp/ 下,但是并沒有硬性規(guī)
定就是了。
整個目錄抓下來後,再來就是要執(zhí)行 make 了。在 ports 下 make 有幾
種不同的參數(shù),這些參數(shù)在 /usr/share/mk/bsd.port.mk 里面都有詳細(xì)
的解說。當(dāng)你直接打 make 時,其實就是按照 fetch(抓回 source) ->
extract(檢查 source 的 md5 并解開 source) -> patch(對 source 做
patch) -> configure(設(shè)定) -> build(編譯) 這樣一路做下來,把整個
ports 編譯好,而要等到你指定了 make install 後才會真的把這個
ports 安裝到系統(tǒng)上去。最後安裝完後可以再 make clean,把解開的
source 等東東清除掉。
在 make fetch 時,系統(tǒng)會依照下列順序來尋找需要的 source:
1. /usr/ports/distfiles 下
2. /etc/make.conf 檔中指定的 MASTER_SITE_BACKUP
3. Makefile 里指定的 MASTER_SITES
/etc/make.conf 內(nèi)定是到 FreeBSD 總部去抓,不過其實一般這些
source 都可以在 ftp://freebsd.csie.nctu.edu.tw/pub/distfiles 目
錄下面抓到,所以你可以把 MASTER_SITE_BACKUP 改成:
MASTER_SITE_BACKUP?= /
ftp://freebsd.csie.nctu.edu.tw/pub/distfiles/${DIST_SUBDIR}/
節(jié)省到國外抓檔的頻寬。當(dāng) make extract 後,會把 source 解開到
working 目錄下去。如果你想自己改一改 source,可以在 make patch
之後到 working 目錄下去修改。然後 make configure 和 make build
時我們大概也沒什麼事好做了,就看電腦螢?zāi)簧系淖忠恍行械南蛏希?
簡單一點的 ports 可能你做十下伏地挺身它就能 make 好,大一點的可
能就你出去跟人聊天串門子回來後它還在跑。
有時候呢,ports A 會和 ports B 發(fā)生關(guān),在安裝 ports A 時系統(tǒng)
會去找 ports B,如果找到會先裝好 ports B 再回頭來裝 ports A,但
是如果找不到 ports B 時就會給你一個警告,你就需要再去抓 ports B
回來安裝。但是這樣缺啥補(bǔ)啥也是滿麻煩的,即然用了 FreeBSD 就要善
用 FreeBSD 提供的好用功能 -- CTM。首先,/usr/ports 下最好有
50Mb 左右的硬碟空間,然後到
ftp://freebsd.csie.nctu.edu.tw/pub/CTM/ports-cur 下面抓回
ports-cur.????xEmpty.gz(找一個數(shù)字最大的 ???? 抓)以及所有
* > ???? 的 ports-cur.*.gz,比如說你抓了 ports-cur.2000xEmpty.gz
,那就要把 ports-cur.2001.gz, ports-cur.2002.gz.... 通通抓回來
。如果你抓回來的 gz 檔都放在 /tmp/ctm 下,就使用以下指令:
cd /usr/ports
/bin/rm -rf *
ctm -v /tmp/ctm/*
這樣就會把全部的 ports 通通收在你的系統(tǒng)上,以後安裝時就不需要再
擔(dān)心缺東少西的問題了。而且之後如果 ports 又有更新,也只需要抓回
新的 gz 檔,用 ctm 來更新即可,方便又省事。