This is an archive of past FreeBSD releases; it's part of the FreeBSD Documentation Archive.

5.11. Makefile 选项

5.11. Makefile 选项

某些大型应用程序可以在联编时使用一系列配置选项, 用以在系统中已经安装了某些库或应用程序时增加一些功能。 例如, 选择某种自然 (人类的) 语言, GUI 或命令行界面, 由于并不是所有的用户都希望使用这些库或者应用程序, port 系统提供了一组方便的机制, 来让 port 的作者控制联编时的配置。 支持这些特性可以让用户体验更好, 并达到事半功倍的效果。

5.11.1. 开关 (Knobs)

5.11.1.1. WITH_*WITHOUT_*

这些变量是为系统管理员准备的。 许多这样的变量被标准化并置于 ports/KNOBS 文件。

在创建一个 port 的时候,不要使用某个应用程序专有的 knob 名称,比如对于 Avahi 这个 port,应该用 WITHOUT_MDNS 而不是 WITHOUT_AVAHI_MDNS

注意:

您不应假定每一个 WITH_* 都会有对应的 WITHOUT_* 变量, 反之亦然。 一般而言, 会使用默认值。

注意:

除非另有说明, 这些变量都是测试是否定义, 而不是它们设置了 YESNO

表 5.3. 常见的 WITH_*WITHOUT_* 变量
变量意义
WITHOUT_NLS表示不需要国际化支持, 这可以节省编译所消耗的时间。 默认情况下, 会启用国际化支持。
WITH_OPENSSL_BASE使用基本系统中的 OpenSSL 版本。
WITH_OPENSSL_PORTsecurity/openssl 安装 OpenSSL,即使基本系统中的版本是最新的。
WITHOUT_X11如果 port 能够在是否包含 X 支持的情况下分别联编, 则一般情况应该默认以包含 X 支持的配置来联编。 如果定义了这一变量, 则应联编不包含 X 支持的版本。

5.11.1.2. 开关 (knob) 的命名

我们建议 port 的开发人员使用相似的开关, 以便最终用户使用, 并减少开关名称的总数。 最为常用的开关名字可以在 KNOBS 文件中找到。

开关的名字应反映其功能。 如果 port 的 PORTNAME 包括 lib- 前缀, 则开关名中应删去 lib- 前缀。

5.11.2. OPTIONS (菜单式可选项)

5.11.2.1. 背景

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 可以删除已经保存的配置。

5.11.2.2. 语法

OPTIONS 变量的语法是:

OPTIONS=	OPTION	"说明性文字" 默认值 ...

默认值必须是 ONOFF 之一。 这种三元组可以使用多次。

定义 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_* 等。

例 5.8. 简单的 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>

例 5.9. Old style use of 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>

5.11.3. 自动激活的特性

在使用 GNU configure 脚本时, 一定要小心有些特性会由其自动检测而激活。 您应通过明确地指定相应的 --without-xxx--disable-xxx 参数到 CONFIGURE_ARGS 来禁用不希望的特性。

例 5.10. 处理选项时的错误做法
.if defined(WITH_FOO)
LIB_DEPENDS+=		foo.0:${PORTSDIR}/devel/foo
CONFIGURE_ARGS+=	--enable-foo
.endif

在前面的例子中, 假设系统中已经安装了 libfoo 库。 用户可能并不希望应用程序使用 libfoo, 因此他在 make config 对话框中关掉了这个选项。 但是, 应用程序的 configure 脚本检测到了系统中存在这个库, 并将其加入到了最终可执行文件支持的功能中。 现在, 如果用户决定从系统中卸载 libfoo 时, ports 系统就无法保护这个应用程序免遭破坏了 (因为没有记录 libfoo 的依赖关系)。

例 5.11. 处理选项时的正确做法
.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>.