FreeBSD Porter's Handbook
Prev |  | Next

# Chapter 4 Slow Porting

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

# 4.1 How things work

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

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

1. 首先，進行 `fetch` 階段。 `fetch` 是確認 tarball 檔有沒有已在 `DISTDIR` 內了？若 `fetch` 在 `DISTDIR` 找不到的話，它會搜尋 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-`something`` 或 `post-`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。

Prev | Home | Next
提交(Submit) port |  | 取得原始的 source 檔

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