5.14.Makefile 参数
许多应用程序可以用可选的或不同的配置来构建。这方面的例子包括选择自然 (人类) 语言, GUI 与命令行, 或支持的数据库的类型。用户可能需要与默认配置不同的配置, 因此, ports 系统提供了钩子, 供 port 作者使用, 以控制哪种变体将被构建。正确地支持这些选项将使用户满意, 并有效地以一个 Port 的价格提供两个或多个 Port 。
5.14.1.1. 背景介绍
OPTIONS_*
为安装 port 的用户提供了一个显示可用选项的对话框, 并将这些选项保存到 ${PORT_DBDIR}/${OPTIONS_NAME}/options。在下次联编 port 时, 这些选项会被重新使用。PORT_DBDIR
默认为 /var/db/ports。OPTIONS_NAME
是指以下划线作为空格分隔符的 Port 来源, 例如, 对于 dns/bind99 来说, 它将是 dns_bind99
。
当用户运行 make config (或首次运行 make build) 时, 框架会检查 ${PORT_DBDIR}/${OPTIONS_NAME}/options。如果该文件不存在, 则会使用 OPTIONS_*
的值, 并显示一个可以启用或禁用这些选项的对话框。然后会保存选项, 并在联编 port 时使用配置的变量。
如果新版本的 port 增加了新的 OPTIONS
,对话框将显示给用户,并预先填写旧 OPTIONS
的保存值。
make showconfig
显示已保存的配置。使用 make rmconfig
来删除保存的配置。
5.14.1.2. 语法
OPTIONS_DEFINE
包含一个要使用的 OPTIONS
列表。这些都是相互独立的,没有被分组:
一旦定义,就会描述 OPTIONS
(可选,但强烈建议):
ports/Mk/bsd.options.desc.mk 有许多常见的 OPTIONS
的描述。虽然通常很有用, 但如果描述对 Port 来说是不够的, 则可以覆盖它们。
技巧
在描述选项时,要从用户的角度来看待它:“它改变了什么功能?”和“我为什么要启用这个?”不要只是重复名称。例如,将
NLS
选项描述为 "包括NLS
支持 "并不能帮助用户,因为用户已经看到了这个选项的名称,但可能不知道它的含义。把它描述为 "通过 gettext 工具提供母语支持 "会更有帮助。
重要
选项名称总是用大写字母。它们不能使用混合大小写或小写。
OPTIONS
可以被分组为单选,每组只允许有一个选择:
警告
每个
OPTIONS_SINGLE
组中必须有一个一直被选中,选项才会有效。每组的一个选项必须被添加到OPTIONS_DEFAULT
中。
OPTIONS
可以被分组为单选,每组中不允许有或只有一个选择:
OPTIONS
也可以被分组为“多选”列表,其中至少有一个选项必须被启用:
OPTIONS
也可以被分组为“多选”列表,其中没有或任何选项可以被启用:
OPTIONS
默认为未设置,除非它们被列在 OPTIONS_DEFAULT
中:
OPTIONS
的定义必须出现在包含 bsd.port.options.mk 之前。PORT_OPTIONS
的值只有在包含了 bsd.port.options.mk 之后才能被测试。也可以用包含 bsd.port.pre.mk 来代替, 而且在引入 bsd.port.options.mk 之前编写的 port 中仍然广泛使用。但需要注意的是, 在包含了 bsd.port.pre.mk 之后, 一些变量将无法正常工作, 特别是一些 USE_*
标志。
例43.
OPTIONS
的简单使用
例44. 检查未设置的 Port
OPTIONS
上图所示的形式是不可取的。首选的方法是使用一个配置旋钮来真正启用和禁用该功能,以匹配该选项:
例45.
OPTIONS
的实际使用
5.14.1.3. 默认选项
这些选项在默认情况下总是打开的。
DOCS
- 构建和安装文件。NLS
- 母语支持。EXAMPLES
- 构建和安装示例。IPV6
- 支持IPv6协议。
注意
没有必要将这些添加到
OPTIONS_DEFAULT
中。然而,要使它们处于激活状态,并显示在选项选择对话框中,必须将它们添加到OPTIONS_DEFAINE
中。
5.14.2. 功能自动激活
当使用 GNU configure 脚本时,要注意哪些可选功能是通过自动检测激活的。通过在 CONFIGURE_ARGS
中添加 --without-xxx
或 --disable-xxx
来明确地禁用不需要的可选功能。
例46. 对期权的错误处理
在上面的例子中,设想系统上安装了一个库 libfoo。用户不希望这个应用程序使用 libfoo,所以他在 make config
对话框中关闭了这个选项。但是应用程序的配置脚本检测到了系统中存在的库,并在生成的可执行文件中包含了对它的支持。现在当用户决定从系统中删除 libfoo 时, ports 系统并没有提出抗议 (没有记录对 libfoo 的依赖性), 但应用程序却崩溃了。
例47. 正确处理一个期权
注意
在某些情况下,速记条件语法会导致复杂结构的问题。这些错误通常是
Malformed conditional
,可以使用另一种语法。以此来替代
5.14.3. 选择帮助者
有一些宏来帮助简化条件值,这些条件值根据设置的选项而不同。为了方便使用,我们提供了一个全面的列表:
PLIST_SUB
, SUB_LIST
关于自动生成
%OPT%%
和%NOOPT%%
,请参见OPTIONS_SUB
。 关于更复杂的用法,请参阅通用变量替换、OPT_VARIABLE
和OPT_VARIABLE_OFF
。
CONFIGURE_ARGS
关于
--enable-x
和--disable-x
,见OPT_CONFIGURE_ENABLE
。关于
--with-x
和--without-x
,见OPT_CONFIGURE_WITH
。对于所有其他情况,见
OPT_CONFIGURE_ON
和OPT_CONFIGURE_OFF
。
CMAKE_ARGS
对于作为布尔的参数(开、关、真、假、0、1),见
OPT_CMAKE_BOOL
和OPT_CMAKE_BOOL_OFF
。 对于所有其他情况,见OPT_CMAKE_ON
和OPT_CMAKE_OFF
。
MESON_ARGS
对于取真或取假的参数,见
OPT_MESON_TRUE
和OPT_MESON_FALSE
。对于采取是或否的参数,使用
OPT_MESON_YES
和OPT_MESON_NO
。关于采取启用或禁用的参数,见
OPT_MESON_ENABLED
和OPT_MESON_DISABLED
。对于所有其他情况,使用
OPT_MESON_ON
和OPT_MESON_OFF
。
QMAKE_ARGS
见
OPT_QMAKE_ON
和OPT_QMAKE_OFF
。
USE_\*
见
OPT_USE
和OPT_USE_OFF
。
*_DEPENDS
参见依赖关系、
OPT_DEPTYPE
和OPT_DEPTYPE_OFF
。
*
(Any variable)
最常用的变量有直接的帮助器,见通用变量替换,
OPT_VARIABLE
和OPT_VARIABLE_OFF
。对于任何没有特定帮手的变量,见
OPT_VARS
和OPT_VARS_OFF
。
Options dependencies
当一个选项需要另一个选项来工作时,请参阅
OPT_IMPLIES
。
Options conflicts
当一个选项在另一个选项也被启用的情况下不能工作时,见
OPT_PREVENTS
和OPT_PREVENTS_MSG
。
Build targets
当一个选项需要一些额外的处理时,请看额外的构建目标,
target-OPT-on
和target-OPT-off
。
5.14.3.1. OPTIONS_SUB
OPTIONS_SUB
如果 OPTIONS_SUB
设置为 yes
,那么添加到 OPTIONS_DEFINE
中的每个选项都将被添加到 PLIST_SUB
和 SUB_LIST
中,比如说:
相当于:
注意
OPTIONS_SUB
的值会被忽略。将它设置为任何值都会为所有选项添加PLIST_SUB
和SUB_LIST
条目。
5.14.3.2. OPT_USE
和 OPT_USE_OFF
OPT_USE
和 OPT_USE_OFF
当选项 OPT 被选中时,对于 OPT_USE
中的每个 key=value
对,值会被附加到相应的 USE_KEY
中。如果值中有空格,请用逗号代替,在处理过程中,它们会被改回为空格。OPT_USE_OFF
的工作方式与此相同,但当 OPT
没有被选中时。例如:
相当于:
5.14.3.3. CONFIGURE_ARGS
帮助者
CONFIGURE_ARGS
帮助者5.14.3.3.1. OPT_CONFIGURE_ENABLE
OPT_CONFIGURE_ENABLE
当选项 OPT 被选中时,对于 OPT_CONFIGURE_ENABLE
中的每个条目,--enable-
条目被附加到CONFIGURE_ARGS
。当没有选择 OPT 选项时,--disable-entry
被附加到 CONFIGURE_ARGS
中。一个可选的参数可以用=符号来指定。这个参数只被附加到 --enable-entry
配置选项中。比如说:
相当于:
5.14.3.3.2. OPT_CONFIGURE_WITH
OPT_CONFIGURE_WITH
当选项OPT被选中时,对于OPT_CONFIGURE_WITH中的每个条目,--with-entry被附加到CONFIGURE_ARGS。当没有选择OPT选项时,--without-entry被附加到CONFIGURE_ARGS中。可以用=符号来指定一个可选参数。这个参数只被附加到--with-entry configure选项中。例如:
相当于:
5.14.3.3.3. OPT_CONFIGURE_ON
和 OPT_CONFIGURE_OFF
OPT_CONFIGURE_ON
和 OPT_CONFIGURE_OFF
当选择选项 OPT 时,OPT_CONFIGURE_ON
的值(如果定义了的话)被附加到 CONFIGURE_ARGS
。 OPT_CONFIGURE_OFF
的作用与此相同,但当 OPT 未被选中时。比如说
相当于:
技巧
大多数时候,
OPT_CONFIGURE_ENABLE
和OPT_CONFIGURE_WITH
中的帮助器提供了更短、更全面的功能。
5.14.3.4. CMAKE_ARGS
帮助者
CMAKE_ARGS
帮助者5.14.3.4.1. OPT_CMAKE_ON
和 OPT_CMAKE_OFF
OPT_CMAKE_ON
和 OPT_CMAKE_OFF
当选项 OPT 被选中时,OPT_CMAKE_ON
的值(如果定义了的话)被附加到 CMAKE_ARGS
中。OPT_CMAKE_OFF
的作用与此相同,但当 OPT 未被选中时。比如说
相当于:
技巧
参见
OPT_CMAKE_BOOL
和OPT_CMAKE_BOOL_OFF
,当值为布尔时,有一个更短的帮助器。
5.14.3.4.2. OPT_CMAKE_BOOL
和 OPT_CMAKE_BOOL_OFF
OPT_CMAKE_BOOL
和 OPT_CMAKE_BOOL_OFF
当选项 OPT 被选中时,对于 OPT_CMAKE_BOOL
中的每个条目,-D_entry_:BOOL=true
被附加到 CMAKE_ARGS
。当未选择选项 OPT 时,-D_entry_:BOOL=false
被附加到 CONFIGURE_ARGS
。OPT_CMAKE_BOOL_OFF
则相反,当选项被选中时,-D_entry_:BOOL=false
被追加到 CMAKE_ARGS
中,而当选项未被选中时,-D_entry_:BOOL=true
。比如说:
相当于:
5.14.3.5. MESON_ARGS
帮助者
MESON_ARGS
帮助者5.14.3.5.1. OPT_MESON_ON
和 OPT_MESON_OFF
OPT_MESON_ON
和 OPT_MESON_OFF
当选择选项 OPT 时,OPT_MESON_ON
的值(如果定义了的话)被附加到 MESON_ARGS
中。OPT_MESON_OFF
的作用与此相同,但当 OPT 未被选中时。例如:
相当于:
5.14.3.5.2. OPT_MESON_TRUE
和 OPT_MESON_FALSE
OPT_MESON_TRUE
和 OPT_MESON_FALSE
当选项 OPT 被选中时,对于 OPT_MESON_TRUE
中的每个条目,-D_entry_=true
被附加到 MESON_ARGS
。当未选择选项 OPT 时,-D_entry_=false
被附加到 MESON_ARGS
。OPT_MESON_FALSE
则相反,当选项被选中时,-D_entry_=false
被附加到 MESON_ARGS,而当选项未被选中时,-D_entry_=true
被附加到 MESON_ARGS。比如说:
相当于:
5.14.3.5.3. OPT_MESON_YES
和 OPT_MESON_NO
OPT_MESON_YES
和 OPT_MESON_NO
当选项 OPT
被选中时,对于 OPT_MESON_YES
中的每个条目,-D_entry_=yes
被附加到 MESON_ARGS
。当未选择选项 OPT 时,-D_entry_=no
被附加到 MESON_ARGS
。OPT_MESON_NO
则相反,当选项被选中时,-D_entry_=no
被附加到 MESON_ARGS,而当选项未被选中时,-D_entry_=yes
被附加到 MESON_ARGS。比如说:
相当于:
5.14.3.5.4. OPT_MESON_ENABLED
和 OPT_MESON_DISABLED
OPT_MESON_ENABLED
和 OPT_MESON_DISABLED
当选项 OPT 被选中时,对于 OPT_MESON_ENABLED
中的每个条目,-D_entry_=enabled
被附加到 MESON_ARGS
。当未选择选项 OPT 时,-D_entry_=disabled
将被附加到 MESON_ARGS
。 OPT_MESON_DISABLED
则相反,当选项被选中时,-D_entry_=disabled
被附加到 MESON_ARGS
,而当选项未被选中时,-D_entry_=enabled
被附加到 MESON_ARGS
。比如说:
相当于:
5.14.3.6. OPT_QMAKE_ON
和 OPT_QMAKE_OFF
OPT_QMAKE_ON
和 OPT_QMAKE_OFF
当选项 OPT 被选中时,OPT_QMAKE_ON
的值(如果定义了的话)被附加到 QMAKE_ARGS
中。OPT_QMAKE_OFF
的作用与此相同,但当 OPT 未被选中时。比如说
相当于:
5.14.3.7. OPT_IMPLIES
OPT_IMPLIES
提供了一种在选项之间添加依赖关系的方法。
当 OPT 被选中时,这个变量中列出的所有选项也将被选中。用前面描述的 OPT_CONFIGURE_ENABLE
来说明:
相当于:
例48. OPT_IMPLIES的简单使用
这个 Port 有一个 X11 选项, 和一个 GNOME 选项, 需要选择 X11 选项来构建。
5.14.3.8. OPT_PREVENTS
和 OPT_PREVENTS_MSG
OPT_PREVENTS
和 OPT_PREVENTS_MSG
提供了一种添加选项之间冲突的方法。
当选择 OPT 时,OPT_PREVENTS
中列出的所有选项都必须取消选择。如果设置了 OPT_PREVENTS_MSG
,并且触发了冲突,其内容将被显示出来,解释他们冲突的原因。比如说:
大致相当于:
唯一的区别是,第一个会在运行 make config
后写一个错误,建议改变所选选项。
例49.
OPT_PREVENTS
的简单使用这个 Port 有 X509 和 SCTP 选项。这两个选项都添加了补丁,但补丁之间相互冲突,所以不能同时选择。
5.14.3.9. OPT_VARS
和 OPT_VARS_OFF
OPT_VARS
和 OPT_VARS_OFF
提供一个通用的方法来设置和追加变量。
警告
在使用
OPT_VARS
和OPT_VARS_OFF
之前,看看在通用变量替换中是否已经有了更具体的帮助工具,OPT_VARIABLE
和OPT_VARIABLE_OFF
。
当选择了 OPT 选项,并且定义了 OPT_VARS
,就会从 OPT_VARS
中评估 key=value
和 key+=value
对。一个=导致 KEY 的现有值被覆盖,一个 +=
附加到该值上。OPT_VARS_OFF
的工作方式与此相同,但当 OPT
未被选中时。
相当于:
重要
含有空白的值必须用引号括起来:
这是由于 make(1) 变量扩展处理空白的方式造成的。当
OPT_VARS= foo=bar baz
被扩展时,该变量最终包含两个字符串,foo=bar
和baz
。但提交者可能希望只有一个字符串,foo=bar baz
。引述该值可以防止空格被用作分隔符。另外,不要在
var=
符号后和值前添加额外的空格,它也会被分割成两个字符串。这将不会起作用:
5.14.3.10. 依赖性, OPT_DEPTYPE
和 OPT_DEPTYPE_OFF
OPT_DEPTYPE
和 OPT_DEPTYPE_OFF
对于这些依赖类型中的任何一种:
PKG_DEPENDS
EXTRACT_DEPENDS
PATCH_DEPENDS
FETCH_DEPENDS
BUILD_DEPENDS
LIB_DEPENDS
RUN_DEPENDS
当选择选项 OPT 时,OPT_DEPTYPE
的值(如果定义了)会附加到 DEPTYPE
上。OPT_DEPTYPE_OFF
的作用与此相同,但当 OPT 未被选中时。比如说
相当于:
5.14.3.11. 通用变量替换, OPT_VARIABLE
和 OPT_VARIABLE_OFF
OPT_VARIABLE
和 OPT_VARIABLE_OFF
对于这些变量中的任何一个:
ALL_TARGET
BINARY_ALIAS
BROKEN
CATEGORIES
CFLAGS
CONFIGURE_ENV
CONFLICTS
CONFLICTS_BUILD
CONFLICTS_INSTALL
CPPFLAGS
CXXFLAGS
DESKTOP_ENTRIES
DISTFILES
EXTRACT_ONLY
EXTRA_PATCHES
GH_ACCOUNT
GH_PROJECT
GH_SUBDIR
GH_TAGNAME
GH_TUPLE
GL_ACCOUNT
GL_COMMIT
GL_PROJECT
GL_SITE
GL_SUBDIR
GL_TUPLE
IGNORE
INFO
INSTALL_TARGET
LDFLAGS
LIBS
MAKE_ARGS
MAKE_ENV
MASTER_SITES
PATCHFILES
PATCH_SITES
PLIST_DIRS
PLIST_FILES
PLIST_SUB
PORTDOCS
PORTEXAMPLES
SUB_FILES
SUB_LIST
TEST_TARGET
USES
当选择选项 OPT 时,OPT_ABOVEVARIABLE
的值(如果定义了的话)被附加到 ABOVEVARIABLE
上。 OPT_ABOVEVARIABLE_OFF
的作用与此相同,但当 OPT 未被选中时。例如:
相当于:
注意
有些变量不在这个列表中,特别是
PKGNAMEPREFIX
和PKGNAMESUFFIX
。这是故意的。当一个 port 的选项集发生变化时, 它的名字不能改变。
警告
其中一些变量,至少是
ALL_TARGET
、DISTFILES
和INSTALL_TARGET
,在选项被处理后有其默认值。在 Makefile 中加入这几行:
如果启用了
DOCS
选项,ALL_TARGET
的最终值将是所有的 DOC;如果该选项被禁用,它的值将是所有。在 Makefile 中只有 options helper 一行:
如果启用了 DOCS 选项,
ALL_TARGET
的最终值将是doc
;如果禁用该选项,它的值将是all
。
5.14.3.12. 额外的建设目标,目标 -OPT-on
和目标 -OPT-off
-OPT-on
和目标 -OPT-off
这些 Makefile 目标可以接受可选的额外构建目标:
pre-fetch
do-fetch
post-fetch
pre-extract
do-extract
post-extract
pre-patch
do-patch
post-patch
pre-configure
do-configure
post-configure
pre-build
do-build
post-build
pre-install
do-install
post-install
post-stage
pre-package
do-package
post-package
当选项 OPT 被选中时,如果定义了目标 TARGET-OPT-on
,就在 TARGET 之后执行。TARGET-OPT-OFF
的工作方式与此相同,但当 OPT 未被选中时。比如说
相当于:
最后更新于