diff options
author | Xin LI <delphij@FreeBSD.org> | 2006-03-15 19:45:37 +0000 |
---|---|---|
committer | Xin LI <delphij@FreeBSD.org> | 2006-03-15 19:45:37 +0000 |
commit | 639205b60c99afefb07be3bccecf1b6eb04c0629 (patch) | |
tree | 38d28fee57724331ba46db143a6184ba5cfbf86b /zh_CN.GB2312/books/porters-handbook | |
parent | b99e83b0a7c48690c2e6b7699bbd549e9a2c8da1 (diff) |
Notes
Diffstat (limited to 'zh_CN.GB2312/books/porters-handbook')
-rw-r--r-- | zh_CN.GB2312/books/porters-handbook/book.sgml | 515 |
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> 请不要在此处写任何说明性的文字, 例如您的真实姓名 — 这会给 <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>. /etc/rc.subr</literal> 行应替换为 + 目录, 并附加 <literal>.in</literal>。 + 与基本系统中的 <filename>rc.d</filename> 脚本不同, 这种脚本中 + <literal>. /etc/rc.subr</literal> 行必须替换为 <literal>. %%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; 6.1-RELEASE 之前, 与 &man.rcorder.8; 的集成是通过 <makevar>USE_RCORDER</makevar> 而不是 - <makevar>USE_RC_SUBR</makevar> 来完成的。</para> + <makevar>USE_RC_SUBR</makevar> 来完成的。 但是, + 这种方法已经被淘汰。</para> + + <para>从 &os; 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>这里, 对变量的默认赋值方法应采用 "=", + 而非 ":=" 这样的形式。 这是因为, + 前一种赋值方法只有在变量未被设置时才设置默认值, + 而后一种方法则会在变量没有设置, + <emphasis>或者</emphasis> 其值为空时都设置默认值。 + 用户非常可能在其 + <filename>rc.conf.local</filename> 中使用类似 + <programlisting>doormand_flags=""</programlisting> 这样的设置, + 而采用 ":=" 来进行赋值, + 则会在不经意间覆盖用户所希望的设置。</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: <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: <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: <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: <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} > 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>===> 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>===> 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} > 500023 )</programlisting> 请小心, 在 4.9 或 5.2 上测试安装, 是 <emphasis>不能</emphasis> 检测到这个问题的。</para> </listitem> |