4.4 Patching

在 port 的準備過程中,新增或變更過的檔案, 可以利用 diff(1) 將這些變動列出, 以便後續讓 patch(1) 使用。 所有你想套用的 patch 都應該命名為 patch-*,其中 * 表示要 patch 檔案的路徑及檔名名稱, 例如 patch-Imakefilepatch-src-config.h。 這些檔案都應該儲存在 PATCHDIR (通常是 files/,放在其內的檔案都會自動被套用。 所有 patch 檔路徑都是相對於 WRKSRC (通常會將 port 的 tarball 解壓到裡面, port 的建置也會在這裡完成)。 為了能讓修正和更新更順利,你應該避免多個 patch 修正同一個檔案 (舉例來說,patch-filepatch-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)
For questions about the FreeBSD ports system, e-mail <ports@FreeBSD.org>.
For questions about this documentation, e-mail <doc@FreeBSD.org>.