books/porters-handbook/book.sgml    1.825 -> 1.872

Obtained from:          The FreeBSD Simplified Chinese Project
Merging work done by:   delphij
Approved by:            delphij (mentor)
This commit is contained in:
Fukang Chen 2007-10-02 02:56:37 +00:00
parent ce34fb853d
commit 1ff8df67b6
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=30850

View file

@ -2,7 +2,7 @@
The FreeBSD Documentation Project
The FreeBSD Simplified Chinese Project
Original Revision: 1.825
Original Revision: 1.872
$FreeBSD$
-->
@ -335,6 +335,12 @@ PLIST_DIRS= lib/X11/oneko</programlisting>
第三步以后, 检查是否所有新建的目录都被正确删除了。
在第四步以后, 试着运行一下所装的软件,
确保当它以 package 方式安装的时候也能正常工作。</para>
<para>自动化这些步骤最简单的方法是通过 <application>ports tinderbox</application>
来进行测试。 它可以维护 <literal>jails</literal> 并在其中完成全部测试工作,
而不会破坏正在运行的系统的状态。 请参见
<filename>ports/ports-mgmt/tinderbox</filename>
以了解更多的信息。</para>
</sect1>
<sect1 id="porting-portlint">
@ -1013,6 +1019,25 @@ PORTEPOCH= 1</programlisting>
<makevar>PORTNAME</makevar> 中。</para>
</sect2>
<sect2>
<title><makevar>LATEST_LINK</makevar></title>
<para>有时, 在 ports 套件中可能会存在同一程序的多个版本。
索引和预编译包的联编系统都需要能够将它们视为不同的软件包, 尽管其
<makevar>PORTNAME</makevar>、 <makevar>PKGNAMEPREFIX</makevar> 以及
even <makevar>PKGNAMESUFFIX</makevar> 可能是一模一样的。 遇到这种情况时,
就需要将除了 <quote>主</quote> port 之外的其他 port
中的 <makevar>LATEST_LINK</makevar> 变量设为不同的值
&mdash; 请参见 <filename>editors/vim5</filename> 和
<filename>editors/vim</filename> port 以及
<filename>www/apache*</filename> 系列, 以了解它的用法。
需要注意的是, 如何确定 <quote>主</quote> 版本 &mdash;
<quote>最流行</quote>、 <quote>受支持最好</quote>
<quote>变动最少</quote> 等等 &mdash; 已经超过了本书能够给出的建议范围;
这里只是向您介绍在选定了一个
<quote>主</quote> port 之后如何指定其他 port 的版本。</para>
</sect2>
<sect2 id="porting-pkgname">
<title>包命名规则</title>
@ -1051,16 +1076,28 @@ PORTEPOCH= 1</programlisting>
<listitem>
<para><filename>name</filename> 部分的首字母应该
小写。 (余下的部分包含大写字母, 所以当您
小写。 (余下的部分可以包含大写字母, 所以当您
要转换一个包含大写字母软件的名字时, 您需要
自己做出判断。) 对于<literal>perl 5</literal>
自己做出判断。) 对于 <literal>Perl 5</literal>
模块的命名, 有个传统的规则是, 在前面
加上 <literal>p5-</literal>
并把两个冒号的部分改为连字号, 如:
<literal>Data::Dumper</literal> 模块变成
<literal>p5-Data-Dumper</literal>。
如果软件的名字里还有数字、 连字号、 下划线,
您也可以把这些包括进来 (例如 <literal>kinput2</literal>)。</para>
<literal>Data::Dumper</literal> 模块对应的名字, 就应该是
<literal>p5-Data-Dumper</literal>。</para>
</listitem>
<listitem>
<para>确认 port 的名字和版本之间有清晰的分隔, 并放入 <makevar>PORTNAME</makevar> 和
<makevar>PORTVERSION</makevar> 变量。 在
<makevar>PORTNAME</makevar> 中包含版本部分的唯一理由是上游软件包真的采用这样的命名方式,
类似 <filename>textproc/libxml2</filename> 或
<filename>japanese/kinput2-freewnn</filename> port 这样。 否则,
在 <makevar>PORTNAME</makevar> 中就不应包含任何版本信息。
许多 port 采用同样的 <makevar>PORTNAME</makevar> 名字是很正常的,
<filename>www/apache*</filename> port 便是如此; 在这种情况下,
不同的版本 (以及不同的索引项) 是由 <makevar>PKGNAMEPREFIX</makevar>、
<makevar>PKGNAMESUFFIX</makevar> 以及
<makevar>LATEST_LINK</makevar> 的值的不同而有所区别的。</para>
</listitem>
<listitem>
@ -1538,6 +1575,12 @@ PORTEPOCH= 1</programlisting>
<entry></entry>
</row>
<row>
<entry><filename>kld*</filename></entry>
<entry>可加载内核模块。</entry>
<entry></entry>
</row>
<row>
<entry><filename>korean</filename></entry>
<entry>韩语语言支持。</entry>
@ -1860,6 +1903,12 @@ PORTEPOCH= 1</programlisting>
<entry></entry>
</row>
<row>
<entry><filename>x11-drivers</filename></entry>
<entry>X11 驱动程序。</entry>
<entry></entry>
</row>
<row>
<entry><filename>x11-fm</filename></entry>
<entry>X11 下的文件管理器。</entry>
@ -1965,6 +2014,12 @@ PORTEPOCH= 1</programlisting>
</para>
</listitem>
<listitem>
<para>需要安装可加载内核模块的 port 应在其 <makevar>CATEGORIES</makevar>
中归入虚拟分类 <filename>kld</filename>。
</para>
</listitem>
<listitem>
<para><filename>misc</filename>
分类的 port 不能有其它非虚拟的分类。
@ -3495,10 +3550,21 @@ ${MANPREFIX}/man/de/man3/baz.3.gz</programlisting>
<sect1 id="makefile-info">
<title>Info 文件</title>
<para>如果软件包需要安装 GNU 文件,
则需要在 <makevar>INFO</makevar> 变量中列出 (不需要指定
<literal>.info</literal> 后缀) 这样安装/卸载代码就会自动地在注册包时将它们加入到
<filename>pkg-plist</filename> 了。</para>
<para>如果软件包需要安装 GNU info 文件,
则需要在 <makevar>INFO</makevar> 变量中一一列出 (不需要指定
<literal>.info</literal> 后缀)。 系统假定这些文件均会安装到
<filename><makevar>PREFIX</makevar>/<makevar>INFO_PATH</makevar></filename> 目录中。
如果软件包有需要, 也可以通过修改 <makevar>INFO_PATH</makevar> 来指定不同的位置。
不过, 并不推荐这样做。 所有列出的项目均是相对于
<filename><makevar>PREFIX</makevar>/<makevar>INFO_PATH</makevar></filename> 的文件路径。
例如, <filename role="package">lang/gcc33</filename> 表示将
info 文件安装到
<filename><makevar>PREFIX</makevar>/<makevar>INFO_PATH</makevar>/gcc33</filename>
因此 <makevar>INFO</makevar> 应写成类似这样:
<programlisting>INFO= gcc33/cpp gcc33/cppinternals gcc33/g77 ...
</programlisting>
这样安装/卸载代码就会自动地在注册包之前将它们加入到临时的
<filename>pkg-plist</filename> 中了。</para>
</sect1>
<sect1 id="makefile-options">
@ -3512,7 +3578,7 @@ ${MANPREFIX}/man/de/man3/baz.3.gz</programlisting>
支持这些特性可以让用户体验更好, 并达到事半功倍的效果。</para>
<sect2>
<title>开关 (<makevar>KNOBS</makevar>)</title>
<title>开关 (Knobs)</title>
<sect3>
<title><makevar>WITH_<replaceable>*</replaceable></makevar> 和
@ -3680,6 +3746,7 @@ ${MANPREFIX}/man/de/man3/baz.3.gz</programlisting>
而 <makevar>WITH_*</makevar> 和 <makevar>WITHOUT_*</makevar>
只有在引用了
<filename>bsd.port.pre.mk</filename> 之后才能开始检测。</para>
</sect3>
<sect3>
<title>例子</title>
@ -3702,6 +3769,7 @@ RUN_DEPENDS+= bar:${PORTSDIR}/bar/bar
.include &lt;bsd.port.post.mk&gt;</programlisting></para>
</example>
</sect3>
</sect2>
@ -3938,21 +4006,38 @@ PORTVERSION= 1.0</programlisting>
<filename><makevar>PREFIX</makevar>/share/<makevar>PORTNAME</makevar></filename>。</para>
</listitem>
<listitem>
<para><makevar>DATADIR_REL</makevar> 会展开成
<filename>share/<makevar>PORTNAME</makevar></filename>。</para>
</listitem>
<listitem>
<para><makevar>DOCSDIR</makevar> 会展开成
<filename><makevar>PREFIX</makevar>/share/doc/<makevar>PORTNAME</makevar></filename>。</para>
</listitem>
<listitem>
<para><makevar>DOCSDIR_REL</makevar> 会展开成
<filename>share/doc/<makevar>PORTNAME</makevar></filename>。</para>
</listitem>
<listitem>
<para><makevar>EXAMPLESDIR</makevar> 会展开成
<filename><makevar>PREFIX</makevar>/share/examples/<makevar>PORTNAME</makevar></filename>。</para>
</listitem>
<listitem>
<para><makevar>EXAMPLESDIR_REL</makevar> 会展开成
<filename>share/examples/<makevar>PORTNAME</makevar></filename>。</para>
</listitem>
</itemizedlist>
<note>
<para><makevar>NOPORTDOCS</makevar> 只控制将要装到 <makevar>DOCSDIR</makevar>
的那些文档, 而不应影响标准的联机手册、 info 手册, 以及应装到
<makevar>DATADIR</makevar>、 <makevar>EXAMPLESDIR</makevar> 的文件。</para>
<para><makevar>NOPORTDOCS</makevar> 只控制将要安装到 <makevar>DOCSDIR</makevar>
的那些文档, 而不应影响标准的联机手册以及 info 手册的安装。 安装到
<makevar>DATADIR</makevar> 和 <makevar>EXAMPLESDIR</makevar>
的文件则相应地受 <makevar>NOPORTDATA</makevar> 和
<makevar>NOPORTEXAMPLES</makevar> 控制。</para>
</note>
<para>这些变量也会被导出到 <makevar>PLIST_SUB</makevar> 中。
@ -3963,7 +4048,7 @@ PORTVERSION= 1.0</programlisting>
(更多的 <filename>pkg-plist</filename> 代换可以在
<link linkend="plist-sub">这里</link> 找到。)</para>
<para>所有安装的文档文件和目录,
<para>所有非无条件安装的文档文件和目录,
都应在 <filename>pkg-plist</filename> 出现, 并且使用
<literal>%%PORTDOCS%%</literal> 前缀, 例如:</para>
@ -3988,6 +4073,11 @@ PORTVERSION= 1.0</programlisting>
<programlisting>PORTDOCS= README.* ChangeLog docs/*</programlisting>
<note>
<para>与 <makevar>PORTDOCS</makevar> 类似,
对应于 <makevar>DATADIR</makevar> 和
<makevar>EXAMPLESDIR</makevar> 的变量分别是 <makevar>PORTDATA</makevar>
和 <makevar>PORTEXAMPLES</makevar>。</para>
<para>您也可以使用 <filename>pkg-message</filename> 这个文件,
来在安装时显示一些信息。 参见 <link
linkend="porting-message">关于使用
@ -4253,6 +4343,8 @@ PORTVERSION= 1.0</programlisting>
<literal>GNU_CONFIGURE=yes</literal>。
如果希望传额外的参数给 <command>configure</command> 脚本
(默认参数为 <literal>--prefix=&dollar;{PREFIX}
--infodir=&dollar;{PREFIX}/&dollar;{INFO_PATH}
--mandir=&dollar;{MANPREFIX}/man
&dollar;{CONFIGURE_TARGET}</literal>)
应通过 <makevar>CONFIGURE_ARGS</makevar> 来指定这些参数。
类似地, 可以通过
@ -4410,12 +4502,10 @@ PORTVERSION= 1.0</programlisting>
<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>
<para>最后, 可以使用一个特殊的名为
<literal>autotools</literal> 的工具,
它会安装全部可用的 autotools 版本,
以适应跨平台开发的需要。 您可以通过安装 <literal>devel/autotools</literal> port 来达到这一目的。</para>
</sect2>
@ -4442,39 +4532,6 @@ PORTVERSION= 1.0</programlisting>
<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=15</literal></entry>
<entry><literal>libtool:15</literal></entry>
</row>
<row>
<entry><literal>USE_INC_LIBTOOL_VER=15</literal></entry>
<entry>已不再使用</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 不需要这样做。
@ -4498,27 +4555,6 @@ PORTVERSION= 1.0</programlisting>
协助开发人员消除在 <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">
@ -4546,40 +4582,6 @@ PORTVERSION= 1.0</programlisting>
则表示只设置用于后续工作的环境。 如果不指定,
则会对 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 的
@ -4625,42 +4627,8 @@ PORTVERSION= 1.0</programlisting>
<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>、
<para>对于
<command>autoconf</command> 和 <command>autoheader</command> 而言,
<command>automake</command> 和 <command>aclocal</command>
提供了对应的可选参数变量 <makevar>AUTOMAKE_ARGS</makevar> 和
<makevar>ACLOCAL_ARGS</makevar> 如果需要的话,
@ -4779,6 +4747,15 @@ PLIST_SUB+= NLS="@comment "
<para>以上规则有一个例外, 即对应目录不存在或源码包不在那个目录中时, 允许使用作者的 id 作为
<makevar>MASTER_SITE_SUBDIR</makevar>。</para>
<para>所有这些选项均同时接受 <literal>YES</literal>
和版本串, 类似 <literal>5.8.0+</literal> 这样的写法。 使用
<literal>YES</literal> 表示 port 能够配合所有受支持的 <application>Perl</application> 版本来使用。
如果 port 只能配合特定版本的 <application>Perl</application> 来使用,
则可以用版本串来表示, 例如最低版本
(如 <literal>5.7.3+</literal>)、 最高版本 (如
<literal>5.8.0-</literal>) 或某个具体的版本 (如
<literal>5.8.3</literal>)。</para>
<table frame="none">
<title>用于用到 <literal>perl</literal> 的 port 的变量</title>
@ -4903,37 +4880,68 @@ PLIST_SUB+= NLS="@comment "
<title>使用 X11</title>
<sect2 id="x11-variables">
<title>变量定义</title>
<title>X.Org 组件</title>
<para>在 Ports 套件中提供的 X11 实现是 X.Org。
如果您的应用程序用到了 X 组件, 则应将
<makevar>USE_XORG</makevar> 设为所需要的那些组件。
目前可用的组件包括:</para>
<para><literal>bigreqsproto compositeproto damageproto dmx dmxproto
evieproto fixesproto fontcacheproto fontenc fontsproto fontutil
glproto ice inputproto kbproto libfs oldx printproto randrproto
recordproto renderproto resourceproto scrnsaverproto sm trapproto
videoproto x11 xau xaw xaw6 xaw7 xaw8 xbitmaps xcmiscproto xcomposite
xcursor xdamage xdmcp xevie xext xextproto xf86bigfontproto
xf86dgaproto xf86driproto xf86miscproto xf86rushproto
xf86vidmodeproto xfixes xfont xfontcache xft xi xinerama
xineramaproto xkbfile xkbui xmu xmuu xorg-server xp xpm xprintapputil
xprintutil xpr oto xproxymngproto xrandr xrender xres xscrnsaver xt
xtrans xtrap xtst xv xvmc xxf86dga xxf86misc xxf86vm</literal>.</para>
<para>最新的列表, 可以在
<filename>/usr/ports/Mk/bsd.xorg.mk</filename> 中找到。</para>
<para>The Mesa Project 是一个致力于自由的 OpenGL
实现的计划。 您可以使用 <makevar>USE_GL</makevar> 变量来让 port 依赖其不同的组件。
可用的选项包括: <literal>glut, glu, glw, gl</literal> 和
<literal>linux</literal>。 为了实现向前兼容,
当使用 <literal>yes</literal> 时系统会自动将其映射为 <literal>glu</literal>。</para>
<example id="use-xorg-example">
<title>使用 USE_XORG 的例子</title>
<programlisting>USE_XORG= xrender xft xkbfile xt xaw
USE_GL= glu</programlisting>
</example>
<para>许多 ports 会定义 <makevar>USE_XLIB</makevar>
这会导致 port 依赖 50 多个动态连接库。 由于它出现于 X.org
模块化之前, 因此这个变量仅为向前兼容的原因提供,
新的 port 不应再使用它。</para>
<table frame="none">
<title>用到 X 的 port 可以使用的变量</title>
<tgroup cols="2">
<tbody>
<row>
<entry><makevar>USE_X_PREFIX</makevar></entry>
<entry>此 port 将文件安装到 <makevar>X11BASE_REL</makevar> 而非通常的
<makevar>PREFIX</makevar>。</entry>
</row>
<row>
<entry><makevar>USE_XLIB</makevar></entry>
<entry>此 port 用到了 X 库。</entry>
</row>
<row>
<entry><makevar>USE_MOTIF</makevar></entry>
<entry>此 port 使用 Motif 工具包。</entry>
<entry>此 port 用到了 X 库。 已过时 - 您应使用 <makevar>USE_XORG</makevar> 变量列出用到的
X.Org 组件, 而不是使用这个变量。</entry>
</row>
<row>
<entry><makevar>USE_IMAKE</makevar></entry>
<entry>此 port 用到了 <command>imake</command>。 这一变量也会自动设置
<makevar>USE_X_PREFIX</makevar>。</entry>
<entry>此 port 用到了 <command>imake</command>。</entry>
</row>
<row>
<entry><makevar>USE_X_PREFIX</makevar></entry>
<entry>已过时。 目前其作用与
<makevar>USE_XLIB</makevar> 相同, 并可以直接用后者替换。</entry>
</row>
<row>
@ -5121,10 +5129,7 @@ USE_XLIB= yes</programlisting>
通过下面的官方 hack 预编译包构建集群将启动采用虚拟帧缓存的
X server。 这样, 编译过程将有可用的 <envar>DISPLAY</envar>。</para>
<programlisting>.if defined(PACKAGE_BUILDING)
BUILD_DEPENDS+= Xvfb:${X_VFBSERVER_PORT} \
${X11BASE}/lib/X11/fonts/misc/8x13O.pcf.gz:${X_FONTS_MISC_PORT}
.endif</programlisting>
<programlisting>USE_DISPLAY= yes</programlisting>
</sect2>
@ -5328,11 +5333,17 @@ MAKE_ENV+= QMAKESPEC="${QMAKESPEC}"</programlisting>
<sect2 id="qt4-components">
<title>组件的选择 (仅限 Qt 4.x)</title>
<para>当 <makevar>USE_QT_VER</makevar> 设为 4 时, 可以通过
<makevar>QT_COMPONENTS</makevar> 变量来指定
Qt4 工具和函数库。 下表中列出了最重要的一些组件 (全部组件可以在
<filename>/usr/ports/Mk/bsd.kde.mk</filename> 中的
<makevar>_QT_COMPONENTS_ALL</makevar> 变量中找到)</para>
<para>当把 <makevar>USE_QT_VER</makevar> 设为 4 时, 就可以通过
<makevar>QT_COMPONENTS</makevar> 变量来指定对
Qt4 工具和函数库的依赖了。 通过在组件的名称后面添加 <literal>_build</literal> 或 <literal>_run</literal>
这样的后缀, 则可相应地将这依赖关系限于联编或运行时刻。
在没有指定后缀时, 系统默认在联编和运行时刻均依赖该组件。
通常情况下在指明函数库一类的组件时应不使用后缀,
联编工具类组件应使用 <literal>_build</literal> 后缀,
而插件类组件, 则应使用 <literal>_run</literal> 后缀。
下表中列出了一些最常用的组件 (全部可用的组件, 则在
<filename>/usr/ports/Mk/bsd.qt.mk</filename>
中的 <makevar>_QT_COMPONENTS_ALL</makevar> 列出)</para>
<table frame="none">
<title>可用的 Qt4 函数库组件</title>
@ -5376,6 +5387,11 @@ MAKE_ENV+= QMAKESPEC="${QMAKESPEC}"</programlisting>
<entry>单元测试函数库</entry>
</row>
<row>
<entry><literal>script</literal></entry>
<entry>脚本函数库</entry>
</row>
<row>
<entry><literal>sql</literal></entry>
<entry>SQL 函数库</entry>
@ -5407,24 +5423,26 @@ MAKE_ENV+= QMAKESPEC="${QMAKESPEC}"</programlisting>
<tbody>
<row>
<entry><literal>moc</literal></entry>
<entry>元对象编译器 (几乎所有的 Qt 应用程序都需要这个)</entry>
<entry>元对象编译器 (几乎所有的 Qt 应用程序在联编过程中都需要它)</entry>
</row>
<row>
<entry><literal>qmake</literal></entry>
<entry>用于 Qt 工程的联编工具</entry>
<entry>Makefile 生成器 / 联编工具</entry>
</row>
<row>
<entry><literal>rcc</literal></entry>
<entry>资源编译器 (如果应用程序中包含
<filename>*.rc</filename> 或 <filename>*.qrc</filename>
文件)</entry>
文件 就需要它)</entry>
</row>
<row>
<entry><literal>uic</literal></entry>
<entry>用户界面编译器 (如果应用程序用到了 GUI)</entry>
<entry>用户界面编译器 (如果应用程序中包含使用 Qt Designer
创建的 <filename>*.ui</filename> 文件时就需要它
- 一般说来 Qt 应用程序都会使用 GUI 的)</entry>
</row>
</tbody>
@ -5461,12 +5479,17 @@ MAKE_ENV+= QMAKESPEC="${QMAKESPEC}"</programlisting>
<example id="qt4-components-example">
<title>选择 Qt4 组件</title>
<para>下面是 port
<filename role="package">editors/texmaker</filename> 中的一个片段,
它用到了 Qt4 图形用户界面函数库 (这时会默认使用核心函数库) 及联编工具:</para>
<para>在这个例子中, 我们将要移植的应用程序用到了
Qt4 图形用户界面函数库、 Qt4 核心 (core) 函数库、
所有 Qt4 代码生成工具以及 Qt4 的
Makefile 生成器。 由于 gui 函数库会自动附带对核心函数库的依赖,
因此并不需要明确指出需要 corelib 的依赖关系。 Qt4 代码生成工具 moc、
uic 和 rcc 以及 Makefile 生成器
qmake 只在联编过程中才会用到,
因此可以指定 <literal>_build</literal> 后缀:</para>
<programlisting>USE_QT_VER= 4
QT_COMPONENTS= gui moc qmake rcc uic</programlisting>
QT_COMPONENTS= gui moc_build qmake_build rcc_build uic_build</programlisting>
</example>
</sect2>
@ -5515,21 +5538,6 @@ do-configure:
</listitem>
</itemizedlist>
<note>
<para>目前, <filename>bsd.kde.mk</filename> 还不支持 pre/postmk
也就是说, 在使用了 <filename>bsd.port.pre.mk</filename> 之后, 就不能再指定
<makevar>USE_QT_VER</makevar> 和 <makevar>QT_COMPONENTS</makevar>
了。 如果您的 port 需要这样做, 请以传统方式编写依赖关系, 例如:</para>
<programlisting>.include &lt;bsd.port.pre.mk&gt;
.if defined(WITH_QT)
BUILD_DEPENDS+= moc4:${PORTSDIR}/devel/qt4-moc
LIB_DEPENDS+= QtCore:${PORTSDIR}/devel/qt4-corelib
.endif
.include &lt;bsd.port.post.mk&gt;</programlisting>
</note>
</sect2>
</sect1>
@ -6022,7 +6030,10 @@ LIB_DEPENDS+= QtCore:${PORTSDIR}/devel/qt4-corelib
<filename><makevar>PREFIX</makevar>/www/<replaceable>应用程序的名字</replaceable></filename>。
为方便起见, 这个路径在
<filename>Makefile</filename> 和 <filename>pkg-plist</filename>
均以 <makevar>WWWDIR</makevar> 变量的形式提供。</para>
均以 <makevar>WWWDIR</makevar> 变量的形式提供。 在
<filename>Makefile</filename> 中可以使用
<makevar>WWWDIR_REL</makevar> 来表示包含了
<makevar>PREFIX</makevar> 的该变量值。</para>
<para>web 服务器进程所用的用户和用户组, 分别以
<makevar>WWWOWN</makevar> 和 <makevar>WWWGRP</makevar> 变量的形式提供,
@ -6704,6 +6715,7 @@ USE_SDL+= mixer
</tbody>
</tgroup>
</table>
</sect2>
<sect2 id="wx-components">
<title>选择组件</title>
@ -7805,6 +7817,10 @@ run_rc_command "$1"</programlisting>
<filename>Makefile</filename> 中使用。 最新版本的 &os; 并不为脚本名增加任何后缀,
但较早的版本则曾使用过
<filename>.sh</filename> 后缀。</para>
<note>
<para>新增的脚本均不应使用 <filename>.sh</filename>
后缀。 未来, 仍然包含这一后缀的脚本将被批量改名。</para>
</note>
<sect2>
<title>卸载时停止服务</title>
@ -8377,15 +8393,17 @@ as .putsy.conf and edit it.</programlisting>
实际上, port 会安装到
<makevar>DESTDIR</makevar>/<makevar>PREFIX</makevar>
并注册到位于 <makevar>DESTDIR</makevar>/var/db/pkg
的预编译包数据库中。 在撰写 port 时, 遵循
<makevar>DESTDIR</makevar> 的配置十分重要。</para>
的预编译包数据库中。 由于 <makevar>DESTDIR</makevar> 是由
ports 框架藉由 &man.chroot.8; 来实现的, 您在撰写符合
<makevar>DESTDIR</makevar> 规范的 ports 时并不需要什么额外的工作。</para>
<para>一般而言 <makevar>PREFIX</makevar> 会设为
<makevar>LOCALBASE_REL</makevar> (默认是
<filename>/usr/local</filename>)。 如果设置了
<makevar>USE_X_PREFIX</makevar> 或 <makevar>USE_IMAKE</makevar>
则 <makevar>PREFIX</makevar> 会设为 <makevar>X11BASE_REL</makevar> (默认是
<filename>/usr/X11R6</filename>)。 如果设置了
则 <makevar>PREFIX</makevar> 会设为 <makevar>X11BASE</makevar>
(为了向前兼容, 这个变量的默认值是 <makevar>LOCALBASE</makevar>
未来它将被删除)。 如果设置了
<makevar>USE_LINUX_PREFIX</makevar> 则 <makevar>PREFIX</makevar>
会设为 <makevar>LINUXBASE_REL</makevar> (默认是
<filename>/compat/linux</filename>)。</para>
@ -8435,47 +8453,6 @@ as .putsy.conf and edit it.</programlisting>
<literal>-DPAGER=\"/usr/local/bin/less\"</literal>。
这种方法能够增加在系统管理员把整个 <filename>/usr/local</filename>
目录挪到其它位置时安装成功的机会。</para>
<para>请注意 <makevar>LOCALBASE</makevar>、
<makevar>LINUXBASE</makevar>、 <makevar>X11BASE</makevar>、
<makevar>DOCSDIR</makevar>、 <makevar>EXAMPLESDIR</makevar>、
<makevar>DATADIR</makevar> 以及 <makevar>DESKTOPDIR</makevar>
这些变量中已经包含了 <makevar>DESTDIR</makevar>。 使用
<makevar>DESTDIR</makevar>&nbsp;<makevar>LOCALBASE</makevar>
是错误的。 在您需要相对于 <makevar>DESTDIR</makevar> 的路径时,
应使用 <makevar>LOCALBASE_REL</makevar>、
<makevar>LINUXBASE_REL</makevar> 和 <makevar>X11BASE_REL</makevar>。
为了使脚本撰写过程不过分地繁琐, 可以用 <makevar>TARGETDIR</makevar>
来代替 <makevar>DESTDIR</makevar>&nbsp;<makevar>PREFIX</makevar>。</para>
<para>以下是一些正确的用法:</para>
<programlisting>post-install:
${INSTALL_PROGRAM} ${WRKSRC}/helper ${TARGETDIR}/bin/helper
${INSTALL_DATA} ${WRKSRC}/guide.txt ${DOCSDIR}</programlisting>
<para>在引用 port 的依赖关系时, 会用到
<makevar>LOCALBASE</makevar> 因为我们正在目标环境中进行工作。
如果必须在软件中将路径硬编码进去,
则应使用 <makevar>LOCALBASE_REL</makevar> 的值,
因为这些软件会在目标环境内使用。</para>
<para>以下是一些正确的用法:</para>
<programlisting>RUN_DEPENDS= ${LOCALBASE}/share/gonzo/launch.dat:${PORTSDIR}/games/gonzo
post-patch:
@${REINPLACE_CMD} -e 's|/usr/gonzo/launch.dat|${LOCALBASE_REL}/share/gonzo/launch.dat}' ${WRKSRC}/main.c
@${REINPLACE_CMD} -e 's|/etc/game.conf|${PREFIX}/etc/game.conf|' ${WRKSRC}/loader.c
post-install:
@${INSTALL_DATA} ${WRKSRC}/example/conf ${TARGETDIR}/etc/game.conf</programlisting>
<para>在装箱单和 <filename>pkg-*</filename> 脚本中,
<literal>%%LOCALBASE%%</literal>、 <literal>%%LINUXBASE%%</literal>
和 <literal>%%X11BASE%%</literal> 在扩展时,
会自动剔除 <makevar>DESTDIR</makevar>
因为这些文件都会在目标环境中使用。</para>
</sect1>
<sect1 id="testing-tinderbox">
@ -8548,7 +8525,7 @@ post-install:
而这正是最需要志愿人员的领域。
(要了解关于维护者的任务描述, 请参见
<ulink url="&url.books.developers-handbook;/policies.html#POLICIES-MAINTAINER">
Makefile 中的 MAINTAINER</ulink> 小节)。</para>
开发手册中的相关部分</ulink>。)</para>
<para>将 diff 发送给我们的最佳方式是通过 &man.send-pr.1; (category 一栏写
<literal>ports</literal>)。 如果您正维护那个 port
@ -10561,6 +10538,11 @@ Reference: &lt;http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00
支持之后的 6.1-STABLE。</entry>
<entry>601104</entry>
</row>
<row>
<entry>由于 802.11 修正变动了 IEEE80211_IOC_STA_INFO ioctl API
之后的 6.1-STABLE。</entry>
<entry>601104</entry>
</row>
<row>
<entry>6.2-RELEASE</entry>
<entry>602000</entry>
@ -10610,6 +10592,20 @@ Reference: &lt;http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00
<entry>MFC 了 readline 5.2 patchset 002 之后的 6.2-STABLE。</entry>
<entry>602109</entry>
</row>
<row>
<entry>MFC 了用于 amd64 和 i386 的 pmap_invalidate_cache()、
pmap_change_attr()、 pmap_mapbios()、 pmap_mapdev_attr()、
and pmap_unmapbios() 之后的 6.2-STABLE。</entry>
<entry>602110</entry>
</row>
<row>
<entry>由于 MFC 了 BOP_BDFLUSH 导致文件系统模块 KBI
变化之后的 6.2-STABLE。</entry>
<entry>602111</entry>
<row>
<entry>一系列 libutil(3) MFC 之后的 6.2-STABLE。</entry>
<entry>602112</entry>
</row>
<row>
<entry>7.0-CURRENT。</entry>
<entry>700000</entry>
@ -10620,7 +10616,7 @@ Reference: &lt;http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00
<entry>700001</entry>
</row>
<row>
<entry>为 dev_clone 处理出口函数中增加身份信息参数之后的
<entry>为 dev_clone 事件处理函数中增加身份信息参数之后的
7.0-CURRENT。</entry>
<entry>700002</entry>
</row>
@ -10772,7 +10768,7 @@ Reference: &lt;http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00
</row>
<row>
<entry>修改了 insmntque()、
getnewvnode() 以及 vfs_hash_insert() 工作方式之后的 7.0-CURRENT。
getnewvnode() 以及 vfs_hash_insert() 工作方式之后的 7.0-CURRENT。
</entry>
<entry>700034</entry>
</row>
@ -10787,9 +10783,85 @@ Reference: &lt;http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-00
</row>
<row>
<entry>新增了实现 Linux SCSI SG 直通设备 API 子集的 CAM 'SG'
设备之后的 7.0-CURRENT。</entry>
设备之后的 7.0-CURRENT。</entry>
<entry>700037</entry>
</row>
<row>
<entry>将 &man.getenv.3;、 &man.putenv.3;、
&man.setenv.3; 和 &man.unsetenv.3; 改为符合 POSIX
之后的 7.0-CURRENT。</entry>
<entry>700038</entry>
</row>
<row>
<entry>回退了 700038 中的变动之后的 7.0-CURRENT。</entry>
<entry>700039</entry>
</row>
<row>
<entry>在 libutil 中增加了 &man.flopen.3; 之后的 7.0-CURRENT。</entry>
<entry>700040</entry>
</row>
<row>
<entry>启用了符号版本, 并将 libthr 改为默认线程库之后的 7.0-CURRENT。</entry>
<entry>700041</entry>
</row>
<row>
<entry>引入了 gcc 4.2.0 之后的 7.0-CURRENT。</entry>
<entry>700042</entry>
</row>
<row>
<entry>将 RELENG_6 之后未修改过版本的共享库版本增加之后的 7.0-CURRENT。</entry>
<entry>700043</entry>
</row>
<row>
<entry>将 vn_open()/VOP_OPEN() 的参数由文件描述符数组下标改为
struct file * 之后的 7.0-CURRENT。</entry>
<entry>700044</entry>
</row>
<row>
<entry>修改 &man.pam.nologin.8; 使其向 PAM
框架提供帐号管理功能而非身份验证功能之后的 7.0-CURRENT。</entry>
<entry>700045</entry>
</row>
<row>
<entry>更新 802.11 无线支持之后的 7.0-CURRENT。</entry>
<entry>700046</entry>
</row>
<row>
<entry>增加 TCP LRO 网络接口能力之后的 7.0-CURRENT。</entry>
<entry>700047</entry>
</row>
<row>
<entry>在 IPv4 协议栈中加入了 RFC 3678 API 支持之后的 7.0-CURRENT。
先前 IP_MULTICAST_IF ioctl 的 RFC 1724 行为被删去;
0.0.0.0/8 不再能够用于指定接口索引下标, 而应使用
struct ipmreqn 代替。</entry>
<entry>700048</entry>
</row>
<row>
<entry>引入 OpenBSD
4.1 的 pf 之后的 7.0-CURRENT。</entry>
<entry>700049</entry>
</row>
<row>
<entry>为
FAST_IPSEC 增加 IPv6 支持, 删去 KAME IPSEC 并将
FAST_IPSEC 更名为 IPSEC 之后的 7.0-CURRENT。</entry>
<entry>(未变动)</entry>
</row>
<row>
<entry>将 setenv/putenv/等等调用,
从传统 BSD 改为 POSIX 标准之后的 7.0-CURRENT。</entry>
<entry>700050</entry>
</row>
<row>
<entry>增加新的 mmap/lseek/等等这些系统调用之后的 7.0-CURRENT。</entry>
<entry>700051</entry>
</row>
<row>
<entry>将 I4B 头文件移动到
include/i4b 之后的 7.0-CURRENT。</entry>
<entry>700052</entry>
</row>
</tbody>
</tgroup>