5.11. Makefile 选项
上一页 | 第 5 章 配置 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_`*`` 变量， 反之亦然。 一般而言， 会使用默认值。

### 注意:

除非另有说明， 这些变量都是测试是否定义， 而不是它们设置了 `YES` 或 `NO`。

表 5.3. 常见的 `WITH_`*`` 和 `WITHOUT_`*`` 变量

变量 | 意义
--- | ---
`WITHOUT_NLS` | 表示不需要国际化支持， 这可以节省编译所消耗的时间。 默认情况下， 会启用国际化支持。
`WITH_OPENSSL_BASE` | 使用基本系统中的 OpenSSL 版本。
`WITH_OPENSSL_PORT` | 从 `security/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 "说明性文字" 默认值 ...

默认值必须是 `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_*` 等。

例 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 脚本也不会启用相应的功能了。

上一页 | 上一级 | 下一页
5.10. Info 文件 | 起始页 | 5.12. 指定工作临时目录

本文档和其它文档可从这里下载： ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题，请先阅读 文档，如不能解决再联系 <questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.