某些大型应用程序可以在联编时使用一系列配置选项, 用以在系统中已经安装了某些库或应用程序时增加一些功能。 例如, 选择某种自然 (人类的) 语言, GUI 或命令行界面, 由于并不是所有的用户都希望使用这些库或者应用程序, port 系统提供了一组方便的机制, 来让 port 的作者控制联编时的配置。 支持这些特性可以让用户体验更好, 并达到事半功倍的效果。
这些变量是为系统管理员准备的。 许多这样的变量被标准化并置于
ports/KNOBS
文件。
在创建一个 port 的时候,不要使用某个应用程序专有的 knob
名称,比如对于 Avahi 这个 port,应该用
WITHOUT_MDNS
而不是
WITHOUT_AVAHI_MDNS
。
您不应假定每一个
WITH_
都会有对应的
*
WITHOUT_
变量, 反之亦然。 一般而言, 会使用默认值。*
除非另有说明, 这些变量都是测试是否定义,
而不是它们设置了 YES
或
NO
。
WITH_*
和 WITHOUT_*
变量变量 | 意义 |
---|---|
WITHOUT_NLS | 表示不需要国际化支持, 这可以节省编译所消耗的时间。 默认情况下, 会启用国际化支持。 |
WITH_OPENSSL_BASE | 使用基本系统中的 OpenSSL 版本。 |
WITH_OPENSSL_PORT | 从 security/openssl 安装 OpenSSL,即使基本系统中的版本是最新的。 |
WITHOUT_X11 | 如果 port 能够在是否包含 X 支持的情况下分别联编, 则一般情况应该默认以包含 X 支持的配置来联编。 如果定义了这一变量, 则应联编不包含 X 支持的版本。 |
我们建议 port 的开发人员使用相似的开关, 以便最终用户使用, 并减少开关名称的总数。 最为常用的开关名字可以在 KNOBS 文件中找到。
开关的名字应反映其功能。 如果 port 的 PORTNAME
包括 lib- 前缀, 则开关名中应删去 lib- 前缀。
OPTIONS
将为正在安装 port
的用户提供一个包含可用选项的对话框,
并将用户的选择保存到 /var/db/ports/portname/options
中。
下次重新联编 port 时, 这些选项将被再次使用。
这样一来, 就不需要劳神去记忆您之前联编 port 时的那几十个
WITH_
和
*
WITHOUT_
选项了!*
当用户运行 make config
(或首次运行
make build
) 时, 框架会首先检查
/var/db/ports/portname/options
。
如果这个文件不存在, 则它会使用
OPTIONS
的值来生成一个可以启用或禁用各个选项的对话框。
随后, 用户的选择将保存到
options
文件中,
并被用于联编 port。
如果新版本的 port 新增了
OPTIONS
, 则系统会再次给出对话框,
并根据先前的 OPTIONS
配置预设先前存在的配置。
使用 make showconfig
可以查看保存的配置。
此外, make rmconfig
可以删除已经保存的配置。
OPTIONS
变量的语法是:
OPTIONS= OPTION "说明性文字" 默认值 ...
默认值必须是 ON
和
OFF
之一。 这种三元组可以使用多次。
定义 OPTIONS
变量的值,
必须在引入 bsd.port.options.mk
之前进行。
而 WITH_*
和 WITHOUT_*
变量则只能在引入了
bsd.port.options.mk
之后才可以进行检测。 使用
bsd.port.pre.mk
也可以达到同样的目的,
在系统开始提供 bsd.port.options.mk
之前的许多
port 都在使用这种用法。 不过, 请注意
bsd.port.pre.mk
会要求某些变量已经进行过定义, 如
USE_*
等。
OPTIONS
用法OPTIONS= FOO "启用 foo 选项" On \ BAR "支持 bar 功能" Off .include <bsd.port.options.mk> .if defined(WITHOUT_FOO) CONFIGURE_ARGS+= --without-foo .else CONFIGURE_ARGS+= --with-foo .endif .if defined(WITH_BAR) RUN_DEPENDS+= bar:${PORTSDIR}/bar/bar .endif .include <bsd.port.mk>
OPTIONS
OPTIONS= FOO "Enable option foo" On .include <bsd.port.pre.mk> .if defined(WITHOUT_FOO) CONFIGURE_ARGS+= --without-foo .else CONFIGURE_ARGS+= --with-foo .endif .include <bsd.port.post.mk>
在使用 GNU configure 脚本时, 一定要小心有些特性会由其自动检测而激活。
您应通过明确地指定相应的
--without-xxx
或 --disable-xxx
参数到 CONFIGURE_ARGS
来禁用不希望的特性。
.if defined(WITH_FOO) LIB_DEPENDS+= foo.0:${PORTSDIR}/devel/foo CONFIGURE_ARGS+= --enable-foo .endif
在前面的例子中, 假设系统中已经安装了 libfoo 库。 用户可能并不希望应用程序使用 libfoo,
因此他在 make config
对话框中关掉了这个选项。
但是, 应用程序的 configure 脚本检测到了系统中存在这个库,
并将其加入到了最终可执行文件支持的功能中。 现在, 如果用户决定从系统中卸载 libfoo 时,
ports 系统就无法保护这个应用程序免遭破坏了 (因为没有记录 libfoo 的依赖关系)。
.if defined(WITH_FOO) LIB_DEPENDS+= foo.0:${PORTSDIR}/devel/foo CONFIGURE_ARGS+= --enable-foo .else CONFIGURE_ARGS+= --disable-foo .endif
在第二个例子中, libfoo 库被明确禁用。 即使系统中已经安装了这个库, configure 脚本也不会启用相应的功能了。
本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
如果对于FreeBSD有问题,请先阅读
文档,如不能解决再联系
<questions@FreeBSD.org>.
关于本文档的问题请发信联系
<doc@FreeBSD.org>.