FreeBSD Porter's Handbook
Prev | Chapter 4 Slow Porting | Next

# 4.4 Patching

在 port 的準備過程中，新增或變更過的檔案， 可以利用 diff(1) 將這些變動列出， 以便後續讓 patch(1) 使用。 所有你想套用的 patch 都應該命名為 `patch-`*``，其中 `*` 表示要 patch 檔案的路徑及檔名名稱， 例如 `patch-Imakefile` 或 `patch-src-config.h`。 這些檔案都應該儲存在 `PATCHDIR` (通常是 `files/`，放在其內的檔案都會自動被套用。 所有 patch 檔路徑都是相對於 `WRKSRC` (通常會將 port 的 tarball 解壓到裡面， port 的建置也會在這裡完成)。 為了能讓修正和更新更順利，你應該避免多個 patch 修正同一個檔案 (舉例來說，`patch-file` 和 `patch-file2` 同時更動 ``WRKSRC`/foobar.c`)。

請只使用 `[-+._a-zA-Z0-9]` 這些字元來命名 patch 檔，不要使用這些字元以外的字元。 千萬不要將你的 patch 檔命名成 `patch-aa` 或是 `patch-ab` 等名稱， 請使用路徑和名稱相關的命名。

不要將 RCS 字串放進你的 patch 檔。CVS 會在這些檔案送入 ports tree 的時候弄亂檔案內容，而且在將它們重新 check out 出來後，會因檔案內容的差異造成 patch 失敗。 RCS 字串是以錢字號 (`$`) 括起來的， 通常以 `$Id` 或 `$RCS` 為開頭。

你可以使用 diff(1) 搭配 recurse (`-r`) 選項 來產生 patch 檔，但請再次檢視產生出的 patch 檔，確保你沒有產生 任何不必要的垃圾資訊在裡面。特別是對那些經由 `Imake` 或 GNU `configure` 所產生的 `Makefile` 檔產生 patch， 都是不必要的，這類的 patch 檔都應該被刪除。假如你必須透過修改 `configure.in` 再執行 `autoconf` 來重新產生 `configure`，不要對 `configure` 產生 patch 檔 (這往往會長成數千行！)； 請定義 `USE_AUTOTOOLS=autoconf:261` 並對 `configure.in` 產生 patch 檔。

請儘量不要對無用的 whitespace 作修改，因為在 Open Source 界各個 project 都會使用很多相同的 code base，這些可能卻是採用不同的編排方式 、coding style。 若要試圖改變這些編排風格的話，請小心： 這些只會是徒勞無功的更改。 此外不僅會造成 CVS repository 空間浪費， 也會讓人難以找出真正問題癥結所在，以及分辨不出這段 patch 到底在作什麼 。

假如你必須刪除一個檔案，那麼你可以在 `post-extract` 階段做這件事， 而不是在 patch 階段。

你可以直接在 port 的 `Makefile` 中完成簡單的置換工作，只需使用 sed(1) 的 in-place mode 即可。這在只需 patch 一個變數的值時相當有用。 例如：

    post-patch:
        @${REINPLACE_CMD} -e 's|for Linux|for FreeBSD|g' ${WRKSRC}/README
        @${REINPLACE_CMD} -e 's|-pthread|${PTHREAD_LIBS}|' ${WRKSRC}/configure

在移植軟體時，特別是那些在 Windows® 平台開發的軟體， 時常會遇到一種情況，就是在大部份的 source file 中， 使用 CR/LF 做為斷行。這會影響往後的 patching、compiler warnings、以及 scripts execution (找不到 `/bin/sh^M` 的情況) 等。 為了快速轉換 CR/LF 為 LF，可以把 `USE_DOS2UNIX=yes` 加到 port 的 `Makefile` 檔中。 你也可以設定成只針對指定的檔案做轉換：

    USE_DOS2UNIX=    util.c util.h

若想要轉換所有子目錄內的某類別檔案，可以使用 `DOS2UNIX_REGEX`。 它的參數是 `find` 相容的正規表達式。 相關格式可參閱 re_format(7)。 對於所指定副檔名的檔案之轉換而言，這相當好用， 舉例來說，只動所有原始碼部分而不改 binary 檔案：

    USE_DOS2UNIX=    yes
    DOS2UNIX_REGEX=  .*\.(c|cpp|h)

Prev | Home | Next
量身打造 port | Up | 設定

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