diff options
Diffstat (limited to 'zh_CN.GB2312/books/porters-handbook/book.sgml')
-rw-r--r-- | zh_CN.GB2312/books/porters-handbook/book.sgml | 2135 |
1 files changed, 1212 insertions, 923 deletions
diff --git a/zh_CN.GB2312/books/porters-handbook/book.sgml b/zh_CN.GB2312/books/porters-handbook/book.sgml index 2465ed7954..1fe685f65d 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.603 + Original Revision: 1.639 $FreeBSD$ --> @@ -42,7 +42,7 @@ <para>几乎每个人都是通过 FreeBSD Ports Collection 在 FreeBSD 上面装应用程序 (“ports”)的。 - 就像FreeBSD的其他部分一样, 它主要来自于志愿者的努力。 + 就像FreeBSD的其它部分一样, 它主要来自于志愿者的努力。 所以在阅读这份文档的时候请务必记住这些。</para> <para>在 FreeBSD 的世界里, 任何人都能提交新的 port, @@ -65,7 +65,7 @@ <filename>/usr/ports/Mk/bsd.port.mk</filename>, 所有 port 的 Makefile 文件都会包含它。 即使不是每天都去摆弄 Makefile, 您也会从那个文件里面获得很多知识, 里面的注释非常详细。 - 还有要补充一下,如果您有其他的问题, 可以给&a.ports; + 还有要补充一下,如果您有其它的问题, 可以给&a.ports; 这个 mailing list 发信。</para> <note> @@ -73,7 +73,7 @@ (<makevar><replaceable>VAR</replaceable></makevar>) 是不能修改的。 大多 (但不是全部) 都在 <filename>/usr/ports/Mk/bsd.port.mk</filename> - 的开始部分进行了介绍; 其他一些也应该可以在那里找到。 + 的开始部分进行了介绍; 其它一些也应该可以在那里找到。 注意这些文件使用了非标准的制表符: <application>Emacs</application> 和 <application>Vim</application> 应该能在打开文件的时候自动识别它, @@ -139,7 +139,7 @@ USE_IMAKE= yes 不论它是不是打算成为 package。 它们是 <filename>pkg-descr</filename> 和 <filename>pkg-plist</filename>。 这两个文件使用 <filename>pkg-</filename> - 前缀以区别于其他文件。</para><!-- NOT GOOD --> + 前缀以区别于其它文件。</para><!-- NOT GOOD --> <sect2> <title><filename>pkg-descr</filename> (关于 port 的冗长描述文件)</title> @@ -157,21 +157,18 @@ USE_IMAKE= yes 如果要移植的软件有官方的WWW网页, 您应该在这里列出来。 使用 <literal>WWW:</literal> 作为前缀来表示 <emphasis>一个</emphasis>网站, - 这样其他的自动工具就能正常工作了。</para> + 这样其它的自动工具就能正常工作了。</para> </note> - <para>建议您在文件的最后留下您的名字, - 就像这样:</para> + <para>下面是一个简单的 + <filename>pkg-descr</filename> 例子:</para> <programlisting>This is a port of oneko, in which a cat chases a poor mouse all over the screen. : (etc.) -WWW: http://www.oneko.org/ - -- Satoshi -asami@cs.berkeley.edu</programlisting> +WWW: http://www.oneko.org/</programlisting> </sect2> <sect2> @@ -205,10 +202,10 @@ lib/X11/oneko/mouse.xpm </note> <note> - <para>手工创建一份这样的文件列表是一件非常枯燥的事情。 - 如果 port 要安装非常多的文件的话, 请参考 <link - linkend="porting-autoplist">自动创建这个文件列表</link> - 一节, 会帮您省下不少时间。</para> + <para>手工创建这样一份列表可能是一件非常枯燥的事情。 + 如果您的 port 需要安装大量的文件, <link + linkend="plist-autoplist">自动创建装箱单</link> + 会帮您省下不少时间。</para> </note> <para>只有一种情况可以不用 <filename>pkg-plist</filename>文件。 @@ -230,16 +227,16 @@ PLIST_DIRS= lib/X11/oneko</programlisting> <para>当然, 如果一个 port 不需要给它自己创建目录的话, 就不用设置 <makevar>PLIST_DIRS</makevar> 变量了。</para> - <para>这样列出 port 要安装的文件很目录的代价就是, - 将无法使用在 &man.pkg.create.1; 里面介绍的命令来建立 package。 - 因此, 这种方法仅仅适合一些简单的 port, - 因为它会让这些 port 变得更为简单。 此外, - 这样做也有助于减少 port collection 中的文件数量。 - 请在打算采用 <filename>pkg-plist</filename> 前考虑一下这个方法。</para> + <para>不过, 如果用这种方式来列出 port 要安装的文件和目录的话, + 也就无法利用在 &man.pkg.create.1; 里介绍的命令来制作 package 了。 + 因此, 这种方法只适用于那些简单的 port, 使它们更为简化。 同时, + 这种做法也有助于减少 ports collection 中的文件数量。 + 在采用 <filename>pkg-plist</filename> 之前, + 请考虑一下使用这种方法。</para> - <para>稍后我们将看到 <filename>pkg-plist</filename> 和 - <makevar>PLIST_FILES</makevar> 如何处理 - <link linkend="porting-plist">更复杂的任务</link>。</para> + <para>稍后我们将看到 <filename>pkg-plist</filename> + 以及 <makevar>PLIST_FILES</makevar> 如何处理 + <link linkend="plist">更复杂的任务</link>。</para> </sect2> </sect1> @@ -279,8 +276,8 @@ PLIST_DIRS= lib/X11/oneko</programlisting> </listitem> <listitem> - <para>您的 port 能在 deinstall 以后自动完成 - <link linkend="porting-cleaning">清理</link></para> + <para>您的 port 能在卸载 (deinstall) 时, + 自动完成 <link linkend="plist-cleaning">清理</link></para> </listitem> </itemizedlist> @@ -326,13 +323,12 @@ PLIST_DIRS= lib/X11/oneko</programlisting> <sect1 id="porting-portlint"> <title>用 <command>portlint</command> 来检查 port</title> - <para>请使用 <command>portlint</command> 命令来检查您的 - port 是否符合我们的规范。 <command>portlint</command> - 程序是 ports collection 的一部分。 另外, 您也许要检查 - <link linkend="porting-samplem">Makefile</link> - 是否符合规范, 以及 - <link linkend="porting-pkgname">package</link> - 是否被恰当地命名。</para> + <para>请使用 <command>portlint</command> 命令来检查您的 port + 是否符合我们的规范。 <filename role="package"> + devel/portlint</filename> 程序是 ports collection 的一部分。 + 这个程序的主要功能是帮助您检查 + <link linkend="porting-samplem">Makefile</link> 的样式是否符合规范, + 以及 <link linkend="porting-pkgname">package</link> 的命名是否得体。</para> </sect1> <sect1 id="porting-submitting"> @@ -341,25 +337,21 @@ PLIST_DIRS= lib/X11/oneko</programlisting> <para>首先, 确信您已经阅读了 <link linkend="porting-dads">该做什么和不该做什么</link> 一节。</para> - <para>既然您很满意您的 port, 剩下的工作便是把它放进 - FreeBSD 的 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 Reports and General Commentary</ulink> 以获得更多关于 - &man.send-pr.1;的详情。) 如果未压缩的 - port 大于 20KB, 您可能希望把它压缩成 tar 包, 并在把它加进 - bug报告前使用 &man.uuencode.1; (虽然小于 20KB - 的 bug 报告也可以使用采用 uuencode 编码的 tar包, - 但是我们并不鼓励这样做。) 确保您的 bug 报告按照 <literal>ports</literal> - 和 <literal>change-request</literal> 分类, (注意不要把 - Bug 报告标记成 机密, 即 <literal>confidential</literal> 的!) - 在 PR 的 <quote>Description</quote> 一栏里填写一下您的 - port 的简单描述, 同时将 shar 或 uuencode 编码的 tar 文件填在 - <quote>Fix</quote> 那一栏。</para> + <para>既然已经对所制作的 port 相当满意了, 剩下的工作, + 便是将它放进 FreeBSD 的主 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 + 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> <note> <para>在问题报告里面使用了一段好的描述, @@ -386,7 +378,7 @@ PLIST_DIRS= lib/X11/oneko</programlisting> <para>一旦我们看过了您的报告, 有必要的话我们会联系您, 并把它放到 ports 树里。 您的名字也会出现在 <ulink url="&url.articles.contributors;/contrib-additional.html">Additional FreeBSD Contributors</ulink> - 和其他的文件。 不是很棒吗!? <!-- smiley --> + 和其它的文件。 不是很棒吗!? <!-- smiley --> :-)</para> </sect1> </chapter> @@ -457,7 +449,7 @@ PLIST_DIRS= lib/X11/oneko</programlisting> </listitem> <listitem> - <para>如果定义了 <makevar>HAS_CONFIGURe</makevar> + <para>如果定义了 <makevar>HAS_CONFIGURE</makevar> 或者 <makevar>GNU_CONFIGURE</makevar>, 就会执行 <filename><makevar>WRKSRC</makevar>/configure</filename>。</para> </listitem> @@ -595,7 +587,7 @@ PLIST_DIRS= lib/X11/oneko</programlisting> <note> <para>除非明确地声明, 否则您提交给 FreeBSD ports collection 的补丁, - 脚本和其他的文件都将被假定以标准的 BSD 版权发布。</para> + 脚本和其它的文件都将被假定以标准的 BSD 版权发布。</para> </note> </sect1> @@ -614,7 +606,7 @@ PLIST_DIRS= lib/X11/oneko</programlisting> 这些文件应该被放在 <makevar>PATCHDIR</makevar> 里, 这样这些补丁都会被自动打上。 所有的补丁必须相对于 <makevar>WRKSRC</makevar> 的 - (port 会把 tarball 解压缩在那里, 并完成余下的其他动作)。 + (port 会把 tarball 解压缩在那里, 并完成余下的其它动作)。 为了使修改和升级变得更容易, 应避免使用多个 patch 去修改同一个文件 (比如, <filename>patch-file</filename> 和 <filename>patch-file2</filename> @@ -622,7 +614,7 @@ PLIST_DIRS= lib/X11/oneko</programlisting> 就应被避免)。<para> <para>只有 <literal>[-+._a-zA-Z0-9]</literal> 这些字符, - 可以出现在补丁的文件名中, 请务必不要使用除这些字符以外的其他字符。 + 可以出现在补丁的文件名中, 请务必不要使用除这些字符以外的其它字符。 不要把您的补丁命名成 <filename>patch-aa</filename> 或 <filename>patch-ab</filename> 等这样的名字, 最好能在补丁名中提到路径和文件名。</para> @@ -713,7 +705,7 @@ post-extract: 在这份手册里也有一个 <link linkend="porting-samplem">Makefile例子</link>, 照着里面变量的顺序来写能使得您的 port - 更容易地被其他人看懂。</para> + 更容易地被其它人看懂。</para> <para>现在, 当您开始编写您新的<filename>Makefile</filename> 的时候, 可以依次思考一下以下的问题:</para> @@ -1047,16 +1039,16 @@ PORTEPOCH= 1</programlisting> </listitem> <listitem> - <para>如果这个 port 能将不同的默认设置 - <link linkend="porting-masterdir">硬编码</link> - 进程序 (通常是部分的目录名), 那么 + <para>如果 port 可以使用不同的 <link + linkend="makefile-masterdir">硬编码默认配置</link> + 进行构建 (通常是一系列 port 的一部分目录名), 则 <replaceable>-compiled.specifics</replaceable> - 应该声明被编译进去的默认设置 (连字号是可选的)。 - 这样的用例包括纸张大小和不同的字体。</para> + 部分就应该明示编译进去的默认值 (此处连字号是可选的)。 + 通常的用例包括纸型和不同的字体尺寸。</para> <para><replaceable>-compiled.specifics</replaceable> - 部分应该在 <makevar>PKGNAMESUFFIX</makevar> - 变量里设置。</para> + 部分应该通过 <makevar>PKGNAMESUFFIX</makevar> + 变量来设置。</para> </listitem> <listitem> @@ -1405,7 +1397,7 @@ PORTEPOCH= 1</programlisting> <row> <entry><filename>emulators</filename></entry> - <entry>其他操作系统的模拟器。</entry> + <entry>其它操作系统的模拟器。</entry> <entry>终端模拟器 <emphasis>不应该</emphasis> 属于这个分类 — 基于 X 的应该放在 <filename>x11</filename> 而基于文本模式的应该放到 @@ -1544,7 +1536,7 @@ PORTEPOCH= 1</programlisting> <row> <entry><filename>math</filename></entry> - <entry>数值计算和其他数学相关的软件。</entry> + <entry>数值计算和其它数学相关的软件。</entry> <entry></entry> </row> @@ -1557,7 +1549,7 @@ PORTEPOCH= 1</programlisting> <row> <entry><filename>misc</filename></entry> <entry>各式各样的实用程序。</entry> - <entry>通常不属于其他的任何分类, + <entry>通常不属于其它的任何分类, 如果可能的话, 尽量为您的 port 选择 <literal>misc</literal> 以外的分类, 因为在这里的 @@ -1577,6 +1569,12 @@ PORTEPOCH= 1</programlisting> </row> <row> + <entry><filename>net-im</filename></entry> + <entry>即时消息软件。</entry> + <entry></entry> + </row> + + <row> <entry><filename>net-mgmt</filename></entry> <entry>网络管理软件。</entry> <entry></entry> @@ -1884,7 +1882,7 @@ PORTEPOCH= 1</programlisting> <listitem> <para>有特定意义的分类应当被列在无特定意义的前面。 例如, HTML 编辑器应该是这样的 <filename>www - editors</filename>, 而不是其他的什么。 同样地, + editors</filename>, 而不是其它的什么。 同样地, 您不应该列出 <filename>net</filename>, 如果 port 属于 <filename>irc</filename>、 <filename>mail</filename>、 <filename>mbone</filename>、 <filename>news</filename>、 @@ -1912,11 +1910,11 @@ PORTEPOCH= 1</programlisting> <listitem> <para><filename>misc</filename> - 分类的 port 不能有其他非虚拟的分类。 + 分类的 port 不能有其它非虚拟的分类。 如果您在您的 <makevar>CATEGORIES</makevar> 里设了 <literal>misc</literal> 和另外的分类, 那意味着可以安全地删除 <literal>misc</literal> - 并把 port 放到其他的子目录中了!</para> + 并把 port 放到其它的子目录中了!</para> </listitem> <listitem> @@ -2302,7 +2300,7 @@ EXTRACT_ONLY= source.tar.gz</programlisting> <para>一些应用程序需要从多个站点下载不同的源码包。 例如, <application>Ghostscript</application> 包括了程序核心本身, 以及大量的驱动文件, 以及则取决于用户的打印机品牌和型号的驱动程序。 - 某些驱动文件已经随程序核心附带, 但也有很多需要从其他站点下载。</para> + 某些驱动文件已经随程序核心附带, 但也有很多需要从其它站点下载。</para> <para>为了适应这种需要, 每一个 <makevar>DISTFILES</makevar> 项应跟随一个冒号, @@ -2393,7 +2391,7 @@ DISTFILES= source1.tar.gz:source1 \ <para>没有后缀的元素是无组的, 也就是它们都属于那个特殊的 <literal>DEFAULT</literal> 组。 给元素加入 <literal>DEFAULT</literal> 后缀通常是多余的, - 除非您有同时属于 <literal>DEFAULT</literal> 和其他组的元素 + 除非您有同时属于 <literal>DEFAULT</literal> 和其它组的元素 (参见 <xref linkend="porting-master-sites-n-comma-operator">)。</para> @@ -2873,25 +2871,25 @@ PATCHFILES= patch1:test</programlisting> <para>请在此处写上您的电子邮件地址。 <!-- smiley --><emphasis>:-)</emphasis></para> - <para>需要注意的是, <makevar>MAINTAINER</makevar> 的值只允许一个电子邮件地址, - 其格式是 <literal>user@hostname.domain</literal>。 - 此处不要写任何说明性的文字, 例如您的真实姓名 — 这会使 - <filename>bsd.port.mk</filename> 感到困惑。 此类文字, - 应放在 <filename>pkg-descr</filename> 中。</para> - - <para>监护人的职责说明, - 可以在 <ulink url="&url.books.developers-handbook;/policies.html#POLICIES-MAINTAINER">Makefiles - 中的 MAINTAINER</ulink> 找到。</para> - - <para>如果某一 port 的监护人没有在两周 (重要的公共假日除外) - 之内响应用户的更新请求, 则视为监护人超时, - 从而允许在没有监护人明确同意的情形下进行更新。 - 如果监护人没有在三个月之内予以响应, 且属于不辞而别的情形, - 则可以变更相应 port 的监护人。 此规定对于监护人为 &a.portmgr; 或 - &a.security-officer; 的 port 不适用。 未经许可, - 不允许 commit 这些小组所监护的 port。</para> - - <para>&a.portmgr; 保留以任何原因收回或绕过监护权的权力, + <para>需要注意一点, <makevar>MAINTAINER</makevar> + 变量的值只能是一个不包括注释部分的电子邮件地址, + 其格式应为 <literal>user@hostname.domain</literal>。 + 请不要在此处写任何说明性的文字, 例如您的真实姓名 — 这会给 + <filename>bsd.port.mk</filename> 带来麻烦。</para> + + <para>详细的监护人职责说明, + 可以在 <ulink url="&url.books.developers-handbook;/policies.html#POLICIES-MAINTAINER">Makefile + 中的 MAINTAINER</ulink> 小节中找到。</para> + + <para>假如某一 port 的监护人没有在两周之内 (不包括主要的公共假日) + 响应来自用户的更新请求, 则可视为监护人超时, + 在这种情况下可以在没有监护人明确同意的情形下进行更新。 + 如果监护人在多达三个月的时间内没有进行任何响应, + 则可以认为该监护人不辞而别, 允许对出现此类问题的 port 进行监护人变更。 + 尽管如此, 监护人为 &a.portmgr; 或者 &a.security-officer; 的 port + 不受此限。 对监护人为这些小组的 port 进行未经许可的 commit 是不允许的。</para> + + <para>&a.portmgr; 保留以任何原因收回或绕过任何人监护权的权力, 而 &a.security-officer; 则保留以安全原因收回或绕过监护权的权力。</para> </sect1> @@ -2915,7 +2913,7 @@ PATCHFILES= patch1:test</programlisting> <sect1 id="makefile-depend"> <title>依赖关系</title> - <para>许多 port 会依赖其他 port。 + <para>许多 port 会依赖其它 port。 有七个变量用于帮助您确保所需的文件都存在于用户的机器上。 此外, 也提供了用于支持常见情形的依赖关系变量, 以及对依赖关系行为的更多控制。</para> @@ -2952,7 +2950,7 @@ PATCHFILES= patch1:test</programlisting> <maketarget>extract</maketarget> target 中, 而另一次则是在 <maketarget>install</maketarget> target。 另外, 依赖关系的名字会放到 package 中, 以便让 - &man.pkg.add.1; 能够自动地在用户系统上安装所需的未安装的其他 + &man.pkg.add.1; 能够自动地在用户系统上安装所需的未安装的其它 package。</para> </sect2> @@ -3047,7 +3045,7 @@ PATCHFILES= patch1:test</programlisting> <sect2> <title><makevar>EXTRACT_DEPENDS</makevar> (依赖的解压缩环境)</title> - <para>此变量用于指定 port 在解压缩时所需的可执行文件或其他资源文件。 + <para>此变量用于指定 port 在解压缩时所需的可执行文件或其它资源文件。 和前一个变量类似, 它是一系列 <replaceable>path</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional> 元组的列表。 例如, <programlisting>EXTRACT_DEPENDS= @@ -3062,7 +3060,7 @@ PATCHFILES= patch1:test</programlisting> 则可以略去 <replaceable>target</replaceable> 部分。</para> <note> - <para>只有在其他方式都不可用 (默认是 <command>gzip</command>) + <para>只有在其它方式都不可用 (默认是 <command>gzip</command>) 而且无法通过 <xref linkend="use-vars"> 所介绍的 <makevar>USE_ZIP</makevar> 或 <makevar>USE_BZIP2</makevar> 都不能达到需要时, @@ -3074,7 +3072,7 @@ PATCHFILES= patch1:test</programlisting> <title><makevar>PATCH_DEPENDS</makevar> (依赖的打补丁环境)</title> <para>这个变量用于指定 port 在进行 patch - 操作时所需的可执行文件或其他资源文件。 和前一个变量类似, 它是一组 + 操作时所需的可执行文件或其它资源文件。 和前一个变量类似, 它是一组 <replaceable>path</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional> 元组的表。 例如, <programlisting> PATCH_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/java/jfc:extract @@ -3092,7 +3090,7 @@ PATCHFILES= patch1:test</programlisting> <title><makevar>DEPENDS</makevar> (一般依赖)</title> <para>如果有无法归类于上述类别的依赖关系, 或者您的 port - 需要解压缩其他 port 的源代码才能够完成构建或安装, + 需要解压缩其它 port 的源代码才能够完成构建或安装, 则应使用它来表达。 这个变量是一组格式为 <replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional> 的元组表, 与前四个不同, 它并不实施检查。 这里的 @@ -3153,75 +3151,13 @@ PATCHFILES= patch1:test</programlisting> </row> <row> - <entry><makevar>USE_GMAKE</makevar></entry> - - <entry>此 port 需要使用<command>gmake</command> 来进行构建。</entry> - - </row> - - <row> - <entry><makevar>USE_PERL5</makevar></entry> - - <entry>此 port 的构建和安装需要使用 <literal>perl 5</literal>。 参见 - <xref linkend="using-perl"> 以了解与 <literal>perl</literal> - 有关的其他变量。</entry> - </row> - - <row> - <entry><makevar>USE_X_PREFIX</makevar></entry> - - <entry>此 port 将安装到 <makevar>X11BASE</makevar> - 而非默认的 <makevar>PREFIX</makevar>。 请参见 - <xref linkend="using-x11"> 以了解其他与 X11 有关的变量。</entry> - </row> - - <row> - <entry><makevar>USE_AUTOMAKE_VER</makevar></entry> - - <entry>此 port 的构建过程中用到了 GNU <command>automake</command>。 - 请参见 <xref linkend="using-automake"> 以了解与 - <command>automake</command> 有关的其他变量。</entry> - </row> - - <row> - <entry><makevar>USE_AUTOCONF_VER</makevar></entry> - - <entry>此 port 的构建过程中用到了 GNU <command>autoconf</command>。 - 请参见 <xref linkend="using-automake"> 以了解与 - <command>autoconf</command> 有关的其他变量。</entry> - </row> - - <row> - <entry><makevar>USE_LIBTOOL_VER</makevar></entry> - - <entry>此 port 构建过程用到了 GNU <command>libtool</command>。 - 请参见 <xref linkend="using-automake"> 以了解与 - <command>libtool</command> 有关的其他变量。</entry> - </row> - - <row> - <entry><makevar>GMAKE</makevar></entry> - - <entry><command>gmake</command> 的完整路径, 如果它不在 - <envar>PATH</envar> 中的话。</entry> - </row> - - <row> <entry><makevar>USE_BISON</makevar></entry> <entry>此 port 在构建时使用 <command>bison</command>。</entry> </row> <row> - <entry><makevar>USE_SDL</makevar></entry> - - <entry>此 port 使用 <literal>SDL</literal> 来完成构建和支持运行。 - 参见 <xref linkend="using-sdl"> 以了解如何使用 - <makevar>USE_SDL</makevar>。</entry> - </row> - - <row> - <entry><makevar>USE_GCC</makevar></entry> + <entry><makevar>USE_GCC</makevar></entry> <entry>此 port 需要使用某一特定版本的 <command>gcc</command> 才能完成编译。 @@ -3236,29 +3172,31 @@ PATCHFILES= patch1:test</programlisting> <makevar>USE_LIBTOOL_VER</makevar> 联用。</entry> </row> - <row> - <entry><makevar>NO_INSTALL_MANPAGES</makevar></entry> - - <entry>不要使用 <maketarget>install.man</maketarget> - target。</entry> - </row> </tbody> </tgroup> </table> - <para>如果您的 port 需要使用 X Window 系统, - 则应定义 <literal>USE_XLIB=yes</literal>。 (如果定义了 - <makevar>USE_IMAKE</makevar> 则会作隐含定义)。 如果您的 port - 使用了 GNU <command>make</command> 而不是 BSD - <command>make</command>, 还应定义 - <literal>USE_GMAKE=yes</literal>。 如果需要运行 GNU autoconf, - 还需要定义 <literal>USE_AUTOCONF_VER=213</literal>。 - 定义 <literal>USE_QT_VER=3</literal> 表示您的 port 需要使用最新的 - Qt toolkit。 此外, 还可以用 - <literal>USE_PERL5=yes</literal> 来表示 port 需要 - <literal>perl</literal> 语言的第 5 版。 (最后一个变量很重要, - 因为某些版本的 FreeBSD 的基本系统中包含了 <literal>perl5</literal>, - 而新版本则没有。)</para> + <para>与 <application>gmake</application> + 和 <filename>configure</filename> 脚本有关的变量在 + <xref linkend="building"> 中进行了介绍, 而 + <application>autoconf</application>、 + <application>automake</application> 以及 + <application>libtool</application> 的介绍则可以在 + <xref linkend="using-autotools"> 找到。 <xref linkend="using-perl"> + 介绍了与 <application>Perl</application> 有关的的变量。 + <xref linkend="using-x11"> 中列出了关于 X11 的变量。 关于 GNOME 的变量在 <xref + linkend="using-gnome">, 而关于 KDE 的则在 <xref + linkend="using-kde">。 <xref + linkend="using-java"> 讲述了和 Java 有关的变量, 而 <xref + linkend="using-php"> 则包含了关于 + <application>Apache</application>、 <application>PHP</application> + 以及 PEAR 的介绍性信息。 关于 <application>Python</application>, + 在 <xref linkend="using-python"> 进行了讨论, 而关于 + <application>Ruby</application> 的介绍, + 则可以在 <xref linkend="using-ruby"> 中找到。 + 最后, <xref linkend="using-sdl"> 提供了用于 + <application>SDL</application> 应用程序的变量介绍。</para> + </sect2> <sect2> @@ -3281,7 +3219,7 @@ PATCHFILES= patch1:test</programlisting> <para>要无条件地依赖某个 port, 可以使用 <makevar>${NONEXISTENT}</makevar> 作为 <makevar>BUILD_DEPENDS</makevar> 或 - <makevar>RUN_DEPENDS</makevar> 的第一部分。 只有在您需要使用其他 + <makevar>RUN_DEPENDS</makevar> 的第一部分。 只有在您需要使用其它 port 提供的源代码时才应这样做。 通常也可以通过这样指定来缩短编译所需的时间。 例如 @@ -3289,8 +3227,8 @@ PATCHFILES= patch1:test</programlisting> 表示依赖 <literal>jpeg</literal> port 并将其解压缩。</para> - <para>除非其他方式都不适合, 否则不要使用 <makevar>DEPENDS</makevar>。 - 这样指定将在任何情况下都构建 (默认情况下还会安装) 其他 port, + <para>除非其它方式都不适合, 否则不要使用 <makevar>DEPENDS</makevar>。 + 这样指定将在任何情况下都构建 (默认情况下还会安装) 其它 port, 而且这依赖关系还会进入 package。 如果真的需要这样, 写成 <literal>BUILD_DEPENDS</literal> 和 <literal>RUN_DEPENDS</literal> 可能更合适一些 — @@ -3314,6 +3252,141 @@ PATCHFILES= patch1:test</programlisting> </sect1> + <sect1 id="makefile-masterdir"> + <title><makevar>MASTERDIR</makevar> (主 port 所在的目录)</title> + + <para>如果 port 需要依某些变量的设置 (举例来说, 分辨率或纸型) + 来构建略有不同的预编译包, 则可以为每一个这样的包建立不同的目录, + 这样可以让用户更容易地看到他们想要安装的版本, 但又能在这些 port + 之间共用尽可能多的文件。 一般情况下, 如果运用得当, 除主目录之外都只需要很短的 + <filename>Makefile</filename>。 这些 <filename>Makefile</filename> 中, + 可以用 <makevar>MASTERDIR</makevar> 来指定其它文件所在的目录。 + 另外, 还应使用一个变量作为 + <link linkend="porting-pkgname"><makevar>PKGNAMESUFFIX</makevar></link> + 的一部分, 以便为不同的包给出不同的命名。</para> + + <para>用例子来阐述这些会更为明晰。 以下是 + <filename>japanese/xdvi300/Makefile</filename> 的部分代码:</para> + + <programlisting>PORTNAME= xdvi +PORTVERSION= 17 +PKGNAMEPREFIX= ja- +PKGNAMESUFFIX= ${RESOLUTION} + : +# default +RESOLUTION?= 300 +.if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \ + ${RESOLUTION} != 300 && ${RESOLUTION} != 400 + @${ECHO} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\"" + @${ECHO} "Possible values are: 118, 240, 300 (default) and 400." + @${FALSE} +.endif</programlisting> + + <para><filename role="package">japanese/xdvi300</filename> 也提供了全部常规的补丁, + 以及打包用到的文件等等内容。 如果您在那里输入 <command>make</command>, + 它将使用默认的分辨率值 (300) 并正常地构建 port。</para> + + <para>对于其它分辨率而言, 以下是 <emphasis>完整的</emphasis> + <filename>xdvi118/Makefile</filename>:</para> + + <programlisting>RESOLUTION= 118 +MASTERDIR= ${.CURDIR}/../xdvi300 + +.include "${MASTERDIR}/Makefile"</programlisting> + + <para>(<filename>xdvi240/Makefile</filename> 和 + <filename>xdvi400/Makefile</filename> 是相似的)。 + <makevar>MASTERDIR</makevar> 定义会告诉 + <filename>bsd.port.mk</filename> 常规的目录, + 例如 <makevar>FILESDIR</makevar> 以及 + <makevar>SCRIPTDIR</makevar> 应在 + <filename>xdvi300</filename> 中查找。 <literal>RESOLUTION=118</literal> + 这行将覆盖在 <filename>xdvi300/Makefile</filename> 中所作的 + <literal>RESOLUTION=300</literal> 设置, 从而 port + 将以分辨率为 118 的设置来构建。</para> + </sect1> + + <sect1 id="makefile-manpages"> + <title>联机手册</title> + + <para><makevar>MAN[1-9LN]</makevar> 这些变量, + 会自动地将联机手册加到 <filename>pkg-plist</filename> (这也意味着 + <emphasis>不能</emphasis> 在 + <filename>pkg-plist</filename> 中列出联机手册 — 参见 <link + linkend="plist-sub">PLIST 的生成</link> 来了解更多细节)。 此外, + 这也会让安装阶段自动地根据在 <filename>/etc/make.conf</filename> + 中所作的 <makevar>NOMANCOMPRESS</makevar> 设置来自动对联机手册文件执行压缩或解压缩操作。</para> + + <para>如果 port 尝试通过使用符号连接或硬连接将联机手册安装为多个名字, + 就必须使用 <makevar>MLINKS</makevar> 变量来予以明示。 + 由 port 创建的连接, 将由 <filename>bsd.port.mk</filename> + 删除和重建, 以确认它们指向了正确的文件。 任何在 MLINKS 中列出的文件都不应在 + <filename>pkg-plist</filename> 中再出现。</para> + + <para>要指定是否在安装时对联机手册进行压缩, + 可以使用 <makevar>MANCOMPRESSED</makevar> 变量。 + 这一变量可以取三种值, <literal>yes</literal>、 <literal>no</literal> 和 + <literal>maybe</literal> 之一。 <literal>yes</literal> + 表示联机手册已经以压缩的形式安装, <literal>no</literal> 表示还没有, + 而 <literal>maybe</literal> 则表示所安装的软件会尊重 + <makevar>NOMANCOMPRESS</makevar> 的设置值, 因此 + <filename>bsd.port.mk</filename> 不需要特别做什么事情。</para> + + <para>如果设置了 <makevar>USE_IMAKE</makevar> 而未定义 + <makevar>NO_INSTALL_MANPAGES</makevar>, + <makevar>MANCOMPRESSED</makevar> 会自动设为 + <literal>yes</literal>, 反之则是 + <literal>no</literal>。 除非默认值不合适, + 否则就不需要在 port 中明确地加以改变。</para> + + <para>如果 port 将联机手册放到了 + <makevar>PREFIX</makevar> 之外的其它目录, 则应使用 + <makevar>MANPREFIX</makevar> 来加以设置。 此外, + 如果只有某些部分的联机手册会安装到不标准的位置, 例如某些 <literal>perl</literal> + 模块的 port, 还可以使用 + <makevar>MAN<replaceable>sect</replaceable>PREFIX</makevar> (此处 + <replaceable>sect</replaceable> 是 <literal>1-9</literal>、 + <literal>L</literal> 或 <literal>N</literal> 之一) 来指定。</para> + + <para>如果您的联机手册需要装入专用于某一语言专用的子目录, + 需要将 <makevar>MANLANG</makevar> 设为那种语言的名字。 + 此变量的默认值是 <literal>""</literal> (也就是只有英语)。</para> + + <para>下面是一个综合的例子。</para> + + <programlisting>MAN1= foo.1 +MAN3= bar.3 +MAN4= baz.4 +MLINKS= foo.1 alt-name.8 +MANLANG= "" ja +MAN3PREFIX= ${PREFIX}/share/foobar +MANCOMPRESSED= yes</programlisting> + + <para>这表示 port 会安装六个文件;</para> + + <programlisting>${PREFIX}/man/man1/foo.1.gz +${PREFIX}/man/ja/man1/foo.1.gz +${PREFIX}/share/foobar/man/man3/bar.3.gz +${PREFIX}/share/foobar/man/ja/man3/bar.3.gz +${PREFIX}/man/man4/baz.4.gz +${PREFIX}/man/ja/man4/baz.4.gz</programlisting> + + <para>此外, <filename>${PREFIX}/man/man8/alt-name.8.gz</filename> + 可能会通过您的 port 安装, 也可能不会。 无论如何, + 都会创建一个符号连接, 把 foo(1) 和 + alt-name(8) 联机手册连起来。</para> + + </sect1> + + <sect1 id="makefile-info"> + <title>Info 文件</title> + + <para>如果软件包需要安装 GNU 文件, + 则需要在 <makevar>INFO</makevar> 变量中列出 (不需要指定 + <literal>.info</literal> 后缀), 这样安装/卸载代码就会自动地在注册包时将它们加入到 + <filename>pkg-plist</filename> 了。</para> + </sect1> + <sect1 id="makefile-options"> <title>Makefile 选项</title> @@ -3324,7 +3397,10 @@ PATCHFILES= patch1:test</programlisting> 系统提供了一组方便的机制, 来让 port 的作者控制构建时的配置。 支持这些特性可以让用户体验更好, 并达到事半功倍的效果。</para> - <sect2> + <sect2> + <title>开关 (<makevar>KNOBS</makevar>)</title> + + <sect3> <title><makevar>WITH_<replaceable>*</replaceable></makevar> 和 <makevar>WITHOUT_<replaceable>*</replaceable></makevar></title> @@ -3430,6 +3506,19 @@ PATCHFILES= patch1:test</programlisting> </tgroup> </table> + </sect3> + + <sect3> + <title>开关 (knob) 的命名</title> + <para>我们建议 port 的开发人员使用相似的开关, 以便最终用户使用, + 并减少开关名称的总数。 最为常用的开关名字可以在 + <ulink url="http://www.freebsd.org/cgi/cvsweb.cgi/ports/KNOBS?rev=HEAD&content-type=text/x-cvsweb-markup">KNOBS</ulink> + 文件中找到。</para> + + <para>开关的名字应反映其功能。 如果 port 的 <makevar>PORTNAME</makevar> + 包括 lib- 前缀, 则开关名中应删去 lib- 前缀。</para> + + </sect3> </sect2> <sect2> @@ -3437,13 +3526,25 @@ PATCHFILES= patch1:test</programlisting> <sect3> <title>背景</title> - <para><makevar>OPTIONS</makevar> 变量将向安装 port - 的用户给出一个对话框, 其中给出可用的选项, 这些选项将保存到 - <filename>/var/db/ports/portname/options</filename> 中。 - 下次重新构建 port 时, 这些选项将被重用。 这样, - 就不再需要记忆您上次构建 port 时所用的那样多的 + <para><makevar>OPTIONS</makevar> 将为正在安装 port + 的用户提供一个包含可用选项的对话框, + 并将用户的选择保存到 <filename>/var/db/ports/<replaceable>portname</replaceable>/options</filename> 中。 + 下次重新联编 port 时, 这些选项将被再次使用。 + 这样一来, 就不需要劳神去记忆您之前联编 port 时的那几十个 <makevar>WITH_<replaceable>*</replaceable></makevar> 和 - <makevar>WITHOUT_<replaceable>*</replaceable></makevar> 了!</para> + <makevar>WITHOUT_<replaceable>*</replaceable></makevar>选项了!</para> + + <para>当用户运行 <command>make config</command> (或首次运行 + <command>make build</command>) 时, 框架会首先检查 + <filename>/var/db/ports/<replaceable>portname</replaceable>/options</filename>。 + 如果这个文件不存在, 则它会使用 + <makevar>OPTIONS</makevar> 的值来生成一个可以启用或禁用各个选项的对话框。 + 随后, 用户的选择将保存到 + <filename>options</filename> 文件中, + 并被用于联编 port。</para> + + <para>使用 <command>make showconfig</command> 可以查看保存的配置。 + 此外, <command>make rmconfig</command> 可以删除已经保存的配置。</para> </sect3> <sect3> @@ -3456,23 +3557,23 @@ PATCHFILES= patch1:test</programlisting> 默认值必须是 <literal>ON</literal> 和 <literal>OFF</literal> 之一。 这种三元组可以使用多次。</para> - <para>当用户执行 <command>make config</command> (或首次执行 - <command>make build</command>) 时, - 系统将检查 <filename>/var/db/ports/<replaceable>portname</replaceable> - /options</filename>。 如果这个文件不存在, 它将使用 - <makevar>OPTIONS</makevar> 中的值来显示一个对话框, - 以便启用或禁用某些选项。 随后, 用户所选的项目将被保存起来, - 而对应的变量则将用于构建过程。</para> - - <para>用 <command>make showconfig</command> 来查看保存的配置。 - 用 <command>make rmconfig</command> 删除已经保存的配置。</para> + <para>定义 <makevar>OPTIONS</makevar> 变量的值, + 必须在引用 <filename>bsd.port.pre.mk</filename> 之前定义。 + 而 <makevar>WITH_*</makevar> 和 <makevar>WITHOUT_*</makevar> + 只有在引用了 + <filename>bsd.port.pre.mk</filename> 之后才能开始检测。 + 由于基础支持框架的一些缺陷, 您只能使用 + <makevar>WITH_*</makevar> 变量来检测那些默认值为 + <literal>OFF</literal> 的选项, 而使用 + <makevar>WITHOUT_*</makevar> 变量来检测那些默认值为 + <literal>ON</literal> 的选项。</para> <sect3> <title>例子</title> <example id="ports-options-simple-use"> <title>简单的 <makevar>OPTIONS</makevar> 用法</title> - <para><programlisting>OPTIONS= FOO "启用 foo 选项" On \ - BAR "支持 bar 选项" Off + <para><programlisting>OPTIONS= FOO "启用 foo 选项" On \ + BAR "支持 bar 功能" Off .include <bsd.port.pre.mk> @@ -3489,20 +3590,6 @@ RUN_DEPENDS+= bar:${PORTSDIR}/bar/bar .include <bsd.port.post.mk></programlisting></para> </example> - <sect3> - <title>已知问题</title> - <itemizedlist> - <listitem> - <para><command>make index</command> 目前还不能按照 - <makevar>OPTIONS</makevar> 的设置来完成生成过程 (ports/75727)</para> - </listitem> - <listitem> - <para><makevar>PACKAGE_BUILDING</makevar> 目前无法正确配合 - <makevar>OPTIONS</makevar> (ports/75727?)</para> - </listitem> - </itemizedlist> - </sect3> - </sect2> </sect1> @@ -3567,61 +3654,6 @@ PORTVERSION= 1.0</programlisting> </note> </sect1> - <sect1 id="makefile-build"> - <title>构建机制</title> - - <para>如果您的软件用到了 GNU <command>make</command>, 则应设置 - <literal>USE_GMAKE=yes</literal>。 如果包含 - <command>configure</command>, 还应设置 - <literal>HAS_CONFIGURE=yes</literal>。 假如要使用 GNU - <command>configure</command>, 则需要设置 - <literal>GNU_CONFIGURE=yes</literal> (这会自动设置 - <literal>HAS_CONFIGURE</literal>)。 如果希望向 - <command>configure</command> 传递一些参数 (对于 GNU - <command>configure</command> 而言, 其默认值是 - <literal>--prefix=${PREFIX}</literal>, 而对非 GNU - <command>configure</command> 则是空串), 将这些额外的参数设置为 - <makevar>CONFIGURE_ARGS</makevar>。 如果您的软件包使用 GNU - <command>autoconf</command>, 可以设置 - <literal>USE_AUTOCONF_VER=213</literal>。 这会自动设置 - <makevar>GNU_CONFIGURE</makevar>, 并让 - <command>autoconf</command> 在 - <command>configure</command> 之前执行。</para> - - <note> - <para>如果软件包用到 GNU <command>configure</command>, - 而最终生成的可执行文件的名字很 <quote>奇怪</quote>, 例如 - <filename>i386-portbld-freebsd4.7-</filename><replaceable>appname</replaceable>, - 您需要额外地手工修改 - <makevar>CONFIGURE_TARGET</makevar> 变量, - 按照较新版的 <command>autoconf</command> - 希望的方式指定目标的名字。 做法是在 <filename>Makefile</filename> - 中的 <literal>GNU_CONFIGURE=yes</literal> 这行之后加入:</para> - - <para> - <literal>CONFIGURE_TARGET=--build=${MACHINE_ARCH}-portbld-freebsd${OSREL}</literal> - </para> - </note> - - <para>如果您的软件包是 X 应用程序, 并且使用 <command>imake</command> - 从 <filename>Imakefile</filename> 中生成的 <filename>Makefile</filename>, - 就应设置 - <literal>USE_IMAKE=yes</literal>。 这样, 就能够在 configure - 阶段自动地执行 <command>xmkmf -a</command>。 如果您的 port 使用 - <option>-a</option> 参数会导致问题, 需要进一步设置 - <literal>XMKMF=xmkmf</literal>。 如果 port 使用 - <command>imake</command> 但无法采用 - <maketarget>install.man</maketarget> target, 则应设置 - <literal>NO_INSTALL_MANPAGES=yes</literal>。 最后, - 这些问题应通知您所 port 软件的原作者。 <!-- - smiley --><emphasis>:-></emphasis></para> - - <para>如果您的 port 的源 <filename>Makefile</filename> - 用于构建的 target 名字不是 <maketarget>all</maketarget>, - 需要相应地设置 <makevar>ALL_TARGET</makevar>; 同理, - 对于 <maketarget>install</maketarget> 可以配置 - <makevar>INSTALL_TARGET</makevar>。</para> - </sect1> </chapter> <chapter id="special"> @@ -3658,18 +3690,37 @@ PORTVERSION= 1.0</programlisting> <programlisting>INSTALLS_SHLIB= yes LDCONFIG_DIRS= %%PREFIX%%/lib/foo %%PREFIX%%/lib/bar</programlisting> + <para>要时刻谨记, 非标准的目录不会在 (重) 启动时自动传递给 + &man.ldconfig.8; ! 如果有 port 真的需要这样做, 则需要像 + <filename role="package">x11/kdelibs3</filename> 那样安装一个启动脚本。 + 请务必仔细检查, 通常这是完全不必要的, + 或者可以通过 <literal>-rpath</literal> 或在连接时设置 <envar>LD_RUN_PATH</envar> + 来避免 (参见 <filename role="package">lang/moscow_ml</filename> + 给出的例子), 或者用一个 shell 封装程序来在执行可执行文件之前设置 + <makevar>LD_LIBRARY_PATH</makevar>, 类似 + <filename role="package">www/mozilla</filename> 那样。</para> + <para>值得注意的是这里 <makevar>LDCONFIG_DIRS</makevar> 的内 容就像 <filename>pkg-plist</filename> - 的其他部分一样要通过&man.sed.1;过滤,所 + 的其它部分一样要通过&man.sed.1;过滤,所 以 <makevar>PLIST_SUB</makevar> 置换也会应用。我们推荐您使用 <literal>%%PREFIX%%</literal> 替换 <makevar>PREFIX</makevar>,<literal>%%LOCALBASE%%</literal> 替换<makevar>LOCALBASE</makevar>,<literal>%%X11BASE%%</literal> 替换<makevar>X11BASE</makevar>.</para> + + <para>尽量将共享库版本号保持为 + <filename>libfoo.so.0</filename> 这样的格式。 + 我们的运行环境连接器只会检查主 (第一个) 版本数字。</para> + + <para>如果在更新 port 时升级了其库的主版本号, + 则其它所有连接了受影响的库的 port 的 <makevar>PORTREVISION</makevar> 都应递增, + 以强制它们采用新版本的库重新编译。</para> + </sect1> <sect1 id="porting-restrictions"> - <title>Ports的发行限制</title> + <title>Ports 的发行限制</title> <para>众多协议,并且其中的一些致力于 限制怎样的应用程序能被打包, @@ -3763,11 +3814,437 @@ LDCONFIG_DIRS= %%PREFIX%%/lib/foo %%PREFIX%%/lib/bar</programlisting> </sect2> </sect1> + <sect1 id="building"> + <title>构建机制</title> + + <sect2 id="using-make"> + <title><command>make</command>、 <command>gmake</command>, 以及 + <command>imake</command></title> + + <para>如果 port 用到了 <application>GNU make</application>, 应设置 + <literal>USE_GMAKE=yes</literal>。</para> + + <table frame="none"> + <title>用于与 gmake 有关的 port 的变量</title> + + <tgroup cols="2"> + <thead> + <row> + <entry>变量</entry> + + <entry>意义</entry> + </row> + </thead> + + <tbody> + <row> + <entry><makevar>USE_GMAKE</makevar></entry> + + <entry>此 port 需要使用 <command>gmake</command> + 来完成构建过程。</entry> + </row> + + <row> + <entry><makevar>GMAKE</makevar></entry> + + <entry>不在 <envar>PATH</envar> 中时, <command>gmake</command> + 的完整路径。</entry> + </row> + </tbody> + </tgroup> + </table> + + <para>对于 X 应用程序的 port, 如果它使用 + <application>imake</application> 根据 + <filename>Imakefile</filename> 文件来生成 + <filename>Makefile</filename>, 则应设置 + <literal>USE_IMAKE=yes</literal>。 这会使构建过程中的配置 + (configure) 阶段自动执行 <command>xmkmf -a</command>。 + 如果 <option>-a</option> 标志会给您的 port 带来麻烦, 则需设置 + <literal>XMKMF=xmkmf</literal>。 如果 port 用到了 + <application>imake</application> 但并不使用 + <maketarget>install.man</maketarget> target, 则应设置 + <literal>NO_INSTALL_MANPAGES=yes</literal>。</para> + + <para>如果 port 源文件的 <filename>Makefile</filename> 的主构建 + target 是 <maketarget>all</maketarget> 以外的名字, + 应对应地设置 <makevar>ALL_TARGET</makevar>。 + 对于 <maketarget>install</maketarget> 而言, 对应的变量是 + <makevar>INSTALL_TARGET</makevar>。</para> + + </sect2> + + <sect2 id="using-configure"> + <title><command>configure</command> 脚本</title> + + <para>假如 port 使用 <command>configure</command> 脚本来从 + <filename>Makefile.in</filename> + 生成 <filename>Makefile</filename> 文件, 需要设置 + <literal>GNU_CONFIGURE=yes</literal>。 + 如果希望传额外的参数给 <command>configure</command> 脚本 + (默认参数为 <literal>--prefix=${PREFIX} + ${CONFIGURE_TARGET}</literal>), + 应通过 <makevar>CONFIGURE_ARGS</makevar> 来指定这些参数。 + 类似地, 可以通过 + <makevar>CONFIGURE_ENV</makevar> 变量来传递一些环境变量。</para> + + <para>如果您的软件包使用 GNU <command>configure</command>, + 而生成的可执行文件命名方式 <quote>怪异</quote> 如 + <filename>i386-portbld-freebsd4.7-</filename><replaceable>应用程序名</replaceable>, + 则需要更进一步地通过改变 + <makevar>CONFIGURE_TARGET</makevar> 变量来按照较新版本的 + <command>autoconf</command> 生成的脚本所希望的方式指定 target。 + 其方法是, 紧随 <filename>Makefile</filename> + 中 <literal>GNU_CONFIGURE=yes</literal> 一行之后加入:</para> + + <para> + <literal>CONFIGURE_TARGET=--build=${MACHINE_ARCH}-portbld-freebsd${OSREL}</literal> + </para> + + <table frame="none"> + <title>用于用到了 configure 脚本的 port 的变量</title> + + <tgroup cols="2"> + <thead> + <row> + <entry>变量</entry> + + <entry>意义</entry> + </row> + </thead> + + <tbody> + <row> + <entry><makevar>GNU_CONFIGURE</makevar></entry> + + <entry>此 port 需要用 <command>configure</command> 脚本来准备构建。</entry> + </row> + + <row> + <entry><makevar>HAS_CONFIGURE</makevar></entry> + + <entry>与 <makevar>GNU_CONFIGURE</makevar> 类似, + 但默认的 configure target 并不加入 + <makevar>CONFIGURE_ARGS</makevar>。</entry> + </row> + + <row> + <entry><makevar>CONFIGURE_ARGS</makevar></entry> + + <entry>希望传给 + <command>configure</command> 脚本的额外参数。</entry> + </row> + + <row> + <entry><makevar>CONFIGURE_ENV</makevar></entry> + + <entry>希望在执行 <command>configure</command> + 脚本时设置的环境变量。</entry> + </row> + + <row> + <entry><makevar>CONFIGURE_TARGET</makevar></entry> + + <entry>替换默认的 configure target。 其默认值是 + <literal>${MACHINE_ARCH}-portbld-freebsd${OSREL}</literal>。</entry> + </row> + </tbody> + </tgroup> + </table> + </sect2> + </sect1> + + <sect1 id="using-autotools"> + <title>利用 GNU autotools</title> + + <sect2 id="using-autotools-introduction"> + <title>入门</title> + + <para>众多 GNU autotools 提供了一种在多重操作系统和机器架构之上构建软件的抽象机制。 + 在 Ports Collection 中, port 可以通过简单的方法来使用这些工具:</para> + + <programlisting>USE_AUTOTOOLS= <replaceable>工具</replaceable>:<replaceable>版本</replaceable>[:<replaceable>操作</replaceable>] ...</programlisting> + + <para>撰写本书时, <replaceable>工具</replaceable> 可以设置为 + <literal>libtool</literal>、 <literal>libltdl</literal>、 + <literal>autoconf</literal>、 <literal>autoheader</literal>、 + <literal>automake</literal> 或 <literal>aclocal</literal> 之一。</para> + + <para><replaceable>版本</replaceable> 用来指定希望使用的工具的特定版本 (参见 + <literal>devel/{automake,autoconf,libtool}[0-9]+</literal> + 以了解有效的版本号)。</para> + + <para><replaceable>操作</replaceable> 是一个可选的扩展选项, + 用于修改如何使用工具。</para> + + <para>可以同时指定多个不同的工具, 可以在一行中指定, 也可以用 + Makefile 的 <literal>+=</literal> 结构。</para> + + <para>在开始介绍其它工具之前, 需要强调的是, 这些结构只能用于构建 port。 + 如果希望进行跨平台的开发, 例如在 IDE 中, 则应使用 + <literal>devel/gnu-{automake,autoconf,libtool}</literal> 这些 port。 <filename + role="package">devel/anjuta</filename> 以及 <filename + role="package">devel/kdevelop</filename> (分别对应于 GNOME 和 KDE) + 是关于如何做到这一点的良好范例。</para> + + </sect2> + + <sect2 id="using-libtool"> + <title><command>libtool</command></title> + + <para>使用 GNU 构建框架的共享库通常会使用 + <command>libtool</command> 来调整共享库的编译和安装, + 以便与所运行的操作系统相匹配。 Ports Collection + 提供了一系列经过修改以适应 &os; 的不同版本的 <command>libtool</command>。</para> + + <programlisting>USE_AUTOTOOLS= libtool:<replaceable>版本</replaceable>[:inc|:env]</programlisting> + + <para>如果不使用额外的操作符, + <literal>libtool:<replaceable>版本</replaceable></literal> + 将告诉构建框架 port 希望使用 + <command>libtool</command>, 这也暗含地定义了 + <makevar>GNU_CONFIGURE</makevar>。 configure 脚本将使用系统安装的 + <command>libtool</command> 版本进行修补。 更进一步, + 还将设置一系列 make 和 shell 变量, 以便 port 使用。 请参见 + <filename>bsd.autotools.mk</filename> 了解进一步的详情。</para> + + <para>如果使用 <literal>:inc</literal> 操作符, 则会设置环境, + 但使用一些略微不同的补丁。</para> + + <para>如果使用 <literal>:env</literal> 操作符, 则只设置环境。</para> + + <informaltable frame="none"> + <tgroup cols="2"> + <thead> + <row> + <entry>先前的写法</entry> + + <entry>新的 <makevar>USE_AUTOTOOLS</makevar> 结构</entry> + </row> + </thead> + + <tbody> + <row> + <entry><literal>USE_LIBTOOL_VER=13</literal></entry> + + <entry><literal>libtool:13</literal></entry> + </row> + + <row> + <entry><literal>USE_INC_LIBTOOL_VER=15</literal></entry> + + <entry><literal>libtool:15:inc</literal></entry> + </row> + + <row> + <entry><literal>WANT_LIBTOOL_VER=15</literal></entry> + + <entry><literal>libtool:15:env</literal></entry> + </row> + + </tbody> + </tgroup> + </informaltable> + + <para>最后, <makevar>LIBTOOLFLAGS</makevar> 和 + <makevar>LIBTOOLFILES</makevar> 可以用来替换最常修改的参数, 以及将被 + <command>libtool</command> 修补的文件。 多数 port 不需要这样做。 + 请参见 <filename>bsd.autotools.mk</filename> 以了解进一步的细节。</para> + + </sect2> + + <sect2 id="using-libltdl"> + <title><command>libltdl</command></title> + + <para>一些 ports 会使用 <command>libltdl</command> 库, + 后者是 <command>libtool</command> 软件包的一部分。 + 使用这个库并不意味着必须使用 + <command>libtool</command> 本身, 因此提供了另一组结构。</para> + + <programlisting>USE_AUTOTOOLS= libltdl:<replaceable>版本</replaceable></programlisting> + + <para>目前, 这一设置所做的全部工作是将 + <makevar>LIB_DEPENDS</makevar> 设置为适当的 + <command>libltdl</command> port, 并作为一项方便的功能, + 协助开发人员消除在 <makevar>USE_AUTOTOOLS</makevar> 框架以外的, + 对于 autotools port 的依赖。 这个工具并不提供其它的操作符。</para> + + <informaltable frame="none"> + <tgroup cols="2"> + <thead> + <row> + <entry>先前的写法</entry> + + <entry>新的 <makevar>USE_AUTOTOOLS</makevar> 结构</entry> + </row> + </thead> + + <tbody> + <row> + <entry><literal>USE_LIBLTDL=YES</literal></entry> + + <entry><literal>libltdl:15</literal></entry> + </row> + + </tbody> + </tgroup> + </informaltable> + + </sect2> + + <sect2 id="using-autoconf"> + <title><command>autoconf</command> 和 + <command>autoheader</command></title> + + <para>某些 port 并没有直接提供 configure 脚本, 但包含了作为 + autoconf 模板的 <filename>configure.ac</filename> 文件。 + 可以用下列设置来要求 + <command>autoconf</command> 创建 configure 脚本, + 并使用 <command>autoheader</command> 来为 configure + 脚本创建模板头文件。</para> + + <programlisting>USE_AUTOTOOLS= autoconf:<replaceable>版本</replaceable>[:env]</programlisting> + + <para>以及</para> + + <programlisting>USE_AUTOTOOLS= autoheader:<replaceable>版本</replaceable></programlisting> + + <para>上述设置会暗含使用 + <literal>autoconf:<replaceable>版本</replaceable></literal>。</para> + + <para>对于 <command>libtool</command>, 设置与前面类似。 + 如果指定可选的 <literal>:env</literal> 操作符, + 则表示只设置用于后续工作的环境。 如果不指定, + 则会对 port 进行相应的修补和重新配置。</para> + + <informaltable frame="none"> + <tgroup cols="2"> + <thead> + <row> + <entry>先前的写法</entry> + + <entry>新的 <makevar>USE_AUTOTOOLS</makevar> 结构</entry> + </row> + </thead> + + <tbody> + <row> + <entry><literal>USE_AUTOCONF_VER=213</literal></entry> + + <entry><literal>autoconf:213</literal></entry> + </row> + + <row> + <entry><literal>WANT_AUTOCONF_VER=259</literal></entry> + + <entry><literal>autoconf:259:env</literal></entry> + </row> + + <row> + <entry><literal>USE_AUTOHEADER_VER=253</literal></entry> + + <entry><literal>autoheader:253</literal> (implies + <literal>autoconf:253</literal>)</entry> + </row> + + </tbody> + </tgroup> + </informaltable> + + <para>其它的可选变量, 如 + <makevar>AUTOCONF_ARGS</makevar> 和 + <makevar>AUTOHEADER_ARGS</makevar> 可以通过 port 的 + <filename>Makefile</filename> 来显式地指定替换。 + 类似 <command>libtool</command>, 多数 port 并不需要这样做。</para> + + </sect2> + + <sect2 id="using-automake"> + <title><command>automake</command> 和 + <command>aclocal</command></title> + + <para>某些软件包只提供了 <filename>Makefile.am</filename> + 文件。 这些文件必须首先用 + <command>automake</command> 转换为 + <filename>Makefile.in</filename> 并使用 + <command>configure</command> 来生成实际的 + <filename>Makefile</filename>。</para> + + <para>类似地, 偶尔会有一些软件包不提供构建所需的 + <filename>aclocal.m4</filename> 文件。 + 这些文件可以通过使用 <command>aclocal</command> + 来扫描 <filename>configure.ac</filename> 或 + <filename>configure.in</filename> 自动生成。</para> + + <para><command>aclocal</command> 与 + <command>automake</command> 有和 <command>autoheader</command> + 与 <command>autoconf</command> 在前面一节中所介绍的相类似的关系。 + <command>aclocal</command> 会暗含使用 + <command>automake</command>, 因此:</para> + + <programlisting>USE_AUTOTOOLS= automake:<replaceable>版本</replaceable>[:<replaceable>env</replaceable>]</programlisting> + + <para>和</para> + + <programlisting>USE_AUTOTOOLS= aclocal:<replaceable>版本</replaceable></programlisting> + + <para>也自动暗含使用 + <literal>automake:<replaceable>版本</replaceable></literal>。</para> + + <para>与 <command>libtool</command> 类似, + <command>autoconf</command> 如果使用了可选的 + <literal>:env</literal> 操作符表示仅仅设置用于后续使用的环境, + 如果不设置, 则会对 port 进行重新配置。</para> + + <informaltable frame="none"> + <tgroup cols="2"> + <thead> + <row> + <entry>先前的写法</entry> + + <entry><makevar>USE_AUTOTOOLS</makevar> construct</entry> + </row> + </thead> + + <tbody> + <row> + <entry><literal>USE_AUTOMAKE_VER=14</literal></entry> + + <entry><literal>automake:14</literal></entry> + </row> + + <row> + <entry><literal>WANT_AUTOMAKE_VER=15</literal></entry> + + <entry><literal>automake:15:env</literal></entry> + </row> + + <row> + <entry><literal>USE_ACLOCAL_VER=19</literal></entry> + + <entry><literal>aclocal:19</literal> (implies + <literal>automake:19</literal>)</entry> + </row> + + </tbody> + </tgroup> + </informaltable> + + <para>As with + <command>autoconf</command> 和 <command>autoheader</command>、 + <command>automake</command> 和 <command>aclocal</command> + 提供了对应的可选参数变量 <makevar>AUTOMAKE_ARGS</makevar> 和 + <makevar>ACLOCAL_ARGS</makevar>, 如果需要的话, + 可以在 port 的 <filename>Makefile</filename> 中指定。</para> + + </sect2> + </sect1> + <sect1 id="using-perl"> <title>使用 <literal>perl</literal></title> <table frame="none"> - <title>使用 <literal>perl</literal> 的 ports 可以使用的变量</title> + <title>用于用到 <literal>perl</literal> 的 port 的变量</title> <tgroup cols="2"> <thead> @@ -3875,11 +4352,22 @@ LDCONFIG_DIRS= %%PREFIX%%/lib/foo %%PREFIX%%/lib/bar</programlisting> </tbody> </tgroup> </table> + + <note> + <para>Perl 模块通常并没有官方网站, 这些 port + 应将 <hostid>cpan.org</hostid> 作为其 + <filename>pkg-descr</filename> WWW 行的内容。 推荐的 URL 格式为 + <literal>http://search.cpan.org/dist/Module-Name</literal>。</para> + </note> + </sect1> <sect1 id="using-x11"> <title>使用 X11</title> + <sect2 id="x11-variables"> + <title>Variable definitions</title> + <table frame="none"> <title>用到 X 的 port 可以使用的变量</title> @@ -3931,7 +4419,7 @@ LDCONFIG_DIRS= %%PREFIX%%/lib/foo %%PREFIX%%/lib/bar</programlisting> <row> <entry><makevar>X_IMAKE_PORT</makevar></entry> - <entry>用以提供 <command>imake</command> 以及许多其他用于构建 + <entry>用以提供 <command>imake</command> 以及许多其它用于构建 X11 的工具的 port。</entry> </row> @@ -4036,197 +4524,75 @@ RUN_DEPENDS= ${X11BASE}/bin/xfs:${X_FONTSERVER_PORT} \ USE_XLIB= yes</programlisting> </example> - </sect1> - - <sect1 id="using-automake"> - <title>使用 <command>automake</command>、 <command>autoconf</command>, - 以及 <command>libtool</command></title> - - <table frame="none"> - <title>用到 automake, autoconf 或 libtool 的 port 可以使用的变量</title> - - <tgroup cols="2"> - <thead> - <row> - <entry>变量</entry> - - <entry>意义</entry> - </row> - </thead> - - <tbody> - <row> - <entry><makevar>AUTOMAKE</makevar></entry> - - <entry>如果没有在 <envar>PATH</envar> 中的话, - <command>automake</command> 的完整路径。</entry> - </row> - - <row> - <entry><makevar>USE_AUTOMAKE_VER</makevar></entry> - - <entry>表示此 port 使用 <command>automake</command>。 - 它可能的取值包括 <literal>14</literal> 和 - <literal>15</literal>, 并且会自动地设置 - <makevar>AUTOMAKE_DIR</makevar> 和 - <makevar>ACLOCAL_DIR</makevar> 这两个变量为适当的值。</entry> - </row> - - <row> - <entry><makevar>AUTOMAKE_ARGS</makevar></entry> - - <entry>设置了 <makevar>USE_AUTOMAKE_VER</makevar> 时, 希望传递给 - <makevar>AUTOMAKE</makevar> 的参数。</entry> - </row> - - <row> - <entry><makevar>AUTOMAKE_ENV</makevar></entry> - - <entry>执行 <makevar>AUTOMAKE</makevar> 之前应设置的环境变量 - (以及这些变量的值)。</entry> - </row> - - <row> - <entry><makevar>ACLOCAL</makevar></entry> - - <entry>GNU <command>aclocal</command> 的完整路径, - 如果它不在 <envar>PATH</envar> 中的话。 默认值是 - <makevar>USE_AUTOMAKE_VER</makevar> 变量的设置决定的。</entry> - </row> - - <row> - <entry><makevar>ACLOCAL_DIR</makevar></entry> - - <entry>GNU <command>aclocal</command> 共享目录的完整路径。 默认值是由 - <makevar>USE_AUTOMAKE_VER</makevar> 变量的设置决定的。</entry> - </row> - - <row> - <entry><makevar>AUTOMAKE_DIR</makevar></entry> - - <entry>GNU <command>automake</command> 共享目录的完整路径。 默认值是由 - <makevar>USE_AUTOMAKE_VER</makevar> 变量的设置决定的。</entry> - </row> - - <row> - <entry><makevar>USE_AUTOCONF_VER</makevar></entry> - - <entry>指定 port 所用 <command>autoconf</command> 的版本。 - 它会自动设置 <literal>GNU_CONFIGURE</literal>。 - 此变量默认值为 213。</entry> - </row> - - <row> - <entry><makevar>AUTOCONF</makevar></entry> - - <entry>GNU <command>autoconf</command> 的完整路径, - 如果它不在 <envar>PATH</envar> 中的话。 默认值与 - <makevar>USE_AUTOCONF_VER</makevar> 变量的设置有关。</entry> - </row> - - <row> - <entry><makevar>AUTOCONF_ARGS</makevar></entry> - - <entry>传递给 <command>autoconf</command> 的命令行参数。</entry> - </row> - - <row> - <entry><makevar>AUTOCONF_ENV</makevar></entry> - - <entry>在运行 <command>autoconf</command> 之前, 将按照它来设置 - <literal><replaceable>变量名</replaceable>=<replaceable>值</replaceable></literal> - 的环境变量。</entry> - </row> - - <row> - <entry><makevar>USE_AUTOHEADER_VER</makevar></entry> - - <entry>指定 port 所用的 <command>autoheader</command> 版本。 - 它会自动设置 <literal>USE_AUTOCONF_VER</literal>。 - 此变量默认值为 213。</entry> - </row> - - <row> - <entry><makevar>AUTOHEADER</makevar></entry> - <entry>GNU <command>autoheader</command> 的完整路径, - 如果它不在 <envar>PATH</envar> 中的话。 默认值和 - <makevar>USE_AUTOCONF_VER</makevar> 的设置有关。</entry> - </row> - - <row> - <entry><makevar>AUTORECONF</makevar></entry> + </sect2> - <entry>GNU <command>autoreconf</command> 的完整路径, - 如果它不在 <envar>PATH</envar> 中的话。 默认值和 - <makevar>USE_AUTOCONF_VER</makevar> 的设置有关。</entry> - </row> + <sect2 id="x11-motif"> + <title>需要使用 Motif 的 port</title> - <row> - <entry><makevar>AUTOSCAN</makevar></entry> + <para>如果您的 port 需要 Motif 库, 则应在 + <filename>Makefile</filename> 中定义 <makevar>USE_MOTIF</makevar>。 + 默认的 Motif 实现是 + <filename role="package">x11-toolkits/open-motif</filename>。 + 用户可以通过设置 <makevar>WANT_LESSTIF</makevar> 变量来选择 + <filename role="package">x11-toolkits/lesstif</filename> 代替它。</para> - <entry>GNU <command>autoscan</command> 的完整路径, - 如果它不在 <envar>PATH</envar> 中的话。 默认值和 - <makevar>USE_AUTOCONF_VER</makevar> 的设置有关。</entry> - </row> + <para><filename>bsd.port.mk</filename> 会将 <makevar>MOTIFLIB</makevar> + 变量设置为到合适的 Motif 库的引用。 请使用补丁将您 port 中 + <filename>Makefile</filename> 或 + <filename>Imakefile</filename> 提到 Motif + 库的地方改为 <literal>${MOTIFLIB}</literal>。</para> - <row> - <entry><makevar>AUTOIFNAMES</makevar></entry> + <para>有两种比较常见的情况:</para> - <entry>GNU <command>autoifnames</command> 的完整路径, - 如果它不在 <envar>PATH</envar> 中的话。 默认值和 - <makevar>USE_AUTOCONF_VER</makevar> 的设置有关。</entry> - </row> + <itemizedlist> + <listitem> + <para>如果 port 中将 Motif 在其 <filename>Makefile</filename> 或 + <filename>Imakefile</filename> 表达为 + <literal>-lXm</literal>, 则简单地将其替换为 + <literal>${MOTIFLIB}</literal>。</para> + </listitem> - <row> - <entry><makevar>USE_LIBTOOL_VER</makevar></entry> + <listitem> + <para>如果 port 在其 <filename>Imakefile</filename> + 中使用 <literal>XmClientLibs</literal>, 则将其改为 + <literal>${MOTIFLIB} ${XTOOLLIB} + ${XLIB}</literal>.</para> + </listitem> - <entry>这一 port 使用的 <command>libtool</command> 版本。 它会自动设置 - <makevar>GNU_CONFIGURE</makevar>。 默认值是 13。</entry> - </row> + </itemizedlist> - <row> - <entry><makevar>LIBTOOL</makevar></entry> + <para>注意 <makevar>MOTIFLIB</makevar> (通常) 会展开为 + <literal>-L/usr/X11R6/lib -lXm</literal> 或 + <literal>/usr/X11R6/lib/libXm.a</literal>, 所以不需要在其前加入 + <literal>-L</literal> 或 <literal>-l</literal>。</para> - <entry><command>libtool</command> 的完整路径, - 如果它不在 <envar>PATH</envar> 中的话。</entry> - </row> + </sect2> - <row> - <entry><makevar>LIBTOOLFILES</makevar></entry> + <sect2> + <title>X11 字体</title> - <entry>用于对 <command>libtool</command> 作自动修改的文件。 - 如果定义了 <makevar>USE_AUTOCONF</makevar>, - 则是 <literal>aclocal.m4</literal>; 否则应该是 - <literal>configure</literal>。</entry> - </row> + <para>如果 port 将为 X Window 系统安装字体, 将这些字体放到 + <filename><makevar>X11BASE</makevar>/lib/X11/fonts/local</filename>。<para> - <row> - <entry><makevar>LIBTOOLFLAGS</makevar></entry> + </sect2> - <entry>将要传递给 - <command>ltconfig</command> 的额外标志参数。 默认是 - <literal>--disable-ltlibs</literal>。</entry> - </row> - </tbody> - </tgroup> - </table> </sect1> <sect1 id="using-gnome"> <title>使用 GNOME</title> - <para>The FreeBSD/GNOME project 使用一组自己的变量来定义 port + <para>FreeBSD/GNOME 项目组使用一组自己的变量来定义 port 所使用的 GNOME 组件。 - <ulink url="http://www.FreeBSD.org/gnome/docs/porting.html">这些变量的详细列表 - </ulink> 可以在 FreeBSD/GNOME 项目的主页找到。</para> + <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 安装 + 的话, 您的 port 就不需要依赖 GNOME。 同其它 port 类似, + 您的 port 应做好清理的准备, 并删除那些空目录。 假定您的 port 安装 <filename>gtkmumble.pc</filename> 到上述位置, 则应在 <filename>pkg-plist</filename> 中加入:</para> @@ -4244,18 +4610,18 @@ USE_XLIB= yes</programlisting> <title>使用 KDE</title> <table frame="none"> - <title>用于使用 KDE 的 port 的变量</title> + <title>用于用到 KDE 的 port 的变量</title> <tgroup cols="2"> <tbody> <row> <entry><makevar>USE_QT_VER</makevar></entry> - <entry>表示您的 port 有用到了 Qt。 可选的值是 + <entry>表示您的 port 使用了 Qt。 可选的值是 <literal>1</literal> 和 <literal>3</literal>; 它们表示所用的 Qt 的主版本号。 这个变量将自动把 <makevar>MOC</makevar> 和 - <makevar>QTCPPFLAGS</makevar> 设置为适当的值。</entry> + <makevar>QTCPPFLAGS</makevar> 默认设置为适当的值。</entry> </row> <row> @@ -4325,7 +4691,7 @@ USE_XLIB= yes</programlisting> <tbody> <row> <entry><makevar>USE_JAVA</makevar></entry> - <entry>只有定义它才能使其他变量生效。</entry> + <entry>只有定义它才能使其它变量生效。</entry> </row> <row> <entry><makevar>JAVA_VERSION</makevar></entry> @@ -4540,17 +4906,17 @@ USE_XLIB= yes</programlisting> </row> <row> <entry><makevar>JAVALIBDIR</makevar></entry> - <entry>其他 port 安装的 JAR 文件所在的目录。 默认值: + <entry>其它 port 安装的 JAR 文件所在的目录。 默认值: <filename>${LOCALBASE}/share/java/classes</filename>。</entry> </row> </tbody> </tgroup> </table> - <para>相关的项也在 + <para>相关的项也会定义在 <makevar>PLIST_SUB</makevar> (在 - <xref linkend="porting-plist"> 中进行介绍) 和 - <makevar>SUB_LIST</makevar> 提供了对应的定义。</para> + <xref linkend="plist-sub"> 中进行介绍) 和 + <makevar>SUB_LIST</makevar> 中。</para> </sect2> @@ -4559,15 +4925,15 @@ USE_XLIB= yes</programlisting> <para>如果 port 采用 Apache Ant 进行构建, 则需要定义 <makevar>USE_ANT</makevar>。 如是, 则 Ant - 将作为 子-make 命令来使用。 如果 port 未予定义 - <literal>do-build</literal> target, 则默认将依 <makevar>MAKE_ENV</makevar>、 - <makevar>MAKE_ARGS</makevar> 和 <makevar>ALL_TARGETS</makevar> - 的设置执行 Ant。 这类似于 <makevar>USE_GMAKE</makevar> 的机制, - 后者在 <xref linkend="makefile-build"> 有所介绍。</para> + 将作为 子-make 命令来使用。 如果 port 未定义 <literal>do-build</literal> + target, 则将默认依 <makevar>MAKE_ENV</makevar>、 + <makevar>MAKE_ARGS</makevar> 和 <makevar>ALL_TARGETS</makevar>. + 的设置执行 Ant。 这类似于 <xref linkend="building"> 中介绍的关于 + <makevar>USE_GMAKE</makevar> 的机制。</para> <para>若 <command>jikes</command> 被作为 - <command>javac</command> 使用 (参见 <xref linkend="java-variables"> - 中的 <makevar>USE_JIKES</makevar>), 则 Ant 将自动地用它来构建 port。</para> + <command>javac</command> 使用 (参见 <xref linkend="java-variables"> 中的 + <makevar>USE_JIKES</makevar>), 则 Ant 会自动将其用于 port 的构建过程。</para> </sect2> @@ -4575,7 +4941,7 @@ USE_XLIB= yes</programlisting> <title>最佳实践</title> <para>如果您正移植某个 Java 库, 您的 port 应把 - JAR 文件安装到 <filename>${JAVAJARDIR}</filename>, 而其他文件则应放在 + JAR 文件安装到 <filename>${JAVAJARDIR}</filename>, 而其它文件则应放在 <filename>${JAVASHAREDIR}/${PORTNAME}</filename> 下 (除了文档, 参见下文)。 要减少打包文件的尺寸, 您可以直接在 <filename>Makefile</filename> 中引用这些 JAR 文件, @@ -4587,12 +4953,12 @@ USE_XLIB= yes</programlisting> <para>移植 Java 应用程序时, port 通常会希望将所有文件安装到同一目录 (包括其依赖的 JAR)。 这时强烈建议使用 <filename>${JAVASHAREDIR}/${PORTNAME}</filename>。 - 移植软件的开发人员, 可以自行决定是否将所依赖的其他 JAR 安装到此目录, + 移植软件的开发人员, 可以自行决定是否将所依赖的其它 JAR 安装到此目录, 或直接使用已经装好的那些 (来自 <filename>${JAVAJARDIR}</filename>)。</para> <para>无论您正制作哪一类的 port (库或者应用程序), - 附加的文档都应安装到和其他 port + 附加的文档都应安装到和其它 port <link linkend="dads-documentation">同样的位置</link>。 已经知道, JavaDoc 会根据 JDK 版本的不同而产生不同的文件。 对于那些不打算强制使用某一特定版本 JDK 的 port 而言, @@ -4609,7 +4975,7 @@ USE_XLIB= yes</programlisting> <filename>${JAVASHAREDIR}/${PORTNAME}</filename> 是一个好主意。 当然, <makevar>DATADIR</makevar> 会自动加到 <makevar>PLIST_SUB</makevar> 中 (在 <xref - linkend="porting-plist"> 有所介绍) 因此您可以在 + linkend="plist-sub"> 有所介绍) 因此您可以在 <filename>pkg-plist</filename> 中直接使用 <literal>%%DATADIR%%</literal>。</para> @@ -4623,7 +4989,7 @@ USE_XLIB= yes</programlisting> 请首先参阅 <ulink url="http://www.freebsd.org/cgi/cvsweb.cgi/ports/Mk/bsd.java.mk"> bsd.java.mk CVS 日志</ulink>, 因为通常撰文介绍最新特性需要一些时间。 - 此外, 如果您认为所缺少的支持对许多其他 Java port 亦属有益, + 此外, 如果您认为所缺少的支持对许多其它 Java port 亦属有益, 请在 &a.java; 对其进行讨论。</para> <para>在 PR 中的 <literal>java</literal> 类别, @@ -4843,10 +5209,10 @@ _DOCSDIR= . <entry>使用 Python distutils 来完成配置、 编译和安装。 对包含 <filename>setup.py</filename> 的 port 而言这是必需的。 它会自动覆盖默认的 - <maketarget>do-build</maketarget> 和 - <maketarget>do-install</maketarget> 两个 target。 - 如果没有定义 <makevar>GNU_CONFIGURE</makevar>, - 也会覆盖 <maketarget>do-configure</maketarget> 行为。</entry> + <maketarget>do-build</maketarget> 以及 + <maketarget>do-install</maketarget> 这两个 target。 如未定义 + <makevar>GNU_CONFIGURE</makevar>, + 它还会改变 <maketarget>do-configure</maketarget>。</entry> </row> <row> @@ -4861,23 +5227,23 @@ _DOCSDIR= . <entry>全站 package 所在的目录, 它包括了 Python 的安装目录 (通常是 <makevar>LOCALBASE</makevar>)。 - 而 <makevar>PYTHON_SITELIBDIR</makevar> 变量, - 对于安装 Python 模块则非常有用。</entry> + 在安装 Python 模块时, <makevar>PYTHON_SITELIBDIR</makevar> + 变量会非常有用。</entry> </row> - + <row> <entry><makevar>PYTHONPREFIX_SITELIBDIR</makevar></entry> - - <entry>去掉了 PREFIX 部分的 PYTHON_SITELIBDIR。 应尽量在 + + <entry>去掉了 PREFIX 部分的 PYTHON_SITELIBDIR。 应尽可能在 <filename>pkg-plist</filename> 中使用 - <literal>%%PYTHON_SITELIBDIR%%</literal> 变量。 - <literal>%%PYTHON_SITELIBDIR%%</literal> 默认为 + <literal>%%PYTHON_SITELIBDIR%%</literal>。 + <literal>%%PYTHON_SITELIBDIR%%</literal> 的默认值是 <literal>lib/python%%PYTHON_VERSION%%/site-packages</literal></entry> </row> <row> <entry><makevar>PYTHON_CMD</makevar></entry> - + <entry>Python 解释器的命令行, 包括版本号。</entry> </row> @@ -5147,238 +5513,295 @@ USE_SDL+= mixer .include <bsd.port.post.mk></programlisting> </sect1> - </chapter> - <chapter id="porting-masterdir"> - <title><makevar>MASTERDIR</makevar> (主 port 所在的目录)</title> + <sect1 id="rc-scripts"> + <title>启动和停止服务 (rc 脚本)</title> - <para>如果您的 port 需要通过某些变量 (例如, 分辨率, 或纸型) - 取不同的值来构建软件包, - 则为它创建一个新的目录将使用户更容易知道他们自己在做什么; - 此时应在不同的 port 之间共享尽可能多的文件。 一般情况下, 您只需要一个很短的 - <filename>Makefile</filename>, 如果对变量的运用得当的话。 - 这种 <filename>Makefile</filename> 中可以使用 <makevar>MASTERDIR</makevar> - 来指定其他文件所在的目录。 另外, 您还应指定一个 - <link linkend="porting-pkgname"><makevar>PKGNAMESUFFIX</makevar></link> - 以便让 package 的名字上有所区别。</para> + <para>系统引导时, 启动脚本会被用来启动服务; 此外, + 它还为管理员提供了一种标准的方式来停止、 启动或重启服务。 + 在系统的 <filename>rc.d</filename> 框架中集成了对于 ports 的支持。 + 关于如何使用它的具体介绍, 可以在 + <ulink url="&url.books.handbook;/configtuning-rcng.html">使用手册中的对应章节</ulink> + 找到。 可用命令的详细介绍, 则可以在 + &man.rc.subr.8; 找到。</para> - <para>这些使用例子来加以阐述会更为明晰。 下面是 - <filename>japanese/xdvi300/Makefile</filename> 的部分代码:</para> + <para>可以安装一或多个 rc 脚本:</para> - <programlisting>PORTNAME= xdvi -PORTVERSION= 17 -PKGNAMEPREFIX= ja- -PKGNAMESUFFIX= ${RESOLUTION} - : -# default -RESOLUTION?= 300 -.if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \ - ${RESOLUTION} != 300 && ${RESOLUTION} != 400 - @${ECHO} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\"" - @${ECHO} "Possible values are: 118, 240, 300 (default) and 400." - @${FALSE} -.endif</programlisting> + <programlisting>USE_RC_SUBR= doorman.sh</programlisting> - <para><filename role="package">japanese/xdvi300</filename> 也提供了全部常规的补丁, - 以及打包用到的文件等等内容。 如果您在那里输入 <command>make</command>, - 它将使用默认的分辨率值 (300) 并构建 port。</para> + <para>这些脚本必须放到 <filename>files</filename> + 目录, 并附加 <literal>.in</literal> 后缀。 与基本系统中的 rc + 脚本唯一的区别在于, 这种脚本中的 + <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>与其他分辨率的版本类似, 下面是 <emphasis>完整的</emphasis> - <filename>xdvi118/Makefile</filename>:</para> + <para>与 &man.rcorder.8; 的集成是通过 + <makevar>USE_RCORDER</makevar> 而不是 + <makevar>USE_RC_SUBR</makevar> 来完成的。</para> - <programlisting>RESOLUTION= 118 -MASTERDIR= ${.CURDIR}/../xdvi300 + <para>以下是一个简单的 rc 脚本:</para> -.include "${MASTERDIR}/Makefile"</programlisting> + <programlisting>#!/bin/sh - <para>(<filename>xdvi240/Makefile</filename> 和 - <filename>xdvi400/Makefile</filename> 是相似的)。 - <makevar>MASTERDIR</makevar> 定义会告诉 - <filename>bsd.port.mk</filename> 常规的目录, - 例如 <makevar>FILESDIR</makevar> 和 - <makevar>SCRIPTDIR</makevar> 应该在 - <filename>xdvi300</filename> 中查找。 - <literal>RESOLUTION=118</literal> 这行将覆盖在 - <filename>xdvi300/Makefile</filename> 所进行的 - <literal>RESOLUTION=300</literal> 设置, 从而以分辨率 118 - 构建 port。</para> - </chapter> +# PROVIDE: doorman +# REQUIRE: LOGIN +# KEYWORD: FreeBSD - <chapter id="shared"> - <title>共享库的版本</title> +# +# 在 /etc/rc.conf 中增加下述设置可以启用 doorman: +# doorman_enable (bool): 默认设为 "NO"。 +# 设为 "YES" 表示启用 doorman。 +# doorman_config (path): 默认设为 "%%PREFIX%%/etc/doormand/doormand.cf"。 +# - <para>请阅读我们的 <ulink url="&url.books.developers-handbook;/policies-shlib.html">关于共享库版本命名的规定</ulink> - 以了解在为共享库指定版本时的一般规则。 - 不要盲目地假定软件的作者知道他们在做什么; 许多人并不清楚。 - 仔细地考虑这些细节非常重要, 因为我们需要面对许多互相冲突的软件并存的情形。 - 粗心地引入 port 曾经在过去导致过非常严重的问题 (您是否留意过, - 为什么 <filename>jpeg-6b</filename> 的共享库版本是 9?)。 如果有疑虑, - 请致信 &a.ports; 询问。 绝大多数时候, - 您的工作会以选择了一个适当的共享库版本, - 并恰当地对软件进行修改而得以实现。</para> +. %%RC_SUBR%% -<!-- - <para>However, if there is a port which is a different version of the - same software already in the tree, the situation is much more complex. - In short, the FreeBSD implementation does not allow the user to - specify to the linker which version of shared library to link against - (the linker will always pick the highest numbered version). This - means, if there is a <filename>libfoo.so.3.2</filename> and - <filename>libfoo.so.4.0</filename> in the system, there is no way to - tell the linker to link a particular application to - <filename>libfoo.so.3.2</filename>. It is essentially completely - overshadowed in terms of compilation-time linkage. In this case, the - only solution is to rename the <emphasis>base</emphasis> part of the - shared library. For instance, change - <filename>libfoo.so.4.0</filename> to - <filename>libfoo4.so.1.0</filename> so both version 3.2 and 4.0 can be - linked from other ports.</para> ---> - </chapter> +name="doorman" +rcvar=`set_rcvar` - <chapter id="porting-manpages"> - <title>联机手册</title> +load_rc_config $name - <para>如果使用了 <makevar>MAN[1-9LN]</makevar> 变量, - 就会自动地将联机手册加入到 <filename>pkg-plist</filename> 中 - (这意味着您 <emphasis>绝不</emphasis> 应该把联机手册列入 - <filename>pkg-plist</filename>—参见 <link - linkend="porting-plist">生成 PLIST</link> 了解更多细节)。 - 此外, 这也会让安装阶段自动地根据在 <filename>/etc/make.conf</filename> - 中的 <makevar>NOMANCOMPRESS</makevar> 设置来压缩或解压缩联机手册文件。</para> - - <para>如果您的 port 尝试将联机手册使用硬连接安装成多个名字, - 则必须通过 <makevar>MLINKS</makevar> 变量来予以说明。 - 由您的 port 安装的连接会被 <filename>bsd.port.mk</filename> - 毁掉和重建, 以保证它们指向了正确的文件。 所有在 MLINKS 中给出的联机手册, - 都不应再在 <filename>pkg-plist</filename> 中列出。</para> - - <para>要指定联机手册是否在安装时进行压缩, - 可以使用 <makevar>MANCOMPRESSED</makevar> 变量。 - 这个变量可以使用三个值, <literal>yes</literal>、 <literal>no</literal> 和 - <literal>maybe</literal>。 <literal>yes</literal> - 表示联机手册已经以压缩的形式安装, <literal>no</literal> 表示还没有, - 而 <literal>maybe</literal> 则表示所安装的软件会尊重 - <makevar>NOMANCOMPRESS</makevar> 的设置值, 换言之 - <filename>bsd.port.mk</filename> 不需要做什么特别的事情。</para> +: ${doorman_enable="NO"} +: ${doorman_config="%%PREFIX%%/etc/doormand/doormand.cf"} - <para>如果设置了 <makevar>USE_IMAKE</makevar> 而未定义 - <makevar>NO_INSTALL_MANPAGES</makevar>, - <makevar>MANCOMPRESSED</makevar> 会自动设置为 - <literal>yes</literal>, 反之则是 <literal>no</literal>。 - 除非默认值不合适, 否则就不需要在您的 port 中修改之。</para> +command=%%PREFIX%%/sbin/doormand +pidfile=/var/run/doormand.pid +command_args="-p $pidfile -f $doorman_config" - <para>如果您的 port 将手册页的目录放到了 - <makevar>PREFIX</makevar> 以外的地方, 则可以使用 - <makevar>MANPREFIX</makevar> 来设置它。 此外, - 如果只有某些部分的联机手册会安装到不标准的位置, 例如某些 <literal>perl</literal> - 模块的 port, 还可以配置 - <makevar>MAN<replaceable>sect</replaceable>PREFIX</makevar> (这里 - <replaceable>sect</replaceable> 是 <literal>1-9</literal>、 - <literal>L</literal> 或 <literal>N</literal> 之一)。</para> +run_rc_command "$1"</programlisting> - <para>如果您的联机手册需要装入专用于某一语言专用的子目录, - 需要将 <makevar>MANLANG</makevar> 设置为那一语言。 - 这个变量的默认值是 <literal>""</literal> (也就是只用英语)。</para> + </sect1> + </chapter> - <para>下面是一个综合的例子。</para> + <chapter id="plist"> + <title>高级 <filename>pkg-plist</filename> 用法</title> - <programlisting>MAN1= foo.1 -MAN3= bar.3 -MAN4= baz.4 -MLINKS= foo.1 alt-name.8 -MANLANG= "" ja -MAN3PREFIX= ${PREFIX}/share/foobar -MANCOMPRESSED= yes</programlisting> + <sect1 id="plist-sub"> + <title>根据 make 变量对 <filename>pkg-plist</filename> 进行修改</title> - <para>这表示 port 会安装六个文件;</para> + <para>某些 port, 特别是 <literal>p5-</literal> port, + 会需要根据配置选项 (或对于 <literal>p5-</literal> port 而言, + <literal>perl</literal> 的版本) 来修改它们的 <filename>pkg-plist</filename>。 + 为简化这一工作, 在 + <filename>pkg-plist</filename> 中的 <literal>%%OSREL%%</literal>、 + <literal>%%PERL_VER%%</literal>, 以及 + <literal>%%PERL_VERSION%%</literal> 将自动进行相应的替换。 + 其中, <literal>%%OSREL%%</literal> 的值是操作系统以数值表示的版本 (例如 + <literal>4.9</literal>)。 <literal>%%PERL_VERSION%%</literal> + 则是 <command>perl</command> 的完整版本号 (例如 + <literal>5.00502</literal>) 而 <literal>%%PERL_VER%%</literal> + 是 <command>perl</command> 的版本去掉 patchlevel + 的部分 (例如 <literal>5.005</literal>)。 许多其它与 port 文档文件有关的 + <literal>%%<replaceable>变量</replaceable>%%</literal> 在 <link + linkend="dads-documentation">相应章节</link> 中进行了介绍。</para> + + <para>如果您还需要进行其它的替换, 可以通过将 + <makevar>PLIST_SUB</makevar> 变量设置为一组 + <literal><replaceable>变量</replaceable>=<replaceable>值</replaceable></literal> + 对来实现。 其中, <literal>%%<replaceable>VAR</replaceable>%%</literal> + 表示在 <filename>pkg-plist</filename> 中将被 + <replaceable>值</replaceable> 替换的那些文字。</para> + + <para>举例来说, 如果 port 需要把很多文件放到和版本有关的目录中, + 可以在 <filename>Makefile</filename> 中按照类似下面的例子:</para> - <programlisting>${PREFIX}/man/man1/foo.1.gz -${PREFIX}/man/ja/man1/foo.1.gz -${PREFIX}/share/foobar/man/man3/bar.3.gz -${PREFIX}/share/foobar/man/ja/man3/bar.3.gz -${PREFIX}/man/man4/baz.4.gz -${PREFIX}/man/ja/man4/baz.4.gz</programlisting> + <programlisting>OCTAVE_VERSION= 2.0.13 +PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}</programlisting> - <para>另外 <filename>${PREFIX}/man/man8/alt-name.8.gz</filename> - 可能会通过您的 port 安装, 也可能不会。 无论如何, - 都会创建一个符号连接, 把 foo(1) 和 - alt-name(8) 联机手册连起来。</para> + <para>并在 <filename>pkg-plist</filename> 中将具体的版本替换为 + <literal>%%OCTAVE_VERSION%%</literal>。 这样, 在升级 port 时, + 就不需要再到 <filename>pkg-plist</filename> 中修改那几十 (或者, + 有时甚至是上百) 行的内容了。</para> - </chapter> + <para>这一替换过程 (以及加入 <link + linkend="makefile-manpages">联机手册</link> 的过程), + 会在 <maketarget>pre-install</maketarget> 和 + <maketarget>do-install</maketarget> 两个 target 之间, 通过读取 + <filename><makevar>PLIST</makevar></filename> 并写入 + <filename><makevar>TMPPLIST</makevar></filename> + (默认情况下, 是: + <filename><makevar>WRKDIR</makevar>/.PLIST.mktmp</filename>) 来完成。 + 因此, 如果您的 port 动态生成 <filename><makevar>PLIST</makevar></filename>, + 就需要在 <maketarget>pre-install</maketarget> 之前完成。 + 另外, 如果您的 port 需要编辑所生成的文件, 则需要在 + <maketarget>post-install</maketarget> 中操作名为 + <filename><makevar>TMPPLIST</makevar></filename> 的那个文件。</para> + + <para>另一种可行的修改装箱单的方法, + 则是根据 <makevar>PLIST_FILES</makevar> 和 + <makevar>PLIST_DIRS</makevar> 这两个变量的设置来进行。 + 它们的值会作为目录名连同 <filename><makevar>PLIST</makevar></filename> + 的内容一起写入 <filename><makevar>TMPPLIST</makevar></filename>。 + 在 <makevar>PLIST_FILES</makevar> + 和 <makevar>PLIST_DIRS</makevar> 中列出的名字, 会经历前面所介绍的 + <literal>%%<replaceable>变量</replaceable>%%</literal> + 替换过程。 除此之外, 在 <makevar>PLIST_FILES</makevar> + 中列出的文件, 会不加任何修改第出现在最终的装箱单中, + 而 <literal>@dirrm</literal> 将作为前缀加到 <makevar>PLIST_DIRS</makevar> + 所列的名字之前。 为了达到目的, <makevar>PLIST_FILES</makevar> 和 + <makevar>PLIST_DIRS</makevar> 必须在写 + <filename><makevar>TMPPLIST</makevar></filename> 之前, + 也就是在 <maketarget>pre-install</maketarget> 或更早的阶段进行设置。</para> + </sect1> + + <sect1 id="plist-cleaning"> + <title>空目录</title> + + <sect2 id="plist-dir-cleaning"> + <title>清理空目录</title> + + <para>一定要让 port 在卸载时进行清理空目录。 + 通常, 可以通过为所有由 port 创建的目录增加对应的 + <literal>@dirrm</literal> 行来实现。 在删除父目录之前, + 需要首先删除它的子目录。</para> + + <programlisting> : +lib/X11/oneko/pixmaps/cat.xpm +lib/X11/oneko/sounds/cat.au + : +@dirrm lib/X11/oneko/pixmaps +@dirrm lib/X11/oneko/sounds +@dirrm lib/X11/oneko</programlisting> - <chapter id="porting-motif"> - <title>需要使用 Motif 的 port</title> + <para>然而, 有时 <literal>@dirrm</literal> 会由于其它 port + 使用了同一个目录而发生错误。 您可以在 <literal>@unexec</literal> + 中调用 <command>rmdir</command> 以便只删除空目录, + 而不给出任何警告。</para> - <para>许多程序在编译时会用到 Motif 库 (有很多商业版本, - 另外也有一个能够支持许多应用程序运行的 - <filename role="package">x11-toolkits/lesstif</filename>)。 - 因为这是一个非常流行的工具包, 而且其授权通常允许发布静态连接的可执行文件, - 我们对处理需要 Motif 的 port 是有一些特殊的规定, - 这样就能够轻松地编译动态连接的可执行文件 (用于从 port - 编译程序的用户) 或静态地连接 (用于那些希望发布 package 的用户)。</para> + <programlisting>@unexec rmdir %D/share/doc/gimp 2>/dev/null || true</programlisting> - <sect1 id="motif-use"> - <title><makevar>USE_MOTIF</makevar> (用到了 Motif)</title> + <para>按照上面的写法, 将不会显示任何错误信息, 而且,即使在 + <filename><makevar>PREFIX</makevar>/share/doc/gimp</filename> + 由于其它 port 在其中安装了一些文件的情况下, 它也不会导致 + &man.pkg.delete.1; 异常退出。</para> + </sect2> + + <sect2 id="plist-dir-empty"> + <title>如何建立空目录</title> + + <para>在 port 安装过程中创建的空目录需要特别留意。 安装 package + 时并不会自动创建这些目录, 这是因为 package 只保存文件。 + 要确保安装 package 时会自动创建这些空目录, 需要在 + <filename>pkg-plist</filename> 中加入与 + <literal>@dirrm</literal> 对应的行:</para> + + <programlisting>@exec mkdir -p %D/share/foo/templates</programlisting> + </sect2> - <para>如果您的 port 需要 Motif, 则应在 - <filename>Makefile</filename> 定义它。 这样没有安装 Motif - 的用户就不会尝试编译它了。</para> </sect1> - <sect1 id="motif-lib"> - <title><makevar>MOTIFLIB</makevar> (指定使用的 Motif 库版本)</title> + <sect1 id="plist-config"> + <title>配置文件</title> - <para>这个变量会被 <filename>bsd.port.mk</filename> 设置为对 Motif - 库的适当的引用。 请对您的 port 中用到的源代码进行修改, - 把所有直接指定 Motif 库的 <filename>Makefile</filename> 和 - <filename>Imakefile</filename> 改为使用这个变量。</para> + <para>如果 port 需要把一些文件放到 + <filename><makevar>PREFIX</makevar>/etc</filename>, + <emphasis>不要</emphasis> 简单地安装它们, 并将其列入 + <filename>pkg-plist</filename>, 因为这样会导致 + &man.pkg.delete.1; 删除用户精心编辑的文件, + 而新安装时则又会把这些文件覆盖。</para> - <para>下面是两种常见的情形:</para> + <para>因此, 您应把配置文件的例子按其它的后缀来安装 + (例如 <filename><replaceable>filename</replaceable>.sample</filename> + 就是一个不错的选择) 并显示一条 <link + linkend="porting-message">消息</link> + 告诉用户如何复制并编辑这个配置文件, 以便让软件能够正确工作。</para> + <para>因此, 应按其它的后缀来安装配置文件的例子 + (<filename><replaceable>filename</replaceable>.sample</filename> + 就是一个不错的选择)。 如果实际的配置文件不存在, + 则将其复制为实际文件的名字。 卸载时, 如果发现用户没有修改配置文件, + 则将其删除。 您需要在 port 的 <filename>Makefile</filename>, + 以及 <filename>pkg-plist</filename> (对于从 package + 安装的情形) 进行处理。</para> - <itemizedlist> - <listitem> - <para>如果 port 在其 <filename>Makefile</filename> 或 - <filename>Imakefile</filename> 中以 <literal>-lXm</literal> - 的形式引用了 Motif 库, 简单地将其改为 - <literal>${MOTIFLIB}</literal> 即可。</para> - </listitem> + <para>示例的 <filename>Makefile</filename> 部分:</para> - <listitem> - <para>如果 port 在其 <filename>Imakefile</filename> 中使用了 - <literal>XmClientLibs</literal>, 则应将其改为 - <literal>${MOTIFLIB} ${XTOOLLIB} - ${XLIB}</literal>。</para> - </listitem> + <programlisting>post-install: + @if [ ! -f ${PREFIX}/etc/orbit.conf ]; then \ + ${CP} -p ${PREFIX}/etc/orbit.conf.sample ${PREFIX}/etc/orbit.conf ; \ + fi</programlisting> - </itemizedlist> + <para>示例的 <filename>pkg-plist</filename> 部分:</para> - <para>注意 <makevar>MOTIFLIB</makevar> (通常情况下) 会展开成 - <literal>-L/usr/X11R6/lib -lXm</literal> 或 - <literal>/usr/X11R6/lib/libXm.a</literal>, 这样就不再需要在前面增加 - <literal>-L</literal> 或 <literal>-l</literal> 了。</para> + <programlisting>@unexec if cmp -s %D/etc/orbit.conf.sample %D/etc/orbit.conf; then rm -f %D/etc/orbit.conf; fi +etc/orbit.conf.sample +@exec if [ ! -f %D/etc/orbit.conf ] ; then cp -p %D/%F %B/orbit.conf; fi</programlisting> + + <para>另外, 还应显示一条 <link + linkend="porting-message">消息</link> 指出用户应在何处复制并编辑这个文件, + 以便让软件能开始正常工作。</para> </sect1> - </chapter> - <chapter id="x11-fonts"> - <title>X11 字体</title> + <sect1 id="plist-autoplist"> + <title>装箱单 (package list) 的自动化制作</title> - <para>如果您的 port 需要向 X Window 系统安装字体, 应把它们放到 - <filename><makevar>X11BASE</makevar>/lib/X11/fonts/local</filename>。 - 这个目录是在 <application>XFree86 3.3.3</application> 中新增的。 - 如果它不存在, 则应建立一个, 并给出一条消息要求用户将 - <application>XFree86</application> 更新到 3.3.3 或更新版本, - 或者, 至少将这个目录加入到 <filename>/etc/XF86Config</filename> - 中的字体路径中。</para> - </chapter> + <para>首先, 请确认已经基本上完成了 port 的工作, 仅缺 + <filename>pkg-plist</filename>。</para> - <chapter id="porting-info"> - <title>Info 文件</title> + <para>接下来, 建立一个临时的目录, 以便安装您的 port, + 首先在其中安装所有依赖的 port。 对于非 X 的 port, + <replaceable>port-type</replaceable> 应该是 <literal>local</literal>; + 而如果是一个遵循 XFree86 4 或更早的 XFree 86 版本目录结构的 port, + 则应相应地选择 <literal>x11-4</literal> 或 <literal>x11</literal>。</para> + + <screen>&prompt.root; <userinput>mkdir /var/tmp/<replaceable>port-name</replaceable></userinput> +&prompt.root; <userinput>mtree -U -f /etc/mtree/BSD.<replaceable>port-type</replaceable>.dist -d -e -p /var/tmp/<replaceable>port-name</replaceable></userinput> +&prompt.root; <userinput>make depends PREFIX=/var/tmp/<replaceable>port-name</replaceable></userinput></screen> + + <para>将目录结构保存到一新文件中。</para> + + <screen>&prompt.root; <userinput>(cd /var/tmp/<replaceable>port-name</replaceable> && find -d * -type d) | sort > OLD-DIRS</userinput></screen> + + <para>建立一空白 <filename>pkg-plist</filename> 文件:</para> + + <screen>&prompt.root; <userinput>touch pkg-plist</userinput></screen> + + <para>如果您的 port 遵循 <makevar>PREFIX</makevar> (应该如此) + 则接下来应安装该 port 并创建装箱单。</para> + + <screen>&prompt.root; <userinput>make install PREFIX=/var/tmp/<replaceable>port-name</replaceable></userinput> +&prompt.root; <userinput>(cd /var/tmp/<replaceable>port-name</replaceable> && find -d * \! -type d) | sort > pkg-plist</userinput></screen> + + <para>此外还应把新建立的目录加入装箱单。</para> + + <screen>&prompt.root; <userinput>(cd /var/tmp/<replaceable>port-name</replaceable> && find -d * -type d) | sort | comm -13 OLD-DIRS - | sort -r | sed -e 's#^#@dirrm #' >> pkg-plist</userinput></screen> + + <para>最后需要手工整理 packing list; 这一过程不是 + <emphasis>完全</emphasis> 自动的。 联机手册应列入 port + 的 <filename>Makefile</filename> 中的 + <makevar>MAN<replaceable>n</replaceable></makevar>, 而不是装箱单。 + 用户配置文件应被删除, 或以 + <filename><replaceable>filename</replaceable>.sample</filename> + 这样的名字来安装。 <filename>info/dir</filename> 文件, + 也不应列入, 同时应按照 <link linkend="makefile-info">info + 文件</link> 的说明来增加一些 <filename>install-info</filename> 行。 + 所有由 port 安装的库, 应按照 + <link linkend="porting-shlibs">动态连接库</link> + 小节中介绍的方法处理。</para> + + <para>另外, 也可以使用 + <filename>/usr/ports/Tools/scripts/</filename> 中的 + <command>plist</command> 脚本来自动创建 + package list。 第一步和上面一样, 也就是 + <command>mkdir</command>, <command>mtree</command> 并 + <command>make depends</command>。 然后构建和安装 + port:</para> + + <screen>&prompt.root; <userinput>make install PREFIX=/var/tmp/<replaceable>port-name</replaceable></userinput></screen> + + <para>然后让 <command>plist</command> 生成 + <filename>pkg-plist</filename> 文件:</para> + + <screen>&prompt.root; <userinput>/usr/ports/Tools/scripts/plist -Md -m /etc/mtree/BSD.<replaceable>port-type</replaceable>.dist /var/tmp/<replaceable>port-name</replaceable> > pkg-plist</userinput></screen> + + <para>与前面类似, 如此生成的装箱单也需要手工进行一些清理工作。</para> + + </sect1> - <para>如果您的 package 需要安装 GNU info 文件, - 应把它们列在 <makevar>INFO</makevar> 变量中 (不需要指定 - <literal>.info</literal> 后缀), 这样安装/卸载代码就会自动地在 package - 注册时加入到 <filename>pkg-plist</filename> 了。</para> </chapter> <chapter id="pkg-files"> @@ -5454,75 +5877,6 @@ ${PREFIX}/man/ja/man4/baz.4.gz</programlisting> <literal>pkg-req ${PKGNAME} DEINSTALL</literal> 的命令行执行。</para> </sect1> - <sect1 id="porting-plist"> - <title>根据 make 变量改变 <filename>pkg-plist</filename></title> - - <para>某些 port, 特别是 <literal>p5-</literal> port, - 会需要根据配置选项 (或对于 <literal>p5-</literal> 而言, - <literal>perl</literal> 的版本) 来对它们的<filename>pkg-plist</filename> - 进行修改。 为方便起见, 在 - <filename>pkg-plist</filename> 中的 <literal>%%OSREL%%</literal>、 - <literal>%%PERL_VER%%</literal>, 以及 - <literal>%%PERL_VERSION%%</literal> 都会被适当地予以替换。 - 其中, <literal>%%OSREL%%</literal> 表示操作系统的数字形式的值 (例如 - <literal>4.9</literal>)。 <literal>%%PERL_VERSION%%</literal> - 则被替换为 <command>perl</command> 的完整版本号 (例如, - <literal>5.00502</literal>) 而 <literal>%%PERL_VER%%</literal> - 则表示 <command>perl</command> 版本号去掉 patchlevel - 的部分 (例如, <literal>5.005</literal>)。 许多其它的关于 - ports 的文档文件的 - <literal>%%<replaceable>VARS</replaceable>%%</literal> 的描述, - 在 <link - linkend="dads-documentation">相关小节</link> 中会分别介绍。</para> - - <para>如果您还需要进行其它的替换, 可以通过在 - <makevar>PLIST_SUB</makevar> 变量中设置一组 - <literal><replaceable>VAR</replaceable>=<replaceable>VALUE</replaceable></literal> - 来把 <filename>pkg-plist</filename> 中的 - <literal>%%<replaceable>VAR</replaceable>%%</literal> - 替换为 <replaceable>VALUE</replaceable>。</para> - - <para>举例来说, 如果您的 port 需要把很多文件放到和版本有关的目录中, - 可以在 <filename>Makefile</filename> 中按照类似下面的例子:</para> - - <programlisting>OCTAVE_VERSION= 2.0.13 -PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}</programlisting> - - <para>来书写, 并把 <filename>pkg-plist</filename> 中的具体版本改为 - <literal>%%OCTAVE_VERSION%%</literal>。 这样, 在您升级 port 时, - 就不需要再到 <filename>pkg-plist</filename> 中修改那几十 (或者, - 某些情况下可能是数百) 行的内容了。</para> - - <para>这一替换 (以及加入 <link - linkend="porting-manpages">联机手册</link>) - 会在 <maketarget>pre-install</maketarget> 和 - <maketarget>do-install</maketarget> 两个 target 之间, 通过读取 - <filename><makevar>PLIST</makevar></filename> 并写入 - <filename><makevar>TMPPLIST</makevar></filename> 来完成 - (默认情况下, 是 - <filename><makevar>WRKDIR</makevar>/.PLIST.mktmp</filename>)。 - 如果您的 port 直接构建 <filename><makevar>PLIST</makevar></filename>, - 则应在 <maketarget>pre-install</maketarget> 或之前进行。 - 此外, 如果您的 port 需要编辑生成的最终文件, 应在 - <maketarget>post-install</maketarget> 中对 - <filename><makevar>TMPPLIST</makevar></filename> 进行操作。</para> - - <para>另一种可能是, 需要基于 <makevar>PLIST_FILES</makevar> 和 - <makevar>PLIST_DIRS</makevar> 变量配置来修改 port 的装箱单。 - 这两个变量的值会作为路径名写入到 <filename><makevar>TMPPLIST</makevar></filename> - 和 <filename><makevar>PLIST</makevar></filename>。 - 在 <makevar>PLIST_FILES</makevar> 和 <makevar>PLIST_DIRS</makevar> - 中列出的名字也会进行和前面介绍的方式相同的 - <literal>%%<replaceable>VAR</replaceable>%%</literal> - 替换。 初次之外, 在 <makevar>PLIST_FILES</makevar> - 中的路径名会不加修改地出现在最终的装箱单中, - 而 <literal>@dirrm</literal> 则会加入来自 <makevar>PLIST_DIRS</makevar> - 所预先指定的名字。 要达到效果, <makevar>PLIST_FILES</makevar> 和 - <makevar>PLIST_DIRS</makevar> 必须在写入 - <filename><makevar>TMPPLIST</makevar></filename> 之前进行设置, - 也就是 <maketarget>pre-install</maketarget> 或更早。</para> - </sect1> - <sect1 id="pkg-names"> <title id="porting-pkgfiles">改变 <filename>pkg-<replaceable>*</replaceable></filename> 文件的名字</title> @@ -5676,23 +6030,10 @@ as .putsy.conf and edit it.</programlisting> <note> <para>无论在 <filename>make.conf</filename> 中设置了什么选项, 这个文件都应能够正确地生成。 因此, - 应避免在 (例如) 某个依赖关系无法满足时使用 <literal>.error</literal>。</para> + 应避免在 (例如) 某个依赖关系无法满足时使用 <literal>.error</literal>。 + (参见 <xref linkend="dads-dot-error">。)</para> </note> - <example id="dot-error-breaks-index"> - <title>如何避免使用 <literal>.error</literal></title> - <para>考虑有人在 <filename>make.conf</filename> 中设置了 - <programlisting>USE_POINTYHAT=yes</programlisting> 的情形。 - 下面的例子中, 第一个 <filename>Makefile</filename> - 将导致 <command>make index</command> 失败, 而第二个不会:</para> - <programlisting>.if USE_POINTYHAT -.error "POINTYHAT is not supported" -.endif</programlisting> - <programlisting>.if USE_POINTYHAT -IGNORE=POINTYHAT is not supported -.endif</programlisting> - </example> - <para>如果 <command>make describe</command> 只是产生一个字符串, 而不是错误信息, 可能就没什么问题。 请参见 <filename>bsd.port.mk</filename> 以了解所生成的串的意义。</para> @@ -5736,7 +6077,7 @@ IGNORE=POINTYHAT is not supported <filename>/usr/X11R6</filename> 这样的路径, 这会让您的 port 灵活许多, 而且能够适应大型站点的需求。 对于使用了 <command>imake</command> 的 X port 而言, - 这是自动的; 对于其他 port, + 这是自动的; 对于其它 port, 这通常可以通过把在 脚本/<filename>Makefile</filename> 中出现的 <filename>/usr/local</filename> (或对于不使用 imake 的 X port, <filename>/usr/X11R6</filename>) 改为使用 @@ -5777,7 +6118,7 @@ IGNORE=POINTYHAT is not supported 而非 <literal>-DPAGER=\"/usr/local/bin/less\"</literal>。 这种方法能够增加在系统管理员把整个 <filename>/usr/local</filename> - 目录挪到其他位置时安装成功的机会。</para> + 目录挪到其它位置时安装成功的机会。</para> </sect1> </chapter> @@ -5883,8 +6224,8 @@ IGNORE=POINTYHAT is not supported <para>典型的小 bug 通常只影响那些启用了某些能够触发它的选项组合的用户。 开发人员最终会在发布没有那个问题的新版之后给出一个补丁来修正它, 而用户中的主体并不会立即升级, 因为他们并没有因存在问题而感到苦恼。 - 严重的 bug 可能会导致数据丢失和其他问题, 无论如何, - 谨慎的用户知道, 除了软件 bug 之外还有很多其他事故可能会导致数据丢失, + 严重的 bug 可能会导致数据丢失和其它问题, 无论如何, + 谨慎的用户知道, 除了软件 bug 之外还有很多其它事故可能会导致数据丢失, 因此他们会备份重要数据; 此外, 严重的 bug 通常会被很快发现。</para> <para>安全漏洞则完全不同。 第一, 它们可能存在数年而不被发现, @@ -5892,7 +6233,7 @@ IGNORE=POINTYHAT is not supported 恶意的一方可能会得到未获授权的访问权限, 并利用这些权限毁掉或修改敏感数据; 而更糟糕的情况则是用户可能根本注意不到损害已经发生。 第三, - 暴露出安全漏洞的系统, 往往能够帮助攻击者闯入其他之前不可能进入的系统。 + 暴露出安全漏洞的系统, 往往能够帮助攻击者闯入其它之前不可能进入的系统。 因此, 只是修正安全漏洞是不够的: 必须以清晰和全面的方式通知公众, 这样他们就能够评估风险, 并采取适当的措施。</para> </sect1> @@ -5954,7 +6295,7 @@ IGNORE=POINTYHAT is not supported <para>如果您是 committer, 则可以自行更新 VuXML 数据库。 这样, 您就能够同时帮助安全官团队, 并尽早将至关重要的信息传达给用户群体。 然而, 如果您不是 committer, - 或者您相信自己发现了一个异常严重的漏洞, 或者由于其他情况, + 或者您相信自己发现了一个异常严重的漏洞, 或者由于其它情况, 请不要由于按照 <ulink url="http://www.freebsd.org/zh_CN/security/#how">FreeBSD 安全信息</ulink> 页面上的方法联系安全官团队。</para> @@ -5966,7 +6307,7 @@ IGNORE=POINTYHAT is not supported 所以, 它的全名是 <filename><envar>PORTSDIR</envar>/security/vuxml/vuln.xml</filename>。 每当您发现 port 中的安全漏洞时, 请把新的纪录加入到那个文件中。 - 在熟悉 VuXML 之前, 您最好先看看是否有类似的您发现的问题的其他记录, + 在熟悉 VuXML 之前, 您最好先看看是否有类似的您发现的问题的其它记录, 并复制它作为模板。</para> </sect2> @@ -6072,15 +6413,15 @@ IGNORE=POINTYHAT is not supported </listitem> <listitem> - <para>包含不同后缀的其他变体, 例如 + <para>包含不同后缀的其它变体, 例如 <literal>-a4</literal> (对于和打印有关的软件包), <literal>-without-gui</literal> (提供但禁用了 X - 支持的软件包), 以及类似的其他情况;</para> + 支持的软件包), 以及类似的其它情况;</para> </listitem> <listitem> <para><literal>jp-</literal>, <literal>ru-</literal>、 - <literal>zh-</literal>, 以及其他可能的本地化变体, + <literal>zh-</literal>, 以及其它可能的本地化变体, 它们通常可以在 Ports Collection 中相应的国家分类中找到。</para> </listitem> </itemizedlist> @@ -6200,7 +6541,7 @@ IGNORE=POINTYHAT is not supported </callout> <callout arearefs="co-vx-url"> - <para>一般的 URL。 只有在没有其他更适合的参考文献时, + <para>一般的 URL。 只有在没有其它更适合的参考文献时, 才应使用它。</para> </callout> @@ -6330,7 +6671,7 @@ Reference: <http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00 <para>这里是一些在移植软件时可能会遇到的常见问题。 您应按照这个列表检查自己的 port, 同样地, 您也可以帮助检查 <ulink url="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query">PR 数据库</ulink> - 中由其他人提交的 port。 请按照在 + 中由其它人提交的 port。 请按照在 <ulink url="&url.articles.contributing;/contrib-how.html#CONTRIB-GENERAL" >问题报告和一般性注释</ulink> 中介绍的方法提交您的看法。 帮助检查 PR 数据库中的 ports 即能够帮助我们更快地 commit 它们, @@ -6381,7 +6722,7 @@ Reference: <http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00 <listitem> <para><makevar>INSTALL_MAN</makevar> 代表用于安装联机手册, - 以及其他文档的命令 (注意, 它并不会对这些文件实施压缩操作)。</para> + 以及其它文档的命令 (注意, 它并不会对这些文件实施压缩操作)。</para> </listitem> </itemizedlist> @@ -6408,7 +6749,7 @@ Reference: <http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00 <para>一定要确保您的 port 尊重 <makevar>WRKDIRPREFIX</makevar> 的设置。 绝大多数 port 并不需要担心这个。 具体说来, - 当引用其他 port 的 <makevar>WRKDIR</makevar> 时, + 当引用其它 port 的 <makevar>WRKDIR</makevar> 时, 需要注意正确的位置应该是 <filename><makevar>WRKDIRPREFIX</makevar><makevar>PORTSDIR</makevar>/<replaceable>subdir</replaceable>/<replaceable>name</replaceable>/work</filename> 而不是 <filename><makevar>PORTSDIR</makevar>/<replaceable>subdir</replaceable>/<replaceable>name</replaceable>/work</filename> 或 <filename><makevar>.CURDIR</makevar>/../../<replaceable>subdir</replaceable>/<replaceable>name</replaceable>/work</filename>, @@ -6424,7 +6765,7 @@ Reference: <http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00 <para>在不同版本的 Unix 下可能需要对代码进行一些修改或增加少许编译选项, 才能够正确地编译和运行。 如果您需要根据一些条件来对代码进行修改, 请尽可能让这些修改通用, 这样, 我们就能够将这些代码移植回更早的 FreeBSD - 系统, 并交叉移植到其他 BSD 系统, 例如来自 CSRG 的 4.4BSD, + 系统, 并交叉移植到其它 BSD 系统, 例如来自 CSRG 的 4.4BSD, BSD/386, 386BSD, NetBSD 和 OpenBSD。</para> <para>推荐的获得 4.3BSD/Reno (1990) 以及更新版本 BSD 代码版本号的方式, 是使用 @@ -6502,7 +6843,7 @@ Reference: <http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00 <programlisting>#if __FreeBSD__ >= 2 #include <osreldate.h> # if __FreeBSD_version >= 199504 - /* 2.0.5+ release specific code here */ + /* 适用于 2.0.5+ 版本的代码 */ # endif #endif</programlisting> </listitem> @@ -7693,6 +8034,14 @@ Reference: <http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00 <entry>504102</entry> </row> <row> + <entry>MFC if_bridge 之后的 5.4-STABLE</entry> + <entry>504103</entry> + </row> + <row> + <entry>bsdiff 和 portsnap MFC 之后的 5.4-STABLE</entry> + <entry>504104</entry> + </row> + <row> <entry>6.0-CURRENT</entry> <entry>600000</entry> </row> @@ -7841,10 +8190,14 @@ Reference: <http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00 </row> <row> <entry>为 dev_clone 处理出口函数中增加身份信息参数之后的 - 6.0-STABLE。</entry> + 6.0-STABLE。 6.0-RELEASE。</entry> <entry>600034</entry> </row> <row> + <entry>6.0-RELEASE 之后的 6.0-STABLE</entry> + <entry>600100</entry> + </row> + <row> <entry>7.0-CURRENT。</entry> <entry>700000</entry> </row> @@ -7862,6 +8215,21 @@ Reference: <http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00 <entry>将 memmem(3) 加入 libc 之后的 7.0-CURRENT。</entry> <entry>700003</entry> </row> + <row> + <entry>将 solisten(9) 改为接受一 backlog 参数之后的 + 7.0-CURRENT。</entry> + <entry>700004</entry> + </row> + <row> + <entry>将 IFP2ENADDR() 改为返回一 IF_LLADDR() 指针之后的 + 7.0-CURRENT。</entry> + <entry>700005</entry> + </row> + <row> + <entry>在 <literal>struct ifnet</literal> 中增加 <literal>if_addr</literal> + 成员, 并删除 IFP2ENADDR() 之后的 7.0-CURRENT。</entry> + <entry>700006</entry> + </row> </tbody> </tgroup> </table> @@ -7897,7 +8265,7 @@ Reference: <http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00 <para><filename>bsd.port.pre.mk</filename> 只定义了很少的变量, 它们可以在 <filename>Makefile</filename> 中用于进行一些测试, 而 <filename>bsd.port.post.mk</filename> - 则定义了所有其他的变量。</para> + 则定义了所有其它的变量。</para> <para>下面是一些由 <filename>bsd.port.pre.mk</filename> 定义的比较重要的变量 (这并不是一份完整的列表, @@ -8055,7 +8423,7 @@ post-install: 也就是说, <filename>share/doc/<makevar>PORTNAME</makevar></filename> 在装箱单中默认情况下会替换掉 <literal>%%DOCSDIR%%</literal>, 等等。 (更多的 <filename>pkg-plist</filename> 代换可以在 - <link linkend="porting-plist">这里</link> 找到。)</para> + <link linkend="plist-sub">这里</link> 找到。)</para> <para>所有的安装的文档文件和目录, 都应在 <filename>pkg-plist</filename> 出现, 并且使用 @@ -8065,22 +8433,21 @@ post-install: %%PORTDOCS%%%%DOCSDIR%%/CONTACT %%PORTDOCS%%@dirrm %%DOCSDIR%%</programlisting> - <para>如果不想在 <filename>pkg-plist</filename> 中一一列举文档, port - 也可以设置 <makevar>PORTDOCS</makevar> 来列出所需要的那些文件的名称, - 以及希望加入到最终的装箱单中的 shell glob 模式。 - 这些名字应该是相对于 <makevar>DOCSDIR</makevar> 路径的。 - 因此, 使用了 <makevar>PORTDOCS</makevar> - 并且使用了非默认的位置来存放文档的 port, 应该相应地设置 - <makevar>DOCSDIR</makevar>。 如果目录被列到了 <makevar>PORTDOCS</makevar> - 中, 或和这个变量的 glob 模式匹配, 则其所有子目录下的文件和目录, - 也都会注册到最终的装箱单中。 如果指定了 <makevar>NOPORTDOCS</makevar>, - 则不应设置 <makevar>PORTDOCS</makevar>。 按照上面的方式, - 将文档安装到 <makevar>PORTDOCS</makevar> 中, 仍需由 port 本身来完成。 - 使用 <makevar>PORTDOCS</makevar> 的典型例子是:</para> - - <programlisting>.if !defined(NOPORTDOCS) - PORTDOCS= * -.endif</programlisting> + <para>如果不希望在 <filename>pkg-plist</filename> 中逐个列举文档文件, port + 也可以将 <makevar>PORTDOCS</makevar> 设置为一组文件及其 shell glob + 模式, 通过这种方式来加入到最终的装箱单中。 + 这些名字应是相对于 <makevar>DOCSDIR</makevar> 的。 + 因此, 使用了 <makevar>PORTDOCS</makevar>, + 并将文档安装到非标准位置的 port, 应相应地设置 + <makevar>DOCSDIR</makevar>。 + 如果有在 <makevar>PORTDOCS</makevar> 中列出目录, + 或者这一变量中的 glob 模式匹配到了目录, 则整个子树中的文件和目录, + 都将被注册到最终的装箱单中。 如果定义了 <makevar>NOPORTDOCS</makevar>, 则 + <makevar>PORTDOCS</makevar> 中定义的文件和目录将不被安装或加入装箱单。 + 是否安装文档到前面所说的 <makevar>PORTDOCS</makevar> 仍取决于 port 本身。 + 下面是一个典型的使用 <makevar>PORTDOCS</makevar> 的例子:</para> + + <programlisting>PORTDOCS= README.* ChangeLog docs/*</programlisting> <note> <para>您也可以使用 <filename>pkg-message</filename> 这个文件, @@ -8106,7 +8473,7 @@ post-install: (由系统内部调用的可执行文件)、 <filename>sbin</filename> (为超级用户/管理员提供的可执行文件)、 <filename>info</filename> (用于 info 浏览器的文档) 或 <filename>share</filename> - (平台无关的其他文件)。 请参见 &man.hier.7; 以了解进一步的详情; 针对 + (平台无关的其它文件)。 请参见 &man.hier.7; 以了解进一步的详情; 针对 <filename>/usr</filename> 的那些规则, 同样也适用于 <filename>/usr/local</filename>。 例外情况是那些需要和 USENET <quote>news</quote> 打交道的 port, 它们可以选择采用 @@ -8114,35 +8481,6 @@ post-install: 作为文件的目的地。</para> </sect1> - <sect1 id="porting-cleaning"> - <title>清理空目录</title> - - <para>一定要让您的 port 在卸载时进行清理。 - 这通常是通过为所有由 port 创建的目录增加一行 - <literal>@dirrm</literal> 来完成的。 请注意, 在删除父目录之前, - 需要首先删除子目录。</para> - - <programlisting> : -lib/X11/oneko/pixmaps/cat.xpm -lib/X11/oneko/sounds/cat.au - : -@dirrm lib/X11/oneko/pixmaps -@dirrm lib/X11/oneko/sounds -@dirrm lib/X11/oneko</programlisting> - - <para>然而, 有时 <literal>@dirrm</literal> 会在其他 port - 共用同一个子目录时给出错误。 您可以通过使用 <literal>@unexec</literal> - 来调用 <command>rmdir</command> 来达到删除空目录, - 而不给出警告的目的。</para> - - <programlisting>@unexec rmdir %D/share/doc/gimp 2>/dev/null || true</programlisting> - - <para>这样做既不会显示出错错误信息, 也不会导致 - &man.pkg.delete.1; 异常退出, 即使由于安装了其他 port 并使用 - <filename><makevar>PREFIX</makevar>/share/doc/gimp</filename> - 而导致它非空的时候也是如此。</para> - </sect1> - <sect1 id="dads-uid-and-gids"> <title>UID 和 GID</title> @@ -8155,7 +8493,7 @@ lib/X11/oneko/sounds/cat.au 则必须在 50 到 999 之间选择一个未用的 UID。 请参见 <filename role="package">japanese/Wnn6</filename> 提供的例子。</para> - <para>一定不要使用系统或其他 port 已经使用的 UID。</para> + <para>一定不要使用系统或其它 port 已经使用的 UID。</para> <para>下面是目前预留的 50 到 999 之间的 UID。</para> @@ -8221,8 +8559,15 @@ polipo:*:173:173:polipo web cache:/nonexistent:/sbin/nologin bogomilter:*:174:174:milter-bogom:/nonexistent:/sbin/nologin moinmoin:*:192:192:MoinMoin User:/nonexistent:/sbin/nologin sympa:*:200:200:Sympa Owner:/nonexistent:/sbin/nologin +privoxy:*:201:201:Privoxy proxy user:/nonexistent:/sbin/nologin dspam:*:202:202:Dspam:/nonexistent:/sbin/nologin +shoutcast:*:210:210:Shoutcast sandbox:/nonexistent:/bin/sh _tor:*:256:256:Tor anonymising router:/var/db/tor:/bin/sh +smxs:*:260:260:Sendmail X SMTPS:/nonexistent:/sbin/nologin +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 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 @@ -8230,6 +8575,7 @@ _bbstored:*:505:505::0:0:BoxBackup Store Daemon:/nonexistent:/bin/sh qtss:*:554:554:Darwin Streaming Server:/nonexistent:/sbin/nologin ircdru:*:555:555:Russian hybrid IRC server:/nonexistent:/bin/sh messagebus:*:556:556:D-BUS Daemon User:/nonexistent:/sbin/nologin +avahi:*:558:558:Avahi Daemon User:/nonexistent:/sbin/nologin bnetd:*:700:700:Bnetd user:/nonexistent:/sbin/nologin bopm:*:717:717:Blitzed Open Proxy Monitor:/nonexistent:/bin/sh bacula:*:910:910:Bacula Daemon:/var/db/bacula:/sbin/nologin</programlisting> @@ -8291,6 +8637,11 @@ moinmoin:*:192: sympa:*:200: dspam:*:202: _tor:*:256: +smxs:*:260: +smxq:*:261: +smxc:*:262: +smxm:*:263: +smx:*:264: ldap:*:389: drweb:*:426: courier:*:465: @@ -8299,6 +8650,7 @@ qtss:*:554: ircdru:*:555: messagebus:*:556: realtime:*:557: +avahi:*:558: bnetd:*:700: bopm:*:717: bacula:*:910:</programlisting> @@ -8335,7 +8687,7 @@ bacula:*:910:</programlisting> <para>port 应遵循 <makevar>CC</makevar> 和 <makevar>CXX</makevar> 变量的设置。 这也就是说, port 不应使用绝对的方式来设置这个变量的值, - 而罔顾已经存在的设置; 与此相反, 它应该在其值后加入需要的其他值。 + 而罔顾已经存在的设置; 与此相反, 它应该在其值后加入需要的其它值。 这样, 就可以设置全局的构建选项, 令其影响所有的 port 构建过程了。</para> <para>如果实在无法这样做, 请在 <filename>Makefile</filename> @@ -8370,7 +8722,7 @@ bacula:*:910:</programlisting> <para>您的 port 应遵循 <makevar>CFLAGS</makevar> 变量的设置。 这也就是说, port 不应使用绝对的方式来设置这个变量的值, - 而罔顾已经存在的设置; 与此相反, 它应该在其值后加入需要的其他值, + 而罔顾已经存在的设置; 与此相反, 它应该在其值后加入需要的其它值, 这样, 就可以设置全局的构建选项, 令其影响所有的 port 构建过程了。</para> <para>如果实在无法这样做, 请在 <filename>Makefile</filename> @@ -8410,23 +8762,6 @@ bacula:*:910:</programlisting> </sect1> - <sect1 id="dads-config"> - <title>配置文件</title> - - <para>如果您的 port 需要在 - <filename><makevar>PREFIX</makevar>/etc</filename> 中保存配置文件, - <emphasis>不要</emphasis> 简单地安装它们并将其列入 - <filename>pkg-plist</filename>。 这将导致 - &man.pkg.delete.1; 删除用户精心编写的配置文件, - 而且新的安装也会把这些文件清除掉。</para> - - <para>因此, 您应把配置文件的例子按其他的后缀来安装 - (例如 <filename><replaceable>filename</replaceable>.sample</filename> - 就是一个不错的选择) 并显示一条 <link - linkend="porting-message">消息</link> - 告诉用户如何复制并编辑这个配置文件, 以便让软件能够正确工作。</para> - </sect1> - <sect1 id="dads-freedback"> <title>反馈</title> @@ -8506,13 +8841,13 @@ bacula:*:910:</programlisting> 以便减少包含漏洞的 FreeBSD 主机的数量 (我们希望保持良好的安全记录), 然而, 有时在安全漏洞的披露和软件更新之间可能会有一个间隔, - 此时应予以说明。 除了安全之外, 请不要以任何其他理由将 port 标记为 + 此时应予以说明。 除了安全之外, 请不要以任何其它理由将 port 标记为 <makevar>FORBIDDEN</makevar>。</para> </listitem> <listitem> <para><makevar>IGNORE</makevar> 用来表示 port - 由于某些其他原因不应予以构建。 如果认为发生了结构性的问题, + 由于某些其它原因不应予以构建。 如果认为发生了结构性的问题, 则应使用它。 任何情况下, 构建集群都不会构建标记为 <makevar>IGNORE</makevar> 的 port。 以下是使用 @@ -8571,7 +8906,7 @@ bacula:*:910:</programlisting> <sect2 id="dads-noinstall-notes"> <title>实现说明</title> - <para>由于 <filename>bsd.port.mk</filename> 和其他一些地方 + <para>由于 <filename>bsd.port.mk</filename> 和其它一些地方 <makevar>IGNORECMD</makevar> 的一些特殊用法, <makevar>BROKEN</makevar> 的值应该用引号括起来, 而 <makevar>IGNORE</makevar> 则不能用引号括起来。</para> @@ -8617,6 +8952,39 @@ bacula:*:910:</programlisting> 能够有一点时间来修正问题。</para> </sect1> + <sect1 id="dads-dot-error"> + <title>避免使用 <literal>.error</literal> 结构</title> + + <para>在 <filename>Makefile</filename> 中给出信号, + 表示由于某种外界因素 (例如, 用户指定了无效的构建选项) + 而无法安装的方法是将变量 + <makevar>IGNORE</makevar> 设为一非空值。 这个值将被格式化, + 并在用户执行 <command>make install</command> 是给出提示。</para> + + <para>用 <literal>.error</literal> 实现这一目的是一种常见的误用。 + 这样做的问题是, 许多在 ports 树上运行的自动化工具会因此而失败。 + 最常见的情况见于构建 <filename>/usr/ports/INDEX</filename> 的过程 + (参见 <xref linkend="make-describe">)。 然而, 即使十分普通的命令, + 例如 <command>make -V maintainer</command>, + 在这种情况下也会失败。 这是不可接受的。</para> + + <example id="dot-error-breaks-index"> + <title>怎样避免使用 <literal>.error</literal></title> + <para>考虑有人在 <filename>make.conf</filename> 中设置了 + <programlisting>USE_POINTYHAT=yes</programlisting> + 的情形。 接下来的例子中, 第一个 <filename>Makefile</filename> + 中的问题将导致 <command>make index</command> 失败, + 而第二个则不会:</para> + <programlisting>.if USE_POINTYHAT +.error "POINTYHAT is not supported" +.endif</programlisting> + <programlisting>.if USE_POINTYHAT +IGNORE=POINTYHAT is not supported +.endif</programlisting> + </example> + + </sect1> + <sect1 id="dads-workarounds"> <title>一些必要的 workaround</title> @@ -8652,18 +9020,6 @@ bacula:*:910:</programlisting> 不要让我们发布没有得到合法授权的软件!</para> </sect1> - <sect1 id="dads-stuck"> - <title>如果遇到了问题…</title> - - <para>看一看现有的范例, 以及 - <filename>bsd.port.mk</filename> 文件, - 然后再考虑提问! - <!-- smiley --><emphasis>;-)</emphasis></para> - - <para>如果遇到了麻烦一定要提问! - 不要只是拿自己的头去撞墙! <!-- smiley - --><emphasis>:-)</emphasis></para> - </sect1> </chapter> <chapter id="porting-samplem"> @@ -8712,14 +9068,13 @@ EXTRACT_SUFX= .tar.Z PATCH_SITES= ftp://ftp.sra.co.jp/pub/X11/japanese/ PATCHFILES= xdvi-18.patch1.gz xdvi-18.patch2.gz -[维护者(maintainer); *必须有*! 这是某个用户在发现问题或报告 bug - 时可以联络的人 (最好有 commit 权限) - 这个人应该是 port, - 或某个可以把问题转发给最初 port 的那个人的人。 - 如果您真的不想在这里写自己的地址, 可以设置为 "ports@FreeBSD.org"。] +[监护人(maintainer); *必须有*! 这是某个资源处理 port 更新、 构建失败, + 以及回答用户直接提问或汇报 bug 的人。 为了保证 Ports Collection + 有尽可能高的品质, 我们不再接受指定给 "ports@FreeBSD.org" 的新 port。] MAINTAINER= asami@FreeBSD.org COMMENT= A DVI Previewer for the X Window System -[依赖的其他软件包 -- 可以为空] +[依赖的其它软件包 -- 可以为空] RUN_DEPENDS= gs:${PORTSDIR}/print/ghostscript LIB_DEPENDS= Xpm.5:${PORTSDIR}/graphics/xpm @@ -8755,72 +9110,6 @@ pre-install: .include <bsd.port.mk></programlisting> </chapter> - <chapter id="porting-autoplist"> - <title>装箱单 (package list) 的自动化制作</title> - - <para>首先, 请确认已经基本上完成了 port 的工作, 仅缺 - <filename>pkg-plist</filename>。</para> - - <para>接下来, 建立一个临时的目录, 以便于安装您的 port, - 首先在其中安装所有依赖的 port。 对于非 X 的 port, - <replaceable>port-type</replaceable> 应该是 <literal>local</literal>, - 而如果是一个 XFree86 4 或更早的 XFree 86 版本的 port, - 则应相应选择 <literal>x11-4</literal> 或 <literal>x11</literal>。</para> - - <screen>&prompt.root; <userinput>mkdir /var/tmp/<replaceable>port-name</replaceable></userinput> -&prompt.root; <userinput>mtree -U -f /etc/mtree/BSD.<replaceable>port-type</replaceable>.dist -d -e -p /var/tmp/<replaceable>port-name</replaceable></userinput> -&prompt.root; <userinput>make depends PREFIX=/var/tmp/<replaceable>port-name</replaceable></userinput></screen> - - <para>将目录结构保存到一个新文件中。</para> - - <screen>&prompt.root; <userinput>(cd /var/tmp/<replaceable>port-name</replaceable> && find -d * -type d) | sort > OLD-DIRS</userinput></screen> - - <para>建立一个空的 <filename>pkg-plist</filename> 文件:</para> - - <screen>&prompt.root; <userinput>touch pkg-plist</userinput></screen> - - <para>如果您的 port 依据 <makevar>PREFIX</makevar> 安装 (本应如此) - 则可以安装它并创建 package list。</para> - - <screen>&prompt.root; <userinput>make install PREFIX=/var/tmp/<replaceable>port-name</replaceable></userinput> -&prompt.root; <userinput>(cd /var/tmp/<replaceable>port-name</replaceable> && find -d * \! -type d) | sort > pkg-plist</userinput></screen> - - <para>您也可以把新增的目录加入到 packing list 中。</para> - - <screen>&prompt.root; <userinput>(cd /var/tmp/<replaceable>port-name</replaceable> && find -d * -type d) | sort | comm -13 OLD-DIRS - | sort -r | sed -e 's#^#@dirrm #' >> pkg-plist</userinput></screen> - - <para>最后, 需要手工整理 packing list; 这一过程不是 - <emphasis>完全</emphasis> 自动的。 联机手册应列入 port - 的 <filename>Makefile</filename> 的 - <makevar>MAN<replaceable>n</replaceable></makevar>, 而不是 - package list。 用户配置文件应被删除, 或以 - <filename><replaceable>filename</replaceable>.sample</filename> - 的名字来安装。 <filename>info/dir</filename> 文件, - 也不应列入, 同时应按照 <link linkend="porting-info">info - 文件</link> 的说明来增加一些 <filename>install-info</filename> 行。 - 所有由 port 安装的库, 应按照 - <link linkend="porting-shlibs">动态连接库</link> - 小节中介绍的方法处理。</para> - - <para>另外, 也可以使用 - <filename>/usr/ports/Tools/scripts/</filename> 中的 - <command>plist</command> 脚本来自动创建 - package list。 第一步和上面一样, 也就是 - <command>mkdir</command>, <command>mtree</command> 并 - <command>make depends</command>。 然后构建和安装 - port:</para> - - <screen>&prompt.root; <userinput>make install PREFIX=/var/tmp/<replaceable>port-name</replaceable></userinput></screen> - - <para>之后就可以用 <command>plist</command> 来建立 - <filename>pkg-plist</filename> 文件了:</para> - - <screen>&prompt.root; <userinput>/usr/ports/Tools/scripts/plist -Md -m /etc/mtree/BSD.<replaceable>port-type</replaceable>.dist /var/tmp/<replaceable>port-name</replaceable> > pkg-plist</userinput></screen> - - <para>同样地, 如此创建的 packing list 也需要手工地整理一下。</para> - - </chapter> - <chapter id="keeping-up"> <title>保持同步</title> @@ -8833,7 +9122,7 @@ pre-install: <para>最简单的了解已经被 commit 到 ports 中的更新的方法, 是订阅 <ulink url="http://www.FreshPorts.org/">FreshPorts</ulink>。 您可以选择多个 ports 并对其进行监视。 强烈建议维护人员订阅它, - 这样就不仅能接收到他们自己所做的修改, 而且能看到其他 &os; + 这样就不仅能接收到他们自己所做的修改, 而且能看到其它 &os; committer 所做的改动。 (保持与所依赖的 ports 框架同步是必要的—虽然一般来说您会在这样的 commit 之前收到一个礼貌性的通知, 但有时可能会有人没有注意到需要这样做, @@ -8923,7 +9212,7 @@ pre-install: 它利用到了和 ports 有关的问题报告 (PR)、 来自构建集群的错误日志, 以及来自 Ports Collection 的文件所提供的信息。 未来, 还会对它进行进一步的扩展, 从而提供包括 distfile 普查, - 以及其他来源在内的更多信息。</para> + 以及其它来源在内的更多信息。</para> <para>要使用这个工具, 可以从查看关于某一个 port 的全部资料的 <ulink url="http://portsmon.FreeBSD.org/portoverview.py"> |