MFen 1.1063 -> 1.1092.

Obtained from:	The FreeBSD Simplified Chinese Project
This commit is contained in:
Xin LI 2011-01-02 10:51:17 +00:00
parent c2a96407d3
commit a8d264ff8d
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=36753

View file

@ -2,7 +2,7 @@
The FreeBSD Documentation Project
The FreeBSD Simplified Chinese Project
Original Revision: 1.1063
Original Revision: 1.1092
$FreeBSD$
-->
@ -75,7 +75,7 @@
</chapter>
<chapter id="own-port">
<title>自行制作 port</title>
<title>自行制作 port</title>
<para>那么, 您有兴趣创建自己的 port 或升级现有的 port
太好了。</para>
@ -102,14 +102,21 @@
<application>Vim</application> 应该能在打开文件的时候自动识别它,
而 &man.vi.1; 和 &man.ex.1 则需要在打开文件的时候通过
<command>:set tabstop=4</command> 来修正默认的设置。</para>
</note>
</note>
<para>
想练练手吗? 请参阅我们的
<ulink url="http://wiki.freebsd.org/WantedPorts">希望移植的软件列表</ulink>
来看看您是否有兴趣完成其中的任务。
</para>
</chapter>
<chapter id="quick-porting">
<title>简单的 port</title>
<para>这一章主要介绍如何快速创建一个简单的 port。
很多时候, 这点内容是不够的, 您需要阅读这份文档中更深入的内容。</para>
<para>这一章将介绍如何快速创建一个全新的 port。
很多时候, 这点内容是不够的,
您需要阅读这份文档中更深入的内容。</para>
<para>首先, 需要取得包含源代码的 tar包 并把它放到
<makevar>DISTDIR</makevar>变量所指的地方。 默认的情况下, 这应该是
@ -361,48 +368,54 @@ PLIST_DIRS= lib/X11/oneko</programlisting>
</sect1>
<sect1 id="porting-submitting">
<title>提交 port</title>
<title>提交 port</title>
<para>首先, 确信您已经阅读了
<link linkend="porting-dads">该做什么和不该做什么</link> 一节。</para>
<para>在提交新 port 之前, 应先阅读 <link
linkend="porting-dads"> 该做什么和不该做什么</link> 一节。</para>
<para>既然已经对所制作的 port 相当满意了, 剩下的工作,
便是将它放进 FreeBSD 的主 ports 树, 以便让更多的人从中受益。
便是将它放进 &os; 的主 ports 树, 以便让更多的人从中受益。
我们并不需要您的 <filename>work</filename>
目录以及 <filename>pkgname.tgz</filename> 包, 因此现在可以删除它们了。
接下来, 只要把 <command>shar `find
port_dir`</command> 的输出写到一份 bug 报告中, 并用
&man.send-pr.1; 程序 (参见 <ulink url="&url.articles.contributing;/contrib-how.html#CONTRIB-GENERAL">Bug
假定您的 port 的名字是 oneko 接下来要做的是
<command>cd</command> 到
<literal>oneko</literal> 所在的目录, 然后输入命令:
<command>shar `find oneko` &gt; oneko.shar</command>
<para>将这个 <literal>oneko.shar</literal> 文件作为附件,
使用 &man.send-pr.1; 程序提交 (请参阅
<ulink url="&url.articles.contributing;/contrib-how.html#CONTRIB-GENERAL">Bug
Reports and General Commentary</ulink> 以了解关于
&man.send-pr.1; 的进一步详情) 将其送出。 请务必将您的 bug 报告分类 (category) 为
<literal>ports</literal> 并把子分类 (class) 设置为
<literal>change-request</literal> (不要把报告表及为机密的, 即
<literal>confidential</literal>)。 此外,
在 PR 的描述 (<quote>Description</quote>) 一栏中,
应该填写您所移植的应用程序的简单介绍, 而 shar
则应放到修正 (<quote>Fix</quote>) 栏中。</para>
<literal>confidential</literal>)。 此外, 在 PR
的描述 (<quote>Description</quote>) 一栏中的内容应该是 port 的简要介绍
(例如 <makevar>COMMENT</makevar> 内容的简化版本)
而 shar 文件则应填入修正 (<quote>Fix</quote>)
栏中。</para>
<note>
<para>在问题报告里面使用了一段好的描述,
能使我们的工作变得更容易。 我们更倾向于这样的描述
<quote>New port: &lt;category&gt;/&lt;portname&gt;
能使我们的工作变得更容易。 习惯上, 我们会使用类似
<quote>New port: &lt;category&gt;/&lt;portname&gt;
&lt;short description of the port&gt;</quote>
来说明这是一个新的 port 而用
<quote>Update port: &lt;category&gt;/&lt;portname&gt;
&lt;short description of the update&gt;</quote>
来说明这是对一个已有的 port 的升级。 如果您坚持使用这样的方案,
那么我们将更容易更方便地阅读您的 PR。<para>
这样的标题来说明这是新的 port。 如果您也使用这样的习惯,
那么我们将更容易更方便地阅读您的 PR
从而加快处理速度。<para>
</note>
<para>再次声明, <emphasis>不要包含原始的distfile
<filename>work</filename>目录, 或者您用
<command>make package</command> 制作的包</emphasis>。</para>
<command>make package</command> 制作的包</emphasis>
此外, 对于新的 port 请务必使用 &man.shar.1;
而不是 &man.diff.1;。</para>
<para>在您提交的您的 port 以后请耐心等待。
有时在一个 port 正式加入 FreeBSD 之前需要花费好几个月,
有时在一个 port 正式加入 &os; 之前需要花费好几个月,
尽管也有可能是几天。 您可以查看
<ulink url="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?category=ports">
正等待被 commit 到 FreeBSD 的 port</ulink>。</para>
正等待被 commit 到 &os; 的 port PR</ulink>。</para>
<para>一旦我们看过了您的报告, 有必要的话我们会联系您,
并把它放到 ports 树里。 您的名字也会出现在
@ -601,7 +614,7 @@ PLIST_DIRS= lib/X11/oneko</programlisting>
<title>修改 port</title>
<para>解开 tar 包, 对源代码做出合理的修改使得这个 port
能在最新版本的 FreeBSD 上面运行。
能在最新版本的 &os; 上面运行。
一定要 <emphasis>仔细记录</emphasis> 您所做的每处改动,
包括删除、添加、修改的文件等等, 这些修改以后会在您的 port
中以脚本或补丁的方式出现, 并且能通过运行它们来自动完成您对
@ -615,8 +628,8 @@ PLIST_DIRS= lib/X11/oneko</programlisting>
<note>
<para>除非明确地声明, 否则您提交给
FreeBSD ports collection 的补丁,
脚本和其它的文件都将被假定以标准的 BSD 版权发布。</para>
&os; ports collection 的补丁,
脚本和其它的文件都将以标准的 BSD 版权发布。</para>
</note>
</sect1>
@ -638,7 +651,12 @@ PLIST_DIRS= lib/X11/oneko</programlisting>
您应避免使用多个 patch 去修改同一个文件 (例如,
<filename>patch-file</filename> 以及
<filename>patch-file2</filename> 都修改
<filename><makevar>WRKSRC</makevar>/foobar.c</filename>) 这种情况。</para>
<filename><makevar>WRKSRC</makevar>/foobar.c</filename>) 这种情况。
需要注意的是, 如果修改的文件的路径中包含下划线
(<literal>_</literal>) 字符, 则在补丁文件名中应使用两个下划线来代替。
例如, 如果需要修改名为 <filename>src/freeglut_joystick.c</filename> 的文件,
补丁文件的名字应为
<filename>patch-src-freeglut__joystick.c</filename>。</para>
<para>只有 <literal>[-+._a-zA-Z0-9]</literal> 这些字符,
可以出现在补丁的文件名中, 请务必不要使用除这些字符以外的其它字符。
@ -706,6 +724,12 @@ PLIST_DIRS= lib/X11/oneko</programlisting>
<programlisting>USE_DOS2UNIX= yes
DOS2UNIX_REGEX= .*\.(c|cpp|h)</programlisting>
<para>如果您希望基于现存的文件创建补丁, 可以把文件复制为带
<filename>.orig</filename> 扩展名的名字, 然后修改原文件。
然后使用 <maketarget>makepatch</maketarget>
目标根据修改在 port 的 <filename
class="directory">files</filename> 目录中生成补丁文件。</para>
</sect1>
<sect1 id="slow-configure">
@ -2198,28 +2222,133 @@ PORTEPOCH= 1</programlisting>
我们甚至打算增加自动检测距离最近的站点并从那里下载的功能;
使用多个站点是这样做的重要一步。</para>
<para>如果原始的源码包是流行的软件
例如 X-contrib、 GNU 或 Perl CPAN 等等之一
您可能会希望使用
<para>如果原始的源码包可以从比较流行的软件下载站点
例如 SourceForge、 GNU 或是 Perl CPAN 等等来获得
您可能会希望使用类似
<makevar>MASTER_SITE_<replaceable>*</replaceable></makevar>
(例如 <makevar>MASTER_SITE_XCONTRIB</makevar>、
<makevar>MASTER_SITE_GNU</makevar> 和
<makevar>MASTER_SITE_PERL_CPAN</makevar>) 来简化撰写。 简单地将
<makevar>MASTER_SITES</makevar> 设置为这些变量之一, 并使用
<makevar>MASTER_SITE_SUBDIR</makevar> 来指定路径就可以达到目的。
这样的缩写来表示它们
(例如 <makevar>MASTER_SITE_SOURCEFORGE</makevar>、
<makevar>MASTER_SITE_GNU</makevar> 以及
<makevar>MASTER_SITE_PERL_CPAN</makevar>)。 只需将
<makevar>MASTER_SITES</makevar> 设为这些变量, 并使用
<makevar>MASTER_SITE_SUBDIR</makevar> 来指定路径就可以了。
下面是一个例子:</para>
<programlisting>MASTER_SITES= ${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR= applications</programlisting>
<programlisting>MASTER_SITES= ${MASTER_SITE_GNU}
MASTER_SITE_SUBDIR= make</programlisting>
<para>此外, 您还可以用更为简略的格式:</para>
<programlisting>MASTER_SITES= GNU/make</programlisting>
<para>这些变量是在
<filename>/usr/ports/Mk/bsd.sites.mk</filename> 中定义的。
新项目会随时增加, 因此在您提交 port 之前,
应先看一看这个文件的最新版本。</para>
<para>用户也可以在他们的 <filename>/etc/make.conf</filename>
文件中自行设置 <makevar>MASTER_SITE_*</makevar> 变量,
以便让系统使用他们的选择, 从他们喜欢的镜像站点进行下载。</para>
<para>针对常用软件下载站的许多 <emphasis>暗黑魔法</emphasis> 宏,
还能够自动判断目录的结构。 对于这些站点,
只要使用与之对应的缩写, 系统便会自动为您生成相关的子目录配置。</para>
<programlisting>MASTER_SITES= SF</programlisting>
<para>如果系统猜测的路径不对, 则可以使用下面这样的配置来替换。</para>
<programlisting>MASTER_SITES= SF/stardict/WyabdcRealPeopleTTS/${PORTVERSION}</programlisting>
<table frame="none">
<title>常用的魔术 <makevar>MASTER_SITES</makevar> 宏</title>
<tgroup cols="2">
<thead>
<row>
<entry>宏</entry>
<entry>自动猜测的子目录</entry>
</row>
</thead>
<tbody>
<row>
<entry><makevar>APACHE_JAKARTA</makevar></entry>
<entry><makevar>/dist/jakarta/${PORTNAME:S,-,,/,}/source</makevar></entry>
</row>
<row>
<entry><makevar>BERLIOS</makevar></entry>
<entry><makevar>/${PORTNAME:L}</makevar></entry>
</row>
<row>
<entry><makevar>CHEESESHOP</makevar></entry>
<entry><makevar>/packages/source/source/${DISTNAME:C/(.).*/\1/}/${DISTNAME:C/(.*)-[0-9].*/\1/}</makevar></entry>
</row>
<row>
<entry><makevar>DEBIAN</makevar></entry>
<entry><makevar>/debian/pool/main/${PORTNAME:C/^((lib)?.).*$/\1/}/${PORTNAME}</makevar></entry>
</row>
<row>
<entry><makevar>GCC</makevar></entry>
<entry><makevar>/pub/gcc/releases/${DISTNAME}</makevar></entry>
</row>
<row>
<entry><makevar>GNOME</makevar></entry>
<entry><makevar>/pub/GNOME/sources/${PORTNAME}/${PORTVERSION:C/^([0-9]+\.[0-9]+).*/\1/}</makevar></entry>
</row>
<row>
<entry><makevar>GNU</makevar></entry>
<entry><makevar>/gnu/${PORTNAME}</makevar></entry>
</row>
<row>
<entry><makevar>MOZDEV</makevar></entry>
<entry><makevar>/pub/mozdev/${PORTNAME:L}</makevar></entry>
</row>
<row>
<entry><makevar>PERL_CPAN</makevar></entry>
<entry><makevar>/pub/CPAN/modules/by-module/${PORTNAME:C/-.*//}</makevar></entry>
</row>
<row>
<entry><makevar>PYTHON</makevar></entry>
<entry><makevar>/ftp/python/${PYTHON_PORTVERSION:C/rc[0-9]//}</makevar></entry>
</row>
<row>
<entry><makevar>RUBYFORGE</makevar></entry>
<entry><makevar>/${PORTNAME:L}</makevar></entry>
</row>
<row>
<entry><makevar>SAVANNAH</makevar></entry>
<entry><makevar>/${PORTNAME:L}</makevar></entry>
</row>
<row>
<entry><makevar>SF</makevar></entry>
<entry><makevar>/project/${PORTNAME:L}/${PORTNAME:L}/${PORTVERSION}</makevar></entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2>
@ -3022,14 +3151,18 @@ ALWAYS_KEEP_DISTFILES= yes
<para><filename>Makefile</filename> 中的 COMMENT 变量应该紧接着 MAINTAINER
变量出现。</para>
<para>请务必将 COMMENT 这行限制在 70 个字符之内,
因为它的主要目的是向用户展示 port 的一句话简介。</para>
<para>请务必将 COMMENT 这行限制在 60 个字符之内,
因为这行内容会成为 &man.pkg.info.1;
呈现给用户的 port 的一句话简介。</para>
</sect1>
<sect1 id="makefile-depend">
<title>依赖关系</title>
<para>许多 port 会依赖其它 port。
<para>许多 ports 会依赖其它 port。 这是包括 &os;
在内的多数 类-Unix 系统的很方便的功能。
这项功能, 可以避免在每个 port 或预编译包中都带上重复的依赖的代码,
而可以以依赖关系的方式去共享它们。
有七个变量用于帮助您确保所需的文件都存在于用户的机器上。
此外, 也提供了用于支持常见情形的依赖关系变量,
以及对依赖关系行为的更多控制。</para>
@ -3118,6 +3251,30 @@ ALWAYS_KEEP_DISTFILES= yes
如果您希望指定一个的 <replaceable>target</replaceable>
和默认的 <makevar>DEPENDS_TARGET</makevar> 相同,
则可以略去不写。</para>
<para>一种比较常见的情形是
<makevar>RUN_DEPENDS</makevar> 和
<makevar>BUILD_DEPENDS</makevar> 完全一样,
这种情况在移植的软件是采用脚本语言书写,
或联编环境与运行环境需求相同时尤其普遍。
这种情况可以用下面简单明了的方式直接将其中一个变量赋值给另一个变量:</para>
<programlisting>RUN_DEPENDS= ${BUILD_DEPENDS}</programlisting>
<para>不过, 这种赋值有可能会令运行环境被某些没有在
port 原本的 <makevar>BUILD_DEPENDS</makevar> 明确定义的依赖关系污染。
导致这种情况的原因是 &man.make.1; 计算变量赋值时默认采用的是延后计算 (lazy evaluation)。
例如, 如果在 <filename>Makefile</filename> 中使用了
<makevar>USE_<replaceable>*</replaceable></makevar> 变量,
这些变量就会由 <filename>ports/Mk/bsd.*.mk</filename> 处理,
并填写与之对应的联编依赖关系。 例如, <literal>USE_GMAKE=yes</literal>
会把 <filename role="package">devel/gmake</filename> 加入到
<makevar>BUILD_DEPENDS</makevar>。
如果希望避免这些附加的依赖关系污染 <makevar>RUN_DEPENDS</makevar>
在使用赋值的时候就需要小心考虑这类扩展的情况,
例如, 可以在赋值展开之前复制变量的值:</para>
<programlisting>RUN_DEPENDS:= ${BUILD_DEPENDS}</programlisting>
</sect2>
<sect2>
@ -3804,26 +3961,67 @@ PORTVERSION= 1.0</programlisting>
</sect1>
<sect1 id="conflicts">
<title><makevar>CONFLICTS</makevar> (设置与其它包的冲突)</title>
<title>处理冲突</title>
<para>如果您的软件包无法与某些其它软件包共存
(由于文件冲突, 运行环境不兼容, 等等)
将这些包的名字列在 <makevar>CONFLICTS</makevar>
变量中。 此处可以使用 shell 通配符, 如 <literal>*</literal> 和
<literal>?</literal>。 列举软件包的名称时, 应采用
<filename>/var/db/pkg</filename> 中的形式。 请确认
<makevar>CONFLICTS</makevar> 不会匹配它本身, 否则将导致
<makevar>FORCE_PKG_REGISTER</makevar> 无法正常工作。
</para>
<para>针对不同的 package 或 port 之间的冲突情形,
系统提供了不同的变量来协助开发人员进行表达: <makevar>CONFLICTS</makevar>、
<makevar>CONFLICTS_INSTALL</makevar> 和
<makevar>CONFLICTS_BUILD</makevar>。</para>
<note>
<para><makevar>CONFLICTS</makevar> 会自动地设置
<para>这些用于描述冲突的变量会自动地设置
<makevar>IGNORE</makevar> 后者的完整介绍,
可以在 <xref linkend="dads-noinstall"> 找到。</para>
</note>
<para>在删去相互冲突的 port 时, 建议将 <makevar>CONFLICTS</makevar>
保留几个月, 以便让那些不经常更新系统的用户能够看到。</para>
<sect2>
<title><makevar>CONFLICTS_INSTALL</makevar></title>
<para>如果您的软件包不能与某些软件包同时安装
(例如由于安装同样的文件到相同的位置、 运行时不兼容等等)
则应把其它软件包的名字列在
<makevar>CONFLICTS_INSTALL</makevar> 变量中。 此处可以使用 shell
通配符, 如 <literal>*</literal> 和 <literal>?</literal>。
列出其它软件包的名字时需要遵循它们在
<filename>/var/db/pkg</filename> 中出现的样子。 请确保
<makevar>CONFLICTS_INSTALL</makevar> 不会匹配到您正制作的这个预编译包的名字,
否则, 使用
<makevar>FORCE_PKG_REGISTER</makevar> 来强制安装就没有办法进行了。
对于 CONFLICTS_INSTALL 的检查是在联编过程之后、
安装开始之前进行的。</para>
</sect2>
<sect2>
<title><makevar>CONFLICTS_BUILD</makevar></title>
<para>如果您的软件包在系统中存在某些其它软件包时不能完成联编,
则应把其它软件包的名字列在
<makevar>CONFLICTS_BUILD</makevar> 变量中。 此处可以使用 shell
通配符, 如 <literal>*</literal> 和 <literal>?</literal>。
列出其它软件包的名字时需要遵循它们在
<filename>/var/db/pkg</filename> 中出现的样子。
对于 CONFLICTS_BUILD 的检查是在联编过程开始之前进行的。
联编时的冲突不会在编译好的包中予以记录。</para>
</sect2>
<sect2>
<title><makevar>CONFLICTS</makevar></title>
<para>如果您的 port 在某些其它 port 已经存在的情况下既不能联编,
也不能安装, 则应把其它软件包的名字列在
<makevar>CONFLICTS</makevar> 变量中。 此处可以使用 shell
通配符, 如 <literal>*</literal> 和 <literal>?</literal>。
列出其它软件包的名字时需要遵循它们在
<filename>/var/db/pkg</filename> 中出现的样子。 请确保
<makevar>CONFLICTS</makevar> 不会匹配到您正制作的这个预编译包的名字,
否则, 使用
<makevar>FORCE_PKG_REGISTER</makevar> 来强制安装就没有办法进行了。
对于 CONFLICTS 的检查是在联编过程之后、
安装开始之前进行的。</para>
</sect2>
</sect1>
<sect1 id="install">
@ -3845,6 +4043,10 @@ PORTVERSION= 1.0</programlisting>
<para><makevar>INSTALL_SCRIPT</makevar> 是安装可执行脚本文件的命令。</para>
</listitem>
<listitem>
<para><makevar>INSTALL_LIB</makevar> 是安装动态连接库的命令。</para>
</listitem>
<listitem>
<para><makevar>INSTALL_KLD</makevar> 是用于安装可加载式内核模块的命令。
在某些平台上, 当对内核模块进行 strip 之后会导致一些问题,
@ -3865,17 +4067,18 @@ PORTVERSION= 1.0</programlisting>
</sect2>
<sect2 id="install-strip">
<title>对可执行文件做脱模 (strip) 操作</title>
<title>对可执行文件和动态连接库做脱模 (strip) 操作</title>
<para>除非不得不进行, 否则不要手工对可执行文件作脱模操作。
所有文件在安装时都应脱模, 但 <maketarget>INSTALL_PROGRAM</maketarget>
宏会在安装的同时对其进行脱模 (参见下一节的内容)。</para>
所有文件在安装时都应脱模, 但 <makevar>INSTALL_PROGRAM</makevar>
宏会在安装的同时对其进行脱模 (参见下一节的内容)。
<makevar>INSTALL_LIB</makevar> 宏</para>
<para>如果您需要对某一文件进行脱模, 但不希望使用
<makevar>INSTALL_PROGRAM</makevar> 宏, 则应使用
<makevar>${STRIP_CMD}</makevar> 来处理程序。
一般而言这应该在 <literal>post-install</literal>
target 中进行。 例如:</para>
<makevar>INSTALL_PROGRAM</makevar> 及 <makevar>INSTALL_LIB</makevar> 宏,
则应使用 <makevar>${STRIP_CMD}</makevar> 来处理程序。
一般而言这应该在
<maketarget>post-install</maketarget> target 中进行。 例如:</para>
<programlisting>post-install:
${STRIP_CMD} ${PREFIX}/bin/xdl</programlisting>
@ -5127,7 +5330,7 @@ USE_XORG= x11 xpm</programlisting>
<programlisting>DESKTOP_ENTRIES= "ToME" "Roguelike game based on JRR Tolkien's work" \
"${DATADIR}/xtra/graf/tome-128.png" \
"tome -v -g" "Application;Game;RolePlaying" \
"tome -v -g" "Application;Game;RolePlaying;" \
false</programlisting>
</sect2>
@ -5662,7 +5865,8 @@ QT_COMPONENTS= qmake_build moc_build rcc_build uic_build</programlisting>
<entry><makevar>JAVA_VERSION</makevar></entry>
<entry>用空格分开的适合 port 使用的 Java 版本。
可选的 <literal>"+"</literal> 可以用于指定某个范围的版本 (可以用:
<literal>1.1[+] 1.2[+] 1.3[+] 1.4[+]</literal>)。</entry>
<literal>1.1[+] 1.2[+] 1.3[+] 1.4[+] 1.5[+]
1.6[+]</literal>)。</entry>
</row>
<row>
@ -8139,6 +8343,19 @@ GROUPS= pulse pulse-access pulse-rt</programlisting>
</sect1>
<sect1>
<title>依赖内核源代码的 Ports</title>
<para>某些 ports (例如可加载式内核模块) 需要内核的源文件才能编译。
下面是检测用户是否安装了源代码的例子:</para>
<programlisting>SRC_BASE?= /usr/src
.if !exists(${SRC_BASE}/sys/Makefile)
IGNORE= requires kernel sources to be installed
.endif</programlisting>
</sect1>
</chapter>
<chapter id="plist">
@ -8581,18 +8798,6 @@ etc/orbit.conf.sample
<filename>pkg-message</filename> 中的
installation <makevar>PREFIX</makevar>。</para>
<para>使用 <makevar>SUB_FILES</makevar>
变量可以指定需要自动修改的文件列表。 在
<makevar>SUB_FILES</makevar> 中的每一个
<replaceable>file</replaceable> 都必须有一个对应的、
存在于 <makevar>FILESDIR</makevar> 目录的
<filename><replaceable>file</replaceable>.in</filename> 文件。
如果您加入了一些文件, 例如
<filename>pkg-message</filename>、 <filename>pkg-install</filename>、
<filename>pkg-deinstall</filename> 或 <filename>pkg-reg</filename> 则相关的
<makevar>PKG-<replaceable>FILE</replaceable></makevar> 变量就应设置为
<filename><makevar>WRKDIR</makevar>/pkg-<replaceable>file</replaceable></filename>。</para>
<para>用 <makevar>SUB_FILES</makevar> 变量,
可以指定需要自动进行修改的文件列表。 在
<makevar>SUB_FILES</makevar> 中的每一个
@ -8605,7 +8810,7 @@ etc/orbit.conf.sample
<makevar>SUB_FILES</makevar> 中。 对于
<filename>pkg-message</filename>、
<filename>pkg-install</filename>、 <filename>pkg-deinstall</filename>
and <filename>pkg-reg</filename> 对应的 Makefile 变量会被自动设置,
and <filename>pkg-req</filename> 对应的 Makefile 变量会被自动设置,
以指向处理过的版本。</para>
<para><makevar>SUB_LIST</makevar> 这个变量的内容是一系列
@ -8790,7 +8995,7 @@ as .putsy.conf and edit it.</programlisting>
</chapter>
<chapter id="port-upgrading">
<title>升级</title>
<title>升级一个 port</title>
<para>如果您发现某个 port 相对原作者所发布的版本已经过时,
则首先需要确认的是您的 port 是最新的。 您可以在 &os; FTP 镜像的
@ -8823,23 +9028,38 @@ as .putsy.conf and edit it.</programlisting>
因此发邮件给它一般没什么意义。</para>
<para>如果维护者要求您去完成升级, 或者没有维护者,
您就可以通过自行完成升级来帮助 &os; 了! 请进行修改,
并保存在新旧目录上执行的递归式 <command>diff</command> 的输出 (例如,
如果您修改的 port 的目录名是 <filename>superedit</filename>
而修改前的目录的名字是 <filename>superedit.bak</filename> 则应提交的是
您就有机会通过自行完成升级来帮助 &os; 了! 请使用基本系统提供的
&man.diff.1; 命令来完成相关的工作。</para>
<para>如果只修改一个文件, 可以直接使用 <command>diff</command>
来生成补丁, 将需要修改的文件复制成 <replaceable>something.orig</replaceable>
并将改动放进 <replaceable>something</replaceable>
接着生成补丁:</para>
<informalexample>
<screen>&prompt.user; <userinput>/usr/bin/diff something.orig something > something.diff</userinput></screen>
</informalexample>
<para>还有一种办法是将目录整个复制到另一个目录,
并使用 &man.diff.1; 比较两个目录时在目录中递归产生的输出结果
(例如, 如果您修改后的 port 目录的名字是
<filename>superedit</filename> 而原始文件的目录是
<filename>superedit.bak</filename> 则应保存
<command>diff -ruN superedit.bak superedit</command> 的结果)。
一致式 (unified) 或 上下文式 (context) diff 都是可以的,
但一般来说 port committer 会更喜欢一致式 diff。
请注意这里使用的选项 <literal>-N</literal> 它的目的是强制 diff
正确地处理出现新文件, 或老文件被删除的情形。 在把 diff 发给我们之前,
请再次检查输出, 以便确认每一个修改都是有意义的。
为了简化常用的补丁文件操作, 您可以使用
请再次检查输出, 以便确认每一个修改都是有意义的。 (特别注意,
在对比目录之前要用 <command>make clean</command> 清理一下)。</para>
<para>为了简化常用的补丁文件操作, 您可以使用
<filename>/usr/ports/Tools/scripts/patchtool.py</filename>。
使用之前, 请首先阅读
<filename>/usr/ports/Tools/scripts/README.patchtool</filename>。</para>
<para>如果 port 目前还无人维护, 而且您自己经常使用它,
请考虑自荐为它的维护者。 &os; 有超过 2000 个没有维护者的 port
请考虑自荐为它的维护者。 &os; 有超过 4000 个没有维护者的 port
而这正是最需要志愿人员的领域。
(要了解关于维护者的任务描述, 请参见
<ulink url="&url.books.developers-handbook;/policies.html#POLICIES-MAINTAINER">
@ -8870,12 +9090,36 @@ as .putsy.conf and edit it.</programlisting>
</important>
<note>
<para>再次强调, 请使用 &man.diff.1; 而非 &man.shar.1; 来发送现有 port 的更新!</para>
<para>再次强调, 请使用 &man.diff.1; 而非 &man.shar.1; 来发送现有
port 的更新! 这可以帮助 ports committer 理解需要修改的内容。</para>
</note>
<para>现在您已经了解了所需的所有操作, 您可能会像要阅读在
<xref linkend="keeping-up"> 中关于如何保持最新的描述。</para>
<sect1 id="moved-and-updating-files">
<title>UPDATING 和 MOVED 文件</title>
<para>如果在升级 port 时需要类似修改配置文件或运行特定的程序这样的特别步骤,
则应在
<filename>/usr/ports/UPDATING</filename> 文件中予以说明。
这个文件中的项目格式如下:</para>
<programlisting>YYYYMMDD:
AFFECTS: users of port类别/port名字
AUTHOR: 您的名字 &lt;您的电子邮件地址&gt;
所需执行的特别步骤</programlisting>
<para>如果您需要在内文中加入具体的 portmaster 或 portupgrade
的说明, 请确保所用的 shell 命令使用了正确的转义字符。</para>
<para>如果 port 被删除或改名,则应在
<filename>/usr/ports/MOVED</filename> 中添加相应的说明项目。
这个文件中的项目格式如下:</para>
<programlisting>原来的名字|新名字 (如果删除则应留空)|删除或改名的日期|原因</programlisting>
</sect1>
</chapter>
<chapter id="security">
@ -12026,6 +12270,18 @@ Reference: &lt;http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00
<entry>7.3-RELEASE 之后的 7.3-STABLE。</entry>
</row>
<row>
<entry>704000</entry>
<entry>December 22, 2010</entry>
<entry>7.4-RELEASE</entry>
</row>
<row>
<entry>704100</entry>
<entry>December 22, 2010</entry>
<entry>7.4-RELEASE 之后的 7.4-STABLE。</entry>
</row>
<row>
<entry>800000</entry>
<entry>October 11, 2007</entry>
@ -12745,6 +13001,23 @@ Reference: &lt;http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00
<entry>June 14, 2010</entry>
<entry>8.1-RELEASE 之后的 8.1-STABLE。</entry>
</row>
<row>
<entry>801501</entry>
<entry>November 3, 2010</entry>
<entry>用于 PL_FLAG_SCE/SCX/EXEC/SI 的 struct sysentvec 的 KBI 以及
用于 ptrace(PT_LWPINFO) 的 pl_siginfo 的 KBI
改变之后的 8.1-STABLE。</entry>
</row>
<row>
<entry>802000</entry>
<entry>December 22, 2010</entry>
<entry>8.2-RELEASE</entry>
</row>
<row>
<entry>802500</entry>
<entry>December 22, 2010</entry>
<entry>8.2-RELEASE 之后的 8.2-STABLE。</entry>
</row>
<row>
<entry>900000</entry>
<entry>August 22, 2009</entry>
@ -12832,6 +13105,79 @@ Reference: &lt;http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00
<entry>Jun 10, 2010</entry>
<entry>添加了 Clang 之后的 9.0-CURRENT。</entry>
</row>
<row>
<entry>900015</entry>
<entry>July 22, 2010</entry>
<entry>引入了 BSD grep 之后的 9.0-CURRENT。</entry>
</row>
<row>
<entry>900016</entry>
<entry>July 28, 2010</entry>
<entry>在 struct malloc_type_internal 中加入了 mti_zone
之后的 9.0-CURRENT。</entry>
</row>
<row>
<entry>900017</entry>
<entry>August 23, 2010</entry>
<entry>默认 grep 改回使用
GNU grep 并增加 WITH_BSD_GREP 开关之后的 9.0-CURRENT。</entry>
</row>
<row>
<entry>900018</entry>
<entry>August 24, 2010</entry>
<entry>将 <function>pthread_kill(3)</function>
产生的信号在 si_code 中改为使用 SI_LWP 标记之后的
9.0-CURRENT。 之前, si_code 对应的标志为 SI_USER。</entry>
</row>
<row>
<entry>900019</entry>
<entry>August 28, 2010</entry>
<entry>为 <function>mmap(2)</function> 新增了
MAP_PREFAULT_READ 标志之后的 9.0-CURRENT。</entry>
</row>
<row>
<entry>900020</entry>
<entry>September 9, 2010</entry>
<entry>为 sbuf 增加了 drain 功能并改变了
struct sbuf 布局之后的 9.0-CURRENT。</entry>
</row>
<row>
<entry>900021</entry>
<entry>September 13, 2010</entry>
<entry>DTrace 增加用户态跟踪支持之后的 9.0-CURRENT。</entry>
</row>
<row>
<entry>900022</entry>
<entry>October 2, 2010</entry>
<entry>新增了 BSDL man 工具, 并淘汰 GNU/GPL man 工具之后的
9.0-CURRENT。</entry>
</row>
<row>
<entry>900023</entry>
<entry>October 11, 2010</entry>
<entry>引入 20101010 git 快照版本 xz 之后的 9.0-CURRENT。</entry>
</row>
<row>
<entry>900024</entry>
<entry>November 11, 2010</entry>
<entry>将 libgcc.a 替换为 libcompiler_rt.a 之后的 9.0-CURRENT。</entry>
</row>
<row>
<entry>900025</entry>
<entry>November 12, 2010</entry>
<entry>引入了模块化拥塞控制之后的 9.0-CURRENT。</entry>
</row>
<row>
<entry>900026</entry>
<entry>November 30, 2010</entry>
<entry>引入串行管理协议 (SMP) 直通, 以及与之对应的 CAM CCB
XPT_SMP_IO 和 XPT_GDEV_ADVINFO 之后的 9.0-CURRENT。</entry>
</row>
<row>
<entry>900027</entry>
<entry>December 5, 2010</entry>
<entry>在 libm 中增加 log2 之后的 9.0-CURRENT。</entry>
</row>
</tbody>
</tgroup>
</table>
@ -13381,27 +13727,6 @@ IGNORE=POINTYHAT is not supported
<para>除此之外, 也可以联系软件的作者, 以确认这些修改是否是他们做的。</para>
</sect1>
<sect1 id="dads-workarounds">
<title>一些必要的 workaround</title>
<para>有时, 需要绕过一些较早版本的 &os; 中包含软件中的 bug。</para>
<itemizedlist>
<listitem>
<para>某些版本的 &man.make.1; 在处理 <makevar>OSVERSION</makevar>
的比较时存在问题, 至少对 4.8 和 5.0 是这样。 这经常会导致在
<command>make describe</command> 时发生问题 (因而,
ports <command>make index</command> 也会无法正常工作)。
绕过这个问题的方法, 是在判断语句周围增加空格, 例如:
<programlisting>if ( ${OSVERSION} &gt; 500023 )</programlisting>
请小心, 在 4.9 或 5.2 上测试安装,
是 <emphasis>不能</emphasis> 检测到这个问题的。</para>
</listitem>
</itemizedlist>
</sect1>
<sect1 id="dads-misc">
<title>杂记</title>