aboutsummaryrefslogtreecommitdiff
path: root/zh_CN.GB2312/books/porters-handbook
diff options
context:
space:
mode:
authorXin LI <delphij@FreeBSD.org>2006-03-15 19:45:37 +0000
committerXin LI <delphij@FreeBSD.org>2006-03-15 19:45:37 +0000
commit639205b60c99afefb07be3bccecf1b6eb04c0629 (patch)
tree38d28fee57724331ba46db143a6184ba5cfbf86b /zh_CN.GB2312/books/porters-handbook
parentb99e83b0a7c48690c2e6b7699bbd549e9a2c8da1 (diff)
Notes
Diffstat (limited to 'zh_CN.GB2312/books/porters-handbook')
-rw-r--r--zh_CN.GB2312/books/porters-handbook/book.sgml515
1 files changed, 369 insertions, 146 deletions
diff --git a/zh_CN.GB2312/books/porters-handbook/book.sgml b/zh_CN.GB2312/books/porters-handbook/book.sgml
index 1fe685f65d..795f4e07d5 100644
--- a/zh_CN.GB2312/books/porters-handbook/book.sgml
+++ b/zh_CN.GB2312/books/porters-handbook/book.sgml
@@ -2,7 +2,7 @@
The FreeBSD Documentation Project
The FreeBSD Simplified Chinese Project
- Original Revision: 1.639
+ Original Revision: 1.686
$FreeBSD$
-->
@@ -28,13 +28,28 @@
<year>2003</year>
<year>2004</year>
<year>2005</year>
+ <year>2006</year>
<holder role="mailto:doc@FreeBSD.org">The FreeBSD Documentation
Project</holder>
</copyright>
+
+ <authorgroup>
+ <corpauthor>&cnproj.freebsd.org;</corpauthor>
+ </authorgroup>
+
+ <pubdate>2005 年 11 月</pubdate>
+
+ <copyright>
+ <year>2005</year>
+ <year>2006</year>
+ <holder>&cnproj.freebsd.org;</holder>
+ </copyright>
+
&bookinfo.trademarks;
&bookinfo.legalnotice;
+
</bookinfo>
<chapter id="why-port">
@@ -594,24 +609,22 @@ PLIST_DIRS= lib/X11/oneko</programlisting>
<sect1 id="slow-patch">
<title>打补丁</title>
- <para>在您制作 port 的过程中, 文件的添加或修改都可以用
- &man.diff.1; 做成补丁, 使得今后的能够使用 &man.patch.1;
- 在安装过程中自动对 port 做出相应的修改。
- 每一个您想要打的补丁应该以
- <filename>patch-<replaceable>*</replaceable></filename>
- 这样形式的文件名保存, <replaceable>*</replaceable>
- 表示将要被打补丁的文件名,
- 例如 <filename>patch-Imakefile</filename>
- 或 <filename>patch-src-config.h</filename> 这样。
- 这些文件应该被放在 <makevar>PATCHDIR</makevar> 里,
- 这样这些补丁都会被自动打上。
- 所有的补丁必须相对于 <makevar>WRKSRC</makevar> 的
- (port 会把 tarball 解压缩在那里, 并完成余下的其它动作)。
- 为了使修改和升级变得更容易, 应避免使用多个
- patch 去修改同一个文件 (比如,
- <filename>patch-file</filename> 和 <filename>patch-file2</filename>
- 都修改 <filename><makevar>WRKSRC</makevar>/foobar.c</filename>
- 就应被避免)。<para>
+ <para>在您准备制作 port 的过程中, 增加或修改的文件,
+ 都可以通过 &man.diff.1; 来做成补丁。 希望应用到源代码上的每个补丁,
+ 都应保存为单独的文件, 并命名为
+ <filename>patch-<replaceable>*</replaceable></filename>, 其中
+ <replaceable>*</replaceable> 表示将要修改的文件的完整路径名,
+ 例如 <filename>patch-Imakefile</filename> 或
+ <filename>patch-src-config.h</filename>。 这些文件,
+ 都应保存在 <makevar>PATCHDIR</makevar>
+ (通常是 <filename>files/</filename>), 这里的补丁都会自动应用到源代码上。
+ 所有的补丁必须是相对于
+ <makevar>WRKSRC</makevar> 的 (一般而言, 您的 port 会将其
+ tarball 解压缩在那里, 并完成余下的工作)。 为了让修正和升级更容易,
+ 您应避免使用多个 patch 去修改同一个文件 (例如,
+ <filename>patch-file</filename> 以及
+ <filename>patch-file2</filename> 都修改
+ <filename><makevar>WRKSRC</makevar>/foobar.c</filename>) 这种情况。</para>
<para>只有 <literal>[-+._a-zA-Z0-9]</literal> 这些字符,
可以出现在补丁的文件名中, 请务必不要使用除这些字符以外的其它字符。
@@ -637,32 +650,33 @@ PLIST_DIRS= lib/X11/oneko</programlisting>
<command>configure</command>, 不要使用
<command>configure</command> 来做 diff
(这常常会有好几千行长!); 请定义
- <literal>USE_AUTOCONF_VER=213</literal> 并对应
+ <literal>USE_AUTOTOOLS=autoconf:253</literal> 并对应
<filename>configure.in</filename> 来制作 diff。</para>
- <para>往往在移植某个软件的时候会遇到这样一种情况,
+ <para>假如需要删除文件, 则应在
+ <maketarget>post-extract</maketarget> target,
+ 而不是作为补丁的一部分来完成。</para>
+
+ <para>除此之外, port 的
+ <filename>Makefile</filename> 还可以通过 in-place 模式的
+ &man.sed.1; 来直接进行简单的替换操作。 如果补丁需要使用变量值,
+ 这就非常有用了。 例如:</para>
+
+ <programlisting>post-patch:
+ @${REINPLACE_CMD} -e 's|for Linux|for FreeBSD|g' ${WRKSRC}/README
+ @${REINPLACE_CMD} -e 's|-pthread|${PTHREAD_LIBS}|' ${WRKSRC}/configure</programlisting>
+
+ <para>往往在移植某些软件的时候会遇到这样一种情况,
特别是这个软件是在 &windows; 上开发的时候,
大多数的源代码都需要进行CR/LF的转换。
- 这也许会给以后打补丁, 编译警告、 脚本执行造成问题 (
- <command>/bin/sh^M</command> not found) 等等。
- 您能加入以下这行代码来快速地把那些文件从
- CR/LF 转换到 LF:</para>
-
- <programlisting>USE_REINPLACE= yes
-
-post-extract:
- @${FIND} -E ${WRKDIR} -type f -iregex ".*\.(c|cpp|h|txt)" -print0 | \
- ${XARGS} -0 ${REINPLACE_CMD} -e 's/[[:cntrl:]]*$$//'</programlisting>
-
- <para>当然, 如果您想要处理所有文件的话,
- 就可以省略上面的 <option>-iregex</option> 选项。
- 请注意这段代码会从被处理文件的每一行里面剔除所有的控制字符。
- (但不包括 <literal>\n</literal>)。</para>
-
- <para>假如需要删除文件, 您可以在
- <maketarget>post-extract</maketarget> 里面做这件事,
- 而不是在把它作为一个补丁。 一旦您对您所做修改的感觉比较满意,
- 那么请把diff输出分成一个补丁对应一个源文件。</para>
+ 这很可能会给以后打补丁带来问题, 还可能触发编译警告,
+ 并给脚本的执行带来麻烦 (<command>/bin/sh^M</command> not found),
+ 等等。 要迅速将所有文件中的 CR/LF 改为只用 LF, 可以在 port 的
+ <filename>Makefile</filename> 中加入
+ <literal>USE_DOS2UNIX=yes</literal>。 除此之外,
+ 还可以指定一个需要执行这种转换操作的文件列表:</para>
+
+ <programlisting>USE_DOS2UNIX= util.c util.h</programlisting>
</sect1>
<sect1 id="slow-configure">
@@ -1452,6 +1466,12 @@ PORTEPOCH= 1</programlisting>
</row>
<row>
+ <entry><filename>hamradio*</filename></entry>
+ <entry>业余无线电爱好者使用的软件。</entry>
+ <entry></entry>
+ </row>
+
+ <row>
<entry><filename>haskell*</filename></entry>
<entry>有关 Haskell 编程语言的软件。</entry>
<entry></entry>
@@ -1581,14 +1601,14 @@ PORTEPOCH= 1</programlisting>
</row>
<row>
- <entry><filename>news</filename></entry>
- <entry>USENET新闻组相关软件。</entry>
+ <entry><filename>net-p2p</filename></entry>
+ <entry>对等网 (Peer to peer network) 应用程序。</entry>
<entry></entry>
</row>
<row>
- <entry><filename>offix*</filename></entry>
- <entry><ulink url="http://leb.net/offix/">OffiX</ulink> 相关的套件。</entry>
+ <entry><filename>news</filename></entry>
+ <entry>USENET新闻组相关软件。</entry>
<entry></entry>
</row>
@@ -1654,6 +1674,12 @@ PORTEPOCH= 1</programlisting>
</row>
<row>
+ <entry><filename>rubygems*</filename></entry>
+ <entry>移植版本的 <ulink url="http://www.rubygems.org/">RubyGems</ulink> 软件包。</entry>
+ <entry></entry>
+ </row>
+
+ <row>
<entry><filename>russian</filename></entry>
<entry>俄语语言支持。</entry>
<entry></entry>
@@ -2863,6 +2889,35 @@ PATCHFILES= patch1:test</programlisting>
中定义的 <makevar>MASTER_SITES</makevar>。</para>
</note>
</sect2>
+
+ <sect2>
+ <title><makevar>ALWAYS_KEEP_DISTFILES</makevar> (一直保存源码包)</title>
+
+ <para>如果您的 port 采用的是预编译的包,
+ 但却采用了某种要求源代码必须与预编译版本一同提供的授权,
+ 例如 GPL, 则应使用 <makevar>ALWAYS_KEEP_DISTFILES</makevar>
+ 来告诉 &os; 构建集群保留一份在 <makevar>DISTFILES</makevar>
+ 中文件的副本。 一般来说这些 port 的用户并不需要这些文件,
+ 因此, 只在定义了
+ <makevar>PACKAGE_BUILDING</makevar> 符的时候,
+ 才将源代码包文件加入 <makevar>DISTFILES</makevar> 是个好主意。
+ </para>
+
+ <example
+ id="ports-master-sites-n-example-always-keep-distfiles">
+ <title>如何使用 <makevar>ALWAYS_KEEP_DISTFILES</makevar>。</title>
+ <programlisting>.if defined(PACKAGE_BUILDING)
+DISTFILES+= <replaceable>foo.tar.gz</replaceable>
+ALWAYS_KEEP_DISTFILES= yes
+.endif</programlisting>
+ </example>
+
+ <para>当您在 <makevar>DISTFILES</makevar> 加入其它文件时,
+ 请务必确保这些文件也出现在了 <filename>distinfo</filename> 中。
+ 此外, 这些额外的文件通常也会展开到
+ <makevar>WRKDIR</makevar> 中, 对于某些 ports,
+ 这可能导致一些不希望的副作用, 因而需要进行特别的处理。</para>
+ </sect2>
</sect1>
<sect1 id="makefile-maintainer">
@@ -2877,11 +2932,14 @@ PATCHFILES= patch1:test</programlisting>
请不要在此处写任何说明性的文字, 例如您的真实姓名 &mdash; 这会给
<filename>bsd.port.mk</filename> 带来麻烦。</para>
- <para>详细的监护人职责说明,
- 可以在 <ulink url="&url.books.developers-handbook;/policies.html#POLICIES-MAINTAINER">Makefile
- 中的 MAINTAINER</ulink> 小节中找到。</para>
+ <para>监护人有责任保持 port 随时更新, 并确保其能够正确地运行。
+ 详细的 port 监护人职责说明, 请参见 <ulink
+ url="&url.articles.contributing-ports;/maintain-port.html">
+ port 监护人面临的挑战</ulink> 一节。</para>
- <para>假如某一 port 的监护人没有在两周之内 (不包括主要的公共假日)
+ <para>对于 port 的修改, 应被发给 port 的监护人进行复审,
+ 且在 commit 之前需要获得其监护人的同意。
+ 假如某一 port 的监护人没有在两周之内 (不包括主要的公共假日)
响应来自用户的更新请求, 则可视为监护人超时,
在这种情况下可以在没有监护人明确同意的情形下进行更新。
如果监护人在多达三个月的时间内没有进行任何响应,
@@ -2889,6 +2947,11 @@ PATCHFILES= patch1:test</programlisting>
尽管如此, 监护人为 &a.portmgr; 或者 &a.security-officer; 的 port
不受此限。 对监护人为这些小组的 port 进行未经许可的 commit 是不允许的。</para>
+ <para>我们保留对监护人所提交修正案进行改动的权力, 以便使其更符合现行的 Ports
+ Collection 规范, 而无需提交补丁的人明确批准。 此外, 大规模的基础性修改,
+ 也可能使 port 在没有得到监护人同意的情形下进行修改。
+ 但这类修改都不会影响 port 本身的功能。</para>
+
<para>&a.portmgr; 保留以任何原因收回或绕过任何人监护权的权力,
而 &a.security-officer; 则保留以安全原因收回或绕过监护权的权力。</para>
</sect1>
@@ -2927,7 +2990,7 @@ PATCHFILES= patch1:test</programlisting>
而 <replaceable>dir</replaceable> 则是在找不到时应该从哪里构建和安装,
最后, <replaceable>target</replaceable> 用于指定在那个目录中调用的
target。 例如,
- <programlisting>LIB_DEPENDS= jpeg.9:${PORTSDIR}/graphics/jpeg:install</programlisting>
+ <programlisting>LIB_DEPENDS= jpeg.9:${PORTSDIR}/graphics/jpeg</programlisting>
会检测主版本号为 9 的 jpeg 共享库, 如果它不存在,
则会进入到您的 ports 目录中的 <filename>graphics/jpeg</filename>
子目录, 并构建和安装它。 如果您指定的 <replaceable>target</replaceable>
@@ -3077,8 +3140,7 @@ PATCHFILES= patch1:test</programlisting>
元组的表。 例如, <programlisting> PATCH_DEPENDS=
${NONEXISTENT}:${PORTSDIR}/java/jfc:extract
</programlisting> 表示进入到您的 ports 目录中的
- <filename>java/jfc</filename> 子目录, 并将其解压缩,
- 而无论它是否之前安装过。</para>
+ <filename>java/jfc</filename> 子目录, 并将其解压缩。</para>
<para>这个依赖关系是在
<maketarget>patch</maketarget> target 的过程中检查的。
@@ -3167,9 +3229,7 @@ PATCHFILES= patch1:test</programlisting>
则将使用基本系统中所提供的 <command>gcc</command>, 反之,
系统会从 ports 中安装所希望版本的 <command>gcc</command>,
并调整 <makevar>CC</makevar> 以及
- <makevar>CXX</makevar> 变量的设置。 需要注意的是,
- <makevar>USE_GCC</makevar> 不能与
- <makevar>USE_LIBTOOL_VER</makevar> 联用。</entry>
+ <makevar>CXX</makevar> 变量的设置。</entry>
</row>
</tbody>
@@ -3200,6 +3260,20 @@ PATCHFILES= patch1:test</programlisting>
</sect2>
<sect2>
+ <title>在依赖关系中指定最低版本</title>
+
+ <para>在依赖某个其他 port 时, 可以以下面的句法在
+ <makevar>*_DEPENDS</makevar> 变量中指定最低版本:</para>
+
+ <programlisting>p5-Spiffy>=0.26:${PORTSDIR}/devel/p5-Spiffy</programlisting>
+
+ <para>第一个字段指明了所依赖 package 的名字,
+ 用以与 package 数据库中的某项匹配, 然后是比较算符,
+ 以及 package 的版本号。 前面的例子中,
+ 如果系统中安装了 p5-Spiffy-0.26 则认为满足了依赖条件。</para>
+ </sect2>
+
+ <sect2>
<title>关于依赖关系的补充说明</title>
<para>如前面所提到的那样, 在需要某一依赖的 port 时,
@@ -3442,9 +3516,9 @@ ${PREFIX}/man/ja/man4/baz.4.gz</programlisting>
<entry><makevar>WITH_APACHE2</makevar></entry>
<entry>如果定义了这个变量, 则使用
- <filename role="package">www/apache2</filename>
+ <filename role="package">www/apache20</filename>
而不是默认的
- <filename role="package">www/apache</filename>。</entry>
+ <filename role="package">www/apache13</filename>。</entry>
</row>
<row>
@@ -3785,6 +3859,18 @@ LDCONFIG_DIRS= %%PREFIX%%/lib/foo %%PREFIX%%/lib/bar</programlisting>
</sect2>
<sect2>
+ <title><makevar>NOFETCHFILES</makevar> (不自动抓取指定的文件)</title>
+
+ <para>在 <makevar>NOFETCHFILES</makevar> 变量中定义的文件,
+ 不会自动从
+ <makevar>MASTER_SITES</makevar> 抓取。 一种典型的用例是,
+ 使用来自某个软件供应商提供的 CD-ROM 上的文件。</para>
+
+ <para>用于检查在 <makevar>MASTER_SITES</makevar> 上是否包含了所需文件的工具,
+ 应忽略这些文件, 而不是报告它们不存在。</para>
+ </sect2>
+
+ <sect2>
<title><makevar>RESTRICTED</makevar> (禁止任何形式的再分发)</title>
<para>如果应用程序既不允许镜像其 <makevar>DISTFILES</makevar>,
@@ -3994,24 +4080,23 @@ LDCONFIG_DIRS= %%PREFIX%%/lib/foo %%PREFIX%%/lib/bar</programlisting>
<para>使用 GNU 构建框架的共享库通常会使用
<command>libtool</command> 来调整共享库的编译和安装,
- 以便与所运行的操作系统相匹配。 Ports Collection
- 提供了一系列经过修改以适应 &os; 的不同版本的 <command>libtool</command>。</para>
+ 以便与所运行的操作系统相匹配。 通常的做法是使用应用程序所附带的
+ <command>libtool</command> 副本。
+ 如果需要使用外部的 <command>libtool</command>,
+ 则可以使用 Ports 套件提供的版本:</para>
- <programlisting>USE_AUTOTOOLS= libtool:<replaceable>版本</replaceable>[:inc|:env]</programlisting>
+ <programlisting>USE_AUTOTOOLS= libtool:<replaceable>版本</replaceable>[:env]</programlisting>
<para>如果不使用额外的操作符,
<literal>libtool:<replaceable>版本</replaceable></literal>
- 将告诉构建框架 port 希望使用
- <command>libtool</command>, 这也暗含地定义了
- <makevar>GNU_CONFIGURE</makevar>。 configure 脚本将使用系统安装的
- <command>libtool</command> 版本进行修补。 更进一步,
- 还将设置一系列 make 和 shell 变量, 以便 port 使用。 请参见
+ 表示希望构建框架使用 configure 脚本来对系统所安装的 <command>libtool</command>
+ 进行修补。 这会暗含地定义 <makevar>GNU_CONFIGURE</makevar>。
+ 更进一步, 构建框架还会设置一系列 make 和 shell
+ 变量用于 port 后续的操作。 请参见
<filename>bsd.autotools.mk</filename> 了解进一步的详情。</para>
- <para>如果使用 <literal>:inc</literal> 操作符, 则会设置环境,
- 但使用一些略微不同的补丁。</para>
-
- <para>如果使用 <literal>:env</literal> 操作符, 则只设置环境。</para>
+ <para>如果指定了 <literal>:env</literal> 操作符, 则表示只设置环境,
+ 而跳过其他的操作。</para>
<informaltable frame="none">
<tgroup cols="2">
@@ -4025,15 +4110,15 @@ LDCONFIG_DIRS= %%PREFIX%%/lib/foo %%PREFIX%%/lib/bar</programlisting>
<tbody>
<row>
- <entry><literal>USE_LIBTOOL_VER=13</literal></entry>
+ <entry><literal>USE_LIBTOOL_VER=15</literal></entry>
- <entry><literal>libtool:13</literal></entry>
+ <entry><literal>libtool:15</literal></entry>
</row>
<row>
<entry><literal>USE_INC_LIBTOOL_VER=15</literal></entry>
- <entry><literal>libtool:15:inc</literal></entry>
+ <entry>已不再使用</entry>
</row>
<row>
@@ -4357,7 +4442,8 @@ LDCONFIG_DIRS= %%PREFIX%%/lib/foo %%PREFIX%%/lib/bar</programlisting>
<para>Perl 模块通常并没有官方网站, 这些 port
应将 <hostid>cpan.org</hostid> 作为其
<filename>pkg-descr</filename> WWW 行的内容。 推荐的 URL 格式为
- <literal>http://search.cpan.org/dist/Module-Name</literal>。</para>
+ <literal>http://search.cpan.org/dist/Module-Name/</literal>
+ (保留最后的斜线)。</para>
</note>
</sect1>
@@ -4366,7 +4452,7 @@ LDCONFIG_DIRS= %%PREFIX%%/lib/foo %%PREFIX%%/lib/bar</programlisting>
<title>使用 X11</title>
<sect2 id="x11-variables">
- <title>Variable definitions</title>
+ <title>变量定义</title>
<table frame="none">
<title>用到 X 的 port 可以使用的变量</title>
@@ -4577,6 +4663,21 @@ USE_XLIB= yes</programlisting>
</sect2>
+ <sect2>
+ <title>通过 Xvfb 来获得虚拟的 <envar>DISPLAY</envar></title>
+
+ <para>某些应用程序必须在有可用的 X11 显示的时候才能成功编译。
+ 这会给 FreeBSD 预编译包构建集群带来麻烦, 因为它们是不接显示器的。
+ 通过下面的官方 hack, 预编译包构建集群将启动采用虚拟帧缓存的
+ X server。 这样, 编译过程将有可用的 <envar>DISPLAY</envar>。</para>
+
+ <programlisting>.if defined(PACKAGE_BUILDING)
+BUILD_DEPENDS+= Xvfb:${X_VFBSERVER_PORT} \
+ ${X11BASE}/lib/X11/fonts/misc/8x13O.pcf.gz:${X_FONTS_MISC_PORT}
+.endif</programlisting>
+
+ </sect2>
+
</sect1>
<sect1 id="using-gnome">
@@ -4587,23 +4688,6 @@ USE_XLIB= yes</programlisting>
<ulink url="http://www.FreeBSD.org/gnome/docs/porting.html">这些变量的详细列表</ulink>
可以在 FreeBSD/GNOME 项目的主页找到。</para>
- <note>
- <para>如果只是安装
- <application>pkg-config</application> 元数据文件到
- <filename><makevar>PREFIX</makevar>/libdata/pkgconfig</filename>
- 的话, 您的 port 就不需要依赖 GNOME。 同其它 port 类似,
- 您的 port 应做好清理的准备, 并删除那些空目录。 假定您的 port 安装
- <filename>gtkmumble.pc</filename> 到上述位置,
- 则应在 <filename>pkg-plist</filename> 中加入:</para>
-
- <programlisting>libdata/pkgconfig/gtkmumble.pc
-@unexec rmdir %B 2>/dev/null || true</programlisting>
-
- <para>后一行必须紧挨前一行, 以便 <literal>%B</literal> 能够正确地展开。
- 请参考 &man.pkg.create.1; 以进一步了解关于 <filename>pkg-plist</filename>
- 中所用的语法的资料。</para>
- </note>
-
</sect1>
<sect1 id="using-kde">
@@ -5517,64 +5601,81 @@ USE_SDL+= mixer
<sect1 id="rc-scripts">
<title>启动和停止服务 (rc 脚本)</title>
- <para>系统引导时, 启动脚本会被用来启动服务; 此外,
- 它还为管理员提供了一种标准的方式来停止、 启动或重启服务。
- 在系统的 <filename>rc.d</filename> 框架中集成了对于 ports 的支持。
- 关于如何使用它的具体介绍, 可以在
- <ulink url="&url.books.handbook;/configtuning-rcng.html">使用手册中的对应章节</ulink>
- 找到。 可用命令的详细介绍, 则可以在
- &man.rc.subr.8; 找到。</para>
+ <para><filename>rc.d</filename> 脚本在系统启动时用于启动服务,
+ 并为管理员提供停止、 启动和重新启动某个服务的标准方法。 Ports
+ 安装的脚本会集成到系统的 <filename>rc.d</filename> 框架中。
+ 关于如何使用它的说明, 可以在
+ <ulink url="&url.books.handbook;/configtuning-rcd.html">使用手册的 rc.d
+ 章节</ulink> 找到。 关于可用命令的详细解释, 则可以在
+ &man.rc.8; 和 &man.rc.subr.8; 找到。</para>
<para>可以安装一或多个 rc 脚本:</para>
- <programlisting>USE_RC_SUBR= doorman.sh</programlisting>
+ <programlisting>USE_RC_SUBR= doormand.sh</programlisting>
<para>这些脚本必须放到 <filename>files</filename>
- 目录, 并附加 <literal>.in</literal> 后缀。 与基本系统中的 rc
- 脚本唯一的区别在于, 这种脚本中的
- <literal>.&nbsp;/etc/rc.subr</literal> 行应替换为
+ 目录, 并附加 <literal>.in</literal>。
+ 与基本系统中的 <filename>rc.d</filename> 脚本不同, 这种脚本中
+ <literal>.&nbsp;/etc/rc.subr</literal> 行必须替换为
<literal>.&nbsp;%%RC_SUBR%%</literal>, 因为较早版本的 &os;
- 并没有 <filename>/etc/rc.subr</filename> 文件。 此外还可以使用标准的
- <makevar>SUB_LIST</makevar> 展开。 特别推荐使用
- <literal>%%PREFIX%%</literal>。 关于
- <makevar>SUB_LIST</makevar> 的进一步介绍可以参考 <link
- linkend="using-sub-files">相关章节</link>。</para>
-
- <para>与 &man.rcorder.8; 的集成是通过
+ 中并不提供 <filename>/etc/rc.subr</filename> 文件。 此外,
+ 这里还可以使用标准的
+ <makevar>SUB_LIST</makevar> 替换展开。 除此之外,
+ 我们还强烈推荐使用 <literal>%%PREFIX%%</literal>、
+ <literal>%%LOCALBASE%%</literal>, 以及
+ <literal>%%X11BASE%%</literal> 这几个替换展开。 关于
+ <makevar>SUB_LIST</makevar> 的介绍可以在 <link
+ linkend="using-sub-files">本书的相关章节</link> 找到。</para>
+
+ <para>在 &os;&nbsp;6.1-RELEASE 之前, 与 &man.rcorder.8; 的集成是通过
<makevar>USE_RCORDER</makevar> 而不是
- <makevar>USE_RC_SUBR</makevar> 来完成的。</para>
+ <makevar>USE_RC_SUBR</makevar> 来完成的。 但是,
+ 这种方法已经被淘汰。</para>
+
+ <para>从 &os;&nbsp;6.1-RELEASE 开始, 本地安装的 <filename>rc.d</filename>
+ 脚本 (包括由 port 安装的脚本) 会纳入基本系统的 &man.rcorder.8;。</para>
- <para>以下是一个简单的 rc 脚本:</para>
+ <para>以下是一个简单的 <filename>rc.d</filename> 脚本:</para>
<programlisting>#!/bin/sh
-# PROVIDE: doorman
+# PROVIDE: doormand
# REQUIRE: LOGIN
-# KEYWORD: FreeBSD
-
#
-# 在 /etc/rc.conf 中增加下述设置可以启用 doorman:
-# doorman_enable (bool): 默认设为 "NO"。
-# 设为 "YES" 表示启用 doorman。
-# doorman_config (path): 默认设为 "%%PREFIX%%/etc/doormand/doormand.cf"。
+# 在 /etc/rc.conf.local 或 /etc/rc.conf 中增加下述设置可以启用这一服务:
+#
+# doormand_enable (bool): 默认设为 NO。
+# 设为 YES 可以启用 doormand。
+# doormand_config (path): 默认设为 %%PREFIX%%/etc/doormand/doormand.cf。
#
. %%RC_SUBR%%
-name="doorman"
-rcvar=`set_rcvar`
-
-load_rc_config $name
-
-: ${doorman_enable="NO"}
-: ${doorman_config="%%PREFIX%%/etc/doormand/doormand.cf"}
+name="doormand"
+rcvar=${name}_enable
command=%%PREFIX%%/sbin/doormand
+command_args="-p $pidfile -f $doormand_config"
pidfile=/var/run/doormand.pid
-command_args="-p $pidfile -f $doorman_config"
+
+load_rc_config $name
+
+: ${doormand_enable="NO"}
+: ${doormand_config="%%PREFIX%%/etc/doormand/doormand.cf"}
run_rc_command "$1"</programlisting>
+ <para>这里, 对变量的默认赋值方法应采用 &quot;=&quot;,
+ 而非 &quot;:=&quot; 这样的形式。 这是因为,
+ 前一种赋值方法只有在变量未被设置时才设置默认值,
+ 而后一种方法则会在变量没有设置,
+ <emphasis>或者</emphasis> 其值为空时都设置默认值。
+ 用户非常可能在其
+ <filename>rc.conf.local</filename> 中使用类似
+ <programlisting>doormand_flags=""</programlisting> 这样的设置,
+ 而采用 &quot;:=&quot; 来进行赋值,
+ 则会在不经意间覆盖用户所希望的设置。</para>
+
</sect1>
</chapter>
@@ -5669,15 +5770,15 @@ lib/X11/oneko/sounds/cat.au
@dirrm lib/X11/oneko</programlisting>
<para>然而, 有时 <literal>@dirrm</literal> 会由于其它 port
- 使用了同一个目录而发生错误。 您可以在 <literal>@unexec</literal>
- 中调用 <command>rmdir</command> 以便只删除空目录,
- 而不给出任何警告。</para>
+ 使用了同一个目录而发生错误。
+ 利用 <literal>@dirrmtry</literal> 可以只删除那些空目录,
+ 而避免给出警告。</para>
- <programlisting>@unexec rmdir %D/share/doc/gimp 2>/dev/null || true</programlisting>
+ <programlisting>@dirrmtry share/doc/gimp</programlisting>
<para>按照上面的写法, 将不会显示任何错误信息, 而且,即使在
- <filename><makevar>PREFIX</makevar>/share/doc/gimp</filename>
- 由于其它 port 在其中安装了一些文件的情况下, 它也不会导致
+ <filename><makevar>${PREFIX}</makevar>/share/doc/gimp</filename>
+ 由于其它 port 在其中安装了一些别的文件的时候, 也不会导致
&man.pkg.delete.1; 异常退出。</para>
</sect2>
@@ -5736,6 +5837,34 @@ etc/orbit.conf.sample
以便让软件能开始正常工作。</para>
</sect1>
+ <sect1 id="plist-dynamic">
+ <title>动态装箱单与静态装箱单的对比</title>
+
+ <para><emphasis>静态装箱单</emphasis> 是指在 Ports Collection 中以
+ <filename>pkg-plist</filename> 文件 (可能包含变量替换),
+ 或以 <makevar>PLIST_FILES</makevar> 和 <makevar>PLIST_DIRS</makevar>
+ 的形式嵌入到 <filename>Makefile</filename> 出现的装箱单。
+ 即使它是由工具或 Makefile 中的某个 target 在经由 committer 加入到
+ Ports Collection <emphasis>之前</emphasis> 自动生成的也是如此,
+ 因为可以在不下载或编译源代码包的前提下对其进行检视。</para>
+
+ <para><emphasis>动态装箱单</emphasis> 是指在 port
+ 编译并安装时生成的装箱单。 在下载并编译您所移植的应用程序的源代码之前,
+ 或在执行了 <literal>make
+ clean</literal> 之后, 就无法查看其内容了。</para>
+
+ <para>尽管使用动态装箱单并不被禁止, 但监护人应尽可能使用静态装箱单,
+ 因为它能够让用户使用 &man.grep.1;来发现所需的 ports,
+ 例如, 它是否会安装某个特定文件。 动态列表主要应用于复杂的,
+ 其装箱单随所选功能会发生巨变 (因而使得维护静态装箱单不再可行),
+ 或那些随版本而改变装箱单内容的 port (例如, 使用
+ <application>Javadoc</application> 来生成文档的那些 ports)。</para>
+
+ <para>我们鼓励那些选择使用动态装箱单的监护人提供一个能够生成
+ <filename>pkg-plist</filename> 的 target, 以便于用户检视其内容。</para>
+
+ </sect1>
+
<sect1 id="plist-autoplist">
<title>装箱单 (package list) 的自动化制作</title>
@@ -5971,8 +6100,8 @@ etc/orbit.conf.sample
在 <makevar>FILESDIR</makevar> 目录中都必须有一个对应的
<filename><replaceable>文件</replaceable>.in</filename>。
修改后的版本将保存在 <makevar>WRKDIR</makevar>。
- 在 <makevar>USE_RC_SUBR</makevar> 和
- <makevar>USE_RCORDER</makevar> 中定义的文件会自动加入到
+ 在 <makevar>USE_RC_SUBR</makevar> (或已经过时的
+ <makevar>USE_RCORDER</makevar>) 中定义的文件会自动加入到
<makevar>SUB_FILES</makevar> 中。 对于
<filename>pkg-message</filename>、
<filename>pkg-install</filename>、 <filename>pkg-deinstall</filename>
@@ -6002,7 +6131,7 @@ SUB_LIST= ARCH=${ARCH}</programlisting>
<para>下面是一个正确的 <filename>pkg-message.in</filename> 例子:</para>
- <programlisting>Now it's time to configure this package.
+ <programlisting>Now it is time to configure this package.
Copy %%PREFIX%%/share/examples/putsy/%%ARCH%%.conf into your home directory
as .putsy.conf and edit it.</programlisting>
@@ -8042,6 +8171,11 @@ Reference: &lt;http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00
<entry>504104</entry>
</row>
<row>
+ <entry>在 MFC 了 ldconfig_local_dirs
+ 修改之后的 5.4-STABLE。</entry>
+ <entry>504105</entry>
+ </row>
+ <row>
<entry>6.0-CURRENT</entry>
<entry>600000</entry>
</row>
@@ -8198,6 +8332,28 @@ Reference: &lt;http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00
<entry>600100</entry>
</row>
<row>
+ <entry>将 local_startup 目录中的脚本集成到基本系统的 &man.rcorder.8;
+ 之后的 6.0-STABLE。</entry>
+ <entry>600101</entry>
+ </row>
+ <row>
+ <entry>更新 ELF 类型和常量之后的 6.0-STABLE。</entry>
+ <entry>600102</entry>
+ </row>
+ <row>
+ <entry>MFC 了 pidfile(3) API 之后的 6.0-STABLE。</entry>
+ <entry>600103</entry>
+ </row>
+ <row>
+ <entry>在 MFC 了 ldconfig_local_dirs
+ 修改之后的 6.0-STABLE。</entry>
+ <entry>600104</entry>
+ </row>
+ <row>
+ <entry>在 csh(1) 中加入了 NLS 目录支持之后的 6.0-STABLE。</entry>
+ <entry>600105</entry>
+ </row>
+ <row>
<entry>7.0-CURRENT。</entry>
<entry>700000</entry>
</row>
@@ -8230,6 +8386,46 @@ Reference: &lt;http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00
成员, 并删除 IFP2ENADDR() 之后的 7.0-CURRENT。</entry>
<entry>700006</entry>
</row>
+ <row>
+ <entry>将 local_startup 目录中的脚本集成到基本系统的 &man.rcorder.8;
+ 之后的 7.0-CURRENT。</entry>
+ <entry>700007</entry>
+ </row>
+ <row>
+ <entry>去掉 MNT_NODEV 挂接选项之后的 7.0-CURRENT。</entry>
+ <entry>700008</entry>
+ </row>
+ <row>
+ <entry>对 ELF-64 类型和符号版本进行变更之后的
+ 7.0-CURRENT。</entry>
+ <entry>700009</entry>
+ </row>
+ <row>
+ <entry>增加 hostb 和 vgapci 驱动、 pci_find_extcap(),
+ 并将 AGP 驱动改为不再影射 aperature
+ 之后的 7.0-CURRENT。</entry>
+ <entry>700010</entry>
+ </row>
+ <row>
+ <entry>除 Alpha 之外的所有平台上 tv_sec 改为 time_t
+ 之后的 7-0.CURRENT。</entry>
+ <entry>700011</entry>
+ </row>
+ <row>
+ <entry>修改 ldconfig_local_dirs 之后的 7-0.CURRENT。</entry>
+ <entry>700012</entry>
+ </row>
+ <row>
+ <entry>在修改了
+ <filename>/etc/rc.d/abi</filename> 以支持
+ <filename>/compat/linux/etc/ld.so.cache</filename>
+ 以某只读文件系统上的符号连接形式存在之后的 7-0.CURRENT。</entry>
+ <entry>700013</entry>
+ </row>
+ <row>
+ <entry>引入 pts 之后的 7-0.CURRENT。</entry>
+ <entry>700014</entry>
+ </row>
</tbody>
</tgroup>
</table>
@@ -8349,7 +8545,7 @@ Reference: &lt;http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00
<filename>bsd.port.pre.mk</filename> 之后可以进行的判断:</para>
<programlisting># 如果 perl5 已经在系统中提供, 则不必编译 lang/perl5
-.if ${OSVERSION} > 300003
+.if ${OSVERSION} &gt; 300003
BROKEN= perl is in system
.endif
@@ -8481,6 +8677,22 @@ post-install:
作为文件的目的地。</para>
</sect1>
+ <sect1 id="dads-sh-exec">
+ <title>在 wrapper 脚本中使用 <function>exec</function> 语句</title>
+
+ <para>如果 port 安装了用以启动其他程序的脚本,
+ 并且运行其他程序是这些脚本的最后一项操作,
+ 请务必使用 <function>exec</function> 语句来运行这些程序, 例如:</para>
+
+ <programlisting>#!/bin/sh
+exec %%LOCALBASE%%/bin/java -jar %%DATADIR%%/foo.jar "$@"</programlisting>
+
+ <para>使用 <function>exec</function> 语句表示执行指定的程序来取代 shell
+ 进程。 如果省略了 <function>exec</function>,
+ 则 shell 进程会一直在内存中, 从而不必要地消耗了额外的系统资源。</para>
+
+ </sect1>
+
<sect1 id="dads-uid-and-gids">
<title>UID 和 GID</title>
@@ -8568,6 +8780,7 @@ smxq:*:261:261:Sendmail X QMGR:/nonexistent:/sbin/nologin
smxc:*:262:262:Sendmail X SMTPC:/nonexistent:/sbin/nologin
smxm:*:263:263:Sendmail X misc:/nonexistent:/sbin/nologin
smx:*:264:264:Sendmail X other:/nonexistent:/sbin/nologin
+mrtg:*:279:279:MRTG daemon:/nonexistent:/sbin/nologin
ldap:*:389:389:OpenLDAP Server:/nonexistent:/sbin/nologin
drweb:*:426:426:Dr.Web Mail Scanner:/nonexistent:/sbin/nologin
courier:*:465:465:Courier Mail Server:/nonexistent:/sbin/nologin
@@ -8596,6 +8809,7 @@ dialer:*:68:
network:*:69:
pgsql:*:70:
simscan:*:74:
+audit:*:77:
www:*:80:
qnofiles:*:81:
qmail:*:82:
@@ -8642,6 +8856,7 @@ smxq:*:261:
smxc:*:262:
smxm:*:263:
smx:*:264:
+mrtg:*:279:
ldap:*:389:
drweb:*:426:
courier:*:465:
@@ -8762,6 +8977,19 @@ bacula:*:910:</programlisting>
</sect1>
+ <sect1 id="dads-pthread">
+ <title>线程库</title>
+
+ <para>在 &os; 上, 线程库必须通过特殊的连接器参数
+ <literal>-pthread</literal> 连接到可执行文件。 如果 port 一定要直接连接
+ <literal>-lpthread</literal> 或 <literal>-lc_r</literal>,
+ 则应将其改为使用由 ports 框架提供的 <makevar>PTHREAD_LIBS</makevar>。
+ 这个变量的值通常是 <literal>-pthread</literal>,
+ 但在某些特定平台上的 &os; 版本中, 它可能是其它值, 因此, 不要将
+ <literal>-pthread</literal> 硬编码到您的补丁中, 而应使用
+ <makevar>PTHREAD_LIBS</makevar> 变量。</para>
+ </sect1>
+
<sect1 id="dads-freedback">
<title>反馈</title>
@@ -8906,24 +9134,19 @@ bacula:*:910:</programlisting>
<sect2 id="dads-noinstall-notes">
<title>实现说明</title>
- <para>由于 <filename>bsd.port.mk</filename> 和其它一些地方
- <makevar>IGNORECMD</makevar> 的一些特殊用法,
- <makevar>BROKEN</makevar> 的值应该用引号括起来,
- 而 <makevar>IGNORE</makevar> 则不能用引号括起来。</para>
-
- <para>此外, 由于显示给用户的方式不同,
+ <para>这些字串不应使用引号括起来。 此外, 由于显示给用户的方式不同,
这些字串的措辞也应有所不同。 例如:</para>
- <programlisting>BROKEN= "this port is unsupported on FreeBSD 5.x"</programlisting>
+ <programlisting>BROKEN= this port is unsupported on FreeBSD 5.x</programlisting>
<programlisting>IGNORE= is unsupported on FreeBSD 5.x</programlisting>
<para>它们分别会在
<command>make describe</command> 时产生下面的输出:</para>
- <programlisting>===> foobar-0.1 is marked as broken: this port is unsupported on FreeBSD 5.x.</programlisting>
+ <programlisting>===&gt; foobar-0.1 is marked as broken: this port is unsupported on FreeBSD 5.x.</programlisting>
- <programlisting>===> foobar-0.1 is unsupported on FreeBSD 5.x.</programlisting>
+ <programlisting>===&gt; foobar-0.1 is unsupported on FreeBSD 5.x.</programlisting>
</sect2>
</sect1>
@@ -8997,7 +9220,7 @@ IGNORE=POINTYHAT is not supported
<command>make describe</command> 时发生问题 (因而,
ports <command>make index</command> 也会无法正常工作)。
绕过这个问题的方法, 是在判断语句周围增加空格, 例如:
- <programlisting>if ( ${OSVERSION} > 500023 )</programlisting>
+ <programlisting>if ( ${OSVERSION} &gt; 500023 )</programlisting>
请小心, 在 4.9 或 5.2 上测试安装,
是 <emphasis>不能</emphasis> 检测到这个问题的。</para>
</listitem>