Chapter 4 Slow Porting

Table of Contents
4.1 How things work
4.2 取得原始的 source 檔
4.3 量身打造 port
4.4 Patching
4.5 設定
4.6 處理使用者輸入

Ok...事實上並不太可能這麼簡單,port 方面可能需要作些修改才能正常使用。 因此, 本節將一步一步來介紹如何修改上一章的樣本以正常使用。

4.1 How things work

首先,先介紹一下在你所作的 port 目錄內打 make 時,所會作哪些事情的順序吧。 你可以另開一窗來看 bsd.port.mk 內容,以便瞭解我們下面在講什麼。

但別太擔心是否完全看懂 bsd.port.mk 在做啥,很多人都還沒完全看完... :->

  1. 首先,進行 fetch 階段。 fetch 是確認 tarball 檔有沒有已在 DISTDIR 內了?若 fetchDISTDIR 找不到的話,它會搜尋 Makefile 內的 MASTER_SITES URL ,或者是主 FTP 站專門放備份 distfiles 的目錄 ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ 。 假設都找不到的話,但是網路有接上 Internet 的話,它會試著用 FETCH 來抓所指定的檔案。 抓到之後,它會把檔案存到 DISTDIR 以便開始使用或日後運用。

  2. 其次,進行 extract 階段,它會從 DISTDIR 內找出該 port 所需的檔案(通常是 gzip 格式的 tarball),然後解壓縮到 WRKDIR 所設定的臨時目錄名稱(預設是 work 目錄)內 。

  3. 之後,進行 patch 階段, 一開始會先套用 PATCHFILES 所指定的任何 patch 檔。 接著是 PATCHDIR(預設是 files 子目錄) 內的檔名為 patch-* 之類的檔案,會以字母順序而逐一套用 patch。

  4. 接著是 configure 階段,可以照 port 的類型來作各種不同設定以調整,比如:

    1. 若有放 scripts/configure 的話, 那麼就會跑裡面的設定。

    2. 若有設 HAS_CONFIGURE 或是 GNU_CONFIGURE 的話,那麼就會跑 WRKSRC/configure

    3. 若有設 USE_IMAKE 的話,那麼就會跑 XMKMF (預設是 xmkmf -a) 。

  5. 最後是 build 階段,它會在該 port 的 working directory(由 WRKSRC 所設定) 內開始編譯。 若有設 USE_GMAKE 的話, 那麼就會改用 GNU make 來編譯, 否則就用系統本身的 make 來編譯。

上面講的都是打 make 時的預設階段。 此外,還可以設定各階段之前、之後要作的事情:透過定義 pre-somethingpost-something, 或者把這些檔名的 script 丟到 scripts 子目錄去, 這樣子它們就會在各預設階段的之前、之後進行囉。

舉例來說,若在 Makefile 內設定 post-extract,而且在 scripts 子目錄內又有 pre-build 檔的話,那麼在作解壓縮之後,就會開始 post-extract 階段以進行解壓縮後的後續動作, 而在跑 build 階段之前,就會先執行 pre-build 這隻 script 作先期準備。 通常較簡單的修改動作,建議直接放在 Makefile 內就好了, 因為這樣會比較方便加上這些原本沒有的階段,同時也方便他人協助除錯 。

預設的各階段動作都是照 bsd.port.mk 內的 do-something 之類所定義的。 舉例:do-extract 就是定義怎麼把檔案解壓縮的。 若對預設方式覺得不妥的話,都可以在該 port 的 Makefile 重新定義。

Note: The ``main'' targets (e.g., extract, configure, etc.) do nothing more than make sure all the stages up to that one are completed and call the real targets or scripts, and they are not intended to be changed. If you want to fix the extraction, fix do-extract, but never ever change the way extract operates!

現在,你已經知道打 make 到底會作些什麼事囉, 接下來會教你如何作更完美的 port。

For questions about the FreeBSD ports system, e-mail <ports@FreeBSD.org>.
For questions about this documentation, e-mail <doc@FreeBSD.org>.