![]() ![]() ![]() ![]() |
||
FreeBSD Ports System : Creating Ports作者:ijliao 本篇採用 CC 授權1. 前言上一期介紹了 FreeBSD Ports System 的用法,相信大家應該都用得很高興了吧 ? 不過用了一陣子以後應該就會開始想:"這麼方便的系統到底是怎麼組成的呢 ? 如果我看到有趣的程式,想介紹給其他 FreeBSD users 使用的話,是不是也可以利用這個 Ports System 呢 ?" 為了解答這個大家未來會碰到的問題,本專欄這一期就要教大家如何自製 port。 2. 開始動手做在開始之前,請先準備一套自己覺得有趣的程式 (記得先去查查看是不是已經被納進 Ports Collections 了) 以及相當大小的硬碟空間,接下來照著以下步驟進行: 2.1. 骨架有用過 port 的人都知道 port 最主要是由 Makefile 和相關的 pkg-* 還有一些其其他他的檔案所共同組成,做 port 就是把相關的資訊填到相對應的欄位裡面;為了簡單起見,我通常會隨便找一個 port 然後把它的檔案整組 copy 過來改:
# cp -R /usr/ports/misc/clex /tmp/clpbar
先改 Makefile 的部份,類似下面這樣: # ex:ts=8 # Ports collection makefile for: clpbar # Date created: Sep 3, 2004 # Whom: ijliao # # $FreeBSD$ # PORTNAME= clpbar PORTVERSION= 1.09 CATEGORIES= misc MASTER_SITES= ${MASTER_SITE_SOURCEFORGE} MASTER_SITE_SUBDIR= ${PORTNAME} DISTNAME= bar-${PORTVERSION} MAINTAINER= ports@FreeBSD.org COMMENT= Command Line Progress Bar .include <bsd.port.mk> 前面的註解部份要記得改,$FreeBSD$ 這個 tag 不要忘了;本文的部份呢,MASTER_SITES 指的是這個軟體檔案是存放在什麼目錄下面,可以用 http://.../path/ 或是 ftp://.../path/ 來指定,而至於我這邊用的是 ${MASTER_SITE_SOURCEFORGE},則是因為系統裡面已經設定好了許多存放軟體的大站台 (定義在 ports/Mk/bsd.sites.mk 裡),例如 sourceforge、GNU、CPAN 等等,要用的時候只要直接拿出來用,再配合上 MASTER_SITE_SUBDIR 指定正確的路徑就可以了 (如果在 MASTER_SITES 直接指定 URL 的話就不用填這個了);MAINTAINER 的地方就請填上您的 email address,這樣如果這個軟體出了問題的時候,其他人才知道要去哪裡連絡您;COMMENT 則是一小段本軟體的敘述,首字大寫,後面不加句點,全長不要超過 70 個字為佳。 接下來則是要改 pkg-descr,這個檔放的是軟體的詳細說明和 WWW (如果有的話): Bar is a simple tool to copy a stream of data and print a display for the user on stderr showing (a) the ammount of data passed, (b) the throughput of the data transfer, and (c) the transfer time, or, if the total size of the data stream is known, the estimated time remaining, what percentage of the data transfer has been completed, and a progress bar. WWW: http://clpbar.sourceforge.net/ 請記得在適當的地方換行,一行不要超過 80 個字。 2.2. 抓檔上面做的那些都是雜務,真正的挑戰現在才要開始,那就是要把檔案抓回來開始編譯和打包。抓檔的方法上一期已經說過了,make fetch 即可,但是這裡有一個小問題:make fetch 會把檔案塞到 /usr/ports/distfiles 裡面去,但是,如果您只是這台電腦的一個小使用者,就一定不可能有寫入權限,這該怎麼辦呢 ? 還֗好 ports system 已經有設想到這一點,只需要改變 DISTDIR 這個環境變數,指到有存取權限的目錄去即可 (例如 /tmp 之類)。當您在 make fetch 的時候,系統根據您 Makefile 裡面的設定,去抓 ${MASTER_SITES}${DISTNAME}${EXTRACT_SUFX} 這個檔案,其中 EXTRACT_SUFX 我們是用系統內定值 .tar.gz,DISTNAME 也有內定值 ${PORTNAME}-${PORTVERSION},但是在這裡並不合用,所以我們就自己設定啦。 為了確保大家抓到的檔案都是一致的,沒有被偷換掉也沒有被塞木馬,我們必需為這份程式做個紀錄,如果其他人抓到有問題的程式壓縮檔,當他在 make port 的時候系統就會警告他,以免他中了木馬而不自知。做紀錄的方法就是在 port 的目錄下面打 make makesum (一樣,請自行視狀況調整 DISTDIR 的值),然後就會生出一個叫 distinfo 的檔案,叫出來看看會長得像下面這個樣子: MD5 (bar-1.09.tar.gz) = 304adbc0754f28419dc442ba6856d138 SIZE (bar-1.09.tar.gz) = 135792 有了 md5 和 size 的資訊的話,理論上來看已經很難被偷改什麼東西了 (我知道最近密碼學界的大事就是 md5 被破了,但是其實和這裡沒什麼關係;它是找到了快速求得 collision 的方法沒錯,但是考慮這是一個 .tar.gz 檔,而且本質上是一個程式,而且又還有檔案大小的資訊,意思就是說就算真的讓有心人士找到 collision 好了,他也要確保大小一樣,又符合 gzip 和 tar 的格式,而且解出來以後還要是個可以 build 的程式,最重要的是這個程式還要有作怪的能力 !! 這應該是不太可能發生的事吧...)。 >> : Page 2 >>> |
|
|