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