在您制作 port 的过程中, 文件的添加或修改都可以用 diff(1) 做成补丁, 使得今后的能够使用 patch(1) 在安装过程中自动对 port 做出相应的修改。 每一个您想要打的补丁应该以 patch-* 这样形式的文件名保存, * 表示将要被打补丁的文件名, 例如 patch-Imakefile 或 patch-src-config.h 这样。 这些文件应该被放在 PATCHDIR 里, 这样这些补丁都会被自动打上。 所有的补丁必须相对于 WRKSRC 的 (port 会把 tarball 解压缩在那里, 并完成余下的其它动作)。 为了使修改和升级变得更容易, 应避免使用多个 patch 去修改同一个文件 (比如, patch-file 和 patch-file2 都修改 WRKSRC/foobar.c 就应被避免)。
只有 [-+._a-zA-Z0-9] 这些字符, 可以出现在补丁的文件名中, 请务必不要使用除这些字符以外的其它字符。 不要把您的补丁命名成 patch-aa 或 patch-ab 等这样的名字, 最好能在补丁名中提到路径和文件名。
不要把 RCS 字符串放进补丁。 我们把文件放进 ports 树的时候, CVS 会损坏它们, 当我们再 check out 出来的时候, 它们就会和原来的不一样, 从而导致打补丁失败。 RCS 字符串 是由美元符号 ($) 围绕的, 通常由 $Id 或 $RCS 开头。
使用 diff(1)
的递归选项(-r) 很好, 但是请检查一下最后输出的 patch,
确保没有任何的垃圾信息。 特别地, 有 2 种文件不需要 diff, 并且应该删除: 一种是 Makefile, 当您的port使用了Imake, 或者
GNU configure 等等的话。 如果您不得不编辑configure.in 以使 autoconf 去生成 configure, 不要使用 configure 来做 diff
(这常常会有好几千行长!); 请定义 USE_AUTOCONF_VER=213 并对应 configure.in 来制作 diff。
往往在移植某个软件的时候会遇到这样一种情况, 特别是这个软件是在 Windows® 上开发的时候, 大多数的源代码都需要进行CR/LF的转换。 这也许会给以后打补丁, 编译警告、 脚本执行造成问题 ( /bin/sh^M not found) 等等。 您能加入以下这行代码来快速地把那些文件从 CR/LF 转换到 LF:
USE_REINPLACE= yes
post-extract:
@${FIND} -E ${WRKDIR} -type f -iregex ".*\.(c|cpp|h|txt)" -print0 | \
${XARGS} -0 ${REINPLACE_CMD} -e 's/[[:cntrl:]]*$$//'
当然, 如果您想要处理所有文件的话, 就可以省略上面的 -iregex 选项。
请注意这段代码会从被处理文件的每一行里面剔除所有的控制字符。 (但不包括 \n)。
假如需要删除文件, 您可以在 post-extract 里面做这件事, 而不是在把它作为一个补丁。 一旦您对您所做修改的感觉比较满意, 那么请把diff输出分成一个补丁对应一个源文件。