5.14.Makefile 参数

许多应用程序可以用可选的或不同的配置来构建。这方面的例子包括选择自然 (人类) 语言, GUI 与命令行, 或支持的数据库的类型。用户可能需要与默认配置不同的配置, 因此, ports 系统提供了钩子, 供 port 作者使用, 以控制哪种变体将被构建。正确地支持这些选项将使用户满意, 并有效地以一个 Port 的价格提供两个或多个 Port 。

5.14.1.1. 背景介绍

OPTIONS_* 为安装 port 的用户提供了一个显示可用选项的对话框, 并将这些选项保存到 ${PORT_DBDIR}/${OPTIONS_NAME}/options。在下次联编 port 时, 这些选项会被重新使用。PORT_DBDIR 默认为 /var/db/portsOPTIONS_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_DEFINE=	OPT1 OPT2

一旦定义,就会描述 OPTIONS(可选,但强烈建议):

OPT1_DESC=	Describe OPT1
OPT2_DESC=	Describe OPT2
OPT3_DESC=	Describe OPT3
OPT4_DESC=	Describe OPT4
OPT5_DESC=	Describe OPT5
OPT6_DESC=	Describe OPT6

ports/Mk/bsd.options.desc.mk 有许多常见的 OPTIONS 的描述。虽然通常很有用, 但如果描述对 Port 来说是不够的, 则可以覆盖它们。

技巧

在描述选项时,要从用户的角度来看待它:“它改变了什么功能?”和“我为什么要启用这个?”不要只是重复名称。例如,将 NLS 选项描述为 "包括 NLS 支持 "并不能帮助用户,因为用户已经看到了这个选项的名称,但可能不知道它的含义。把它描述为 "通过 gettext 工具提供母语支持 "会更有帮助。

重要

选项名称总是用大写字母。它们不能使用混合大小写或小写。

OPTIONS 可以被分组为单选,每组只允许有一个选择:

OPTIONS_SINGLE=		SG1
OPTIONS_SINGLE_SG1=	OPT3 OPT4

警告

每个 OPTIONS_SINGLE 组中必须有一个一直被选中,选项才会有效。每组的一个选项必须被添加到 OPTIONS_DEFAULT 中。

OPTIONS 可以被分组为单选,每组中不允许有或只有一个选择:

OPTIONS_RADIO=		RG1
OPTIONS_RADIO_RG1=	OPT7 OPT8

OPTIONS 也可以被分组为“多选”列表,其中至少有一个选项必须被启用:

OPTIONS_MULTI=		MG1
OPTIONS_MULTI_MG1=	OPT5 OPT6

OPTIONS 也可以被分组为“多选”列表,其中没有或任何选项可以被启用:

OPTIONS_GROUP=		GG1
OPTIONS_GROUP_GG1=	OPT9 OPT10

OPTIONS 默认为未设置,除非它们被列在 OPTIONS_DEFAULT 中:

OPTIONS_DEFAULT=	OPT1 OPT3 OPT6

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 的简单使用

OPTIONS_DEFINE=	FOO BAR
OPTIONS_DEFAULT=FOO

FOO_DESC=	Option foo support
BAR_DESC=	Feature bar support

# Will add --with-foo / --without-foo
FOO_CONFIGURE_WITH=	foo
BAR_RUN_DEPENDS=	bar:bar/bar

.include <bsd.port.mk>

例44. 检查未设置的 Port OPTIONS

.if ! ${PORT_OPTIONS:MEXAMPLES}
CONFIGURE_ARGS+=--without-examples
.endif

上图所示的形式是不可取的。首选的方法是使用一个配置旋钮来真正启用和禁用该功能,以匹配该选项:

# Will add --with-examples / --without-examples
EXAMPLES_CONFIGURE_WITH=	examples

例45. OPTIONS 的实际使用

OPTIONS_DEFINE=		EXAMPLES
OPTIONS_DEFAULT=	PGSQL LDAP SSL

OPTIONS_SINGLE=		BACKEND
OPTIONS_SINGLE_BACKEND=	MYSQL PGSQL BDB

OPTIONS_MULTI=		AUTH
OPTIONS_MULTI_AUTH=	LDAP PAM SSL

EXAMPLES_DESC=		Install extra examples
MYSQL_DESC=		Use MySQL as backend
PGSQL_DESC=		Use PostgreSQL as backend
BDB_DESC=		Use Berkeley DB as backend
LDAP_DESC=		Build with LDAP authentication support
PAM_DESC=		Build with PAM support
SSL_DESC=		Build with OpenSSL support

# Will add USE_PGSQL=yes
PGSQL_USE=	pgsql=yes
# Will add --enable-postgres / --disable-postgres
PGSQL_CONFIGURE_ENABLE=	postgres

ICU_LIB_DEPENDS=	libicuuc.so:devel/icu

# Will add --with-examples / --without-examples
EXAMPLES_CONFIGURE_WITH=	examples

# Check other OPTIONS

.include <bsd.port.mk>

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. 对期权的错误处理

.if ${PORT_OPTIONS:MFOO}
LIB_DEPENDS+=		libfoo.so:devel/foo
CONFIGURE_ARGS+=	--enable-foo
.endif

在上面的例子中,设想系统上安装了一个库 libfoo。用户不希望这个应用程序使用 libfoo,所以他在 make config 对话框中关闭了这个选项。但是应用程序的配置脚本检测到了系统中存在的库,并在生成的可执行文件中包含了对它的支持。现在当用户决定从系统中删除 libfoo 时, ports 系统并没有提出抗议 (没有记录对 libfoo 的依赖性), 但应用程序却崩溃了。

例47. 正确处理一个期权

FOO_LIB_DEPENDS=		libfoo.so:devel/foo
# Will add --enable-foo / --disable-foo
FOO_CONFIGURE_ENABLE=	foo

注意

在某些情况下,速记条件语法会导致复杂结构的问题。这些错误通常是 Malformed conditional,可以使用另一种语法。

.if !empty(VARIABLE:MVALUE)

以此来替代

.if ${VARIABLE:MVALUE}

5.14.3. 选择帮助者

有一些宏来帮助简化条件值,这些条件值根据设置的选项而不同。为了方便使用,我们提供了一个全面的列表:

PLIST_SUB, SUB_LIST

关于自动生成 %OPT%%%NOOPT%%,请参见 OPTIONS_SUB。 关于更复杂的用法,请参阅通用变量替换、OPT_VARIABLEOPT_VARIABLE_OFF

CONFIGURE_ARGS

关于 --enable-x--disable-x,见 OPT_CONFIGURE_ENABLE

关于 --with-x--without-x,见 OPT_CONFIGURE_WITH

对于所有其他情况,见 OPT_CONFIGURE_ONOPT_CONFIGURE_OFF

CMAKE_ARGS

对于作为布尔的参数(开、关、真、假、0、1),见 OPT_CMAKE_BOOLOPT_CMAKE_BOOL_OFF。 对于所有其他情况,见 OPT_CMAKE_ONOPT_CMAKE_OFF

MESON_ARGS

对于取真或取假的参数,见 OPT_MESON_TRUEOPT_MESON_FALSE

对于采取是或否的参数,使用 OPT_MESON_YESOPT_MESON_NO

关于采取启用或禁用的参数,见 OPT_MESON_ENABLEDOPT_MESON_DISABLED

对于所有其他情况,使用 OPT_MESON_ONOPT_MESON_OFF

QMAKE_ARGS

OPT_QMAKE_ONOPT_QMAKE_OFF

USE_\*

OPT_USEOPT_USE_OFF

*_DEPENDS

参见依赖关系、OPT_DEPTYPEOPT_DEPTYPE_OFF

* (Any variable)

最常用的变量有直接的帮助器,见通用变量替换,OPT_VARIABLEOPT_VARIABLE_OFF

对于任何没有特定帮手的变量,见 OPT_VARSOPT_VARS_OFF

Options dependencies

当一个选项需要另一个选项来工作时,请参阅 OPT_IMPLIES

Options conflicts

当一个选项在另一个选项也被启用的情况下不能工作时,见 OPT_PREVENTSOPT_PREVENTS_MSG

Build targets

当一个选项需要一些额外的处理时,请看额外的构建目标,target-OPT-ontarget-OPT-off

5.14.3.1. OPTIONS_SUB

如果 OPTIONS_SUB 设置为 yes,那么添加到 OPTIONS_DEFINE 中的每个选项都将被添加到 PLIST_SUBSUB_LIST 中,比如说:

OPTIONS_DEFINE=	OPT1
OPTIONS_SUB=	yes

相当于:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
PLIST_SUB+=	OPT1="" NO_OPT1="@comment "
SUB_LIST+=	OPT1="" NO_OPT1="@comment "
.else
PLIST_SUB+=	OPT1="@comment " NO_OPT1=""
SUB_LIST+=	OPT1="@comment " NO_OPT1=""
.endif

注意

OPTIONS_SUB 的值会被忽略。将它设置为任何值都会为所有选项添加 PLIST_SUBSUB_LIST 条目。

5.14.3.2. OPT_USEOPT_USE_OFF

当选项 OPT 被选中时,对于 OPT_USE 中的每个 key=value 对,值会被附加到相应的 USE_KEY 中。如果值中有空格,请用逗号代替,在处理过程中,它们会被改回为空格。OPT_USE_OFF 的工作方式与此相同,但当 OPT 没有被选中时。例如:

options_define= opt1
OPT1_USES= xorg
OPT1_USE= mysql=yes xorg=x11,xextproto,xext,xrandr
OPT1_USE_OFF= openssl=yes

相当于:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
USE_MYSQL=	yes
USES+=		xorg
USE_XORG=	x11 xextproto xext xrandr
.else
USE_OPENSSL=	yes
.endif

5.14.3.3. CONFIGURE_ARGS 帮助者

5.14.3.3.1. OPT_CONFIGURE_ENABLE

当选项 OPT 被选中时,对于 OPT_CONFIGURE_ENABLE 中的每个条目,--enable- 条目被附加到CONFIGURE_ARGS。当没有选择 OPT 选项时,--disable-entry 被附加到 CONFIGURE_ARGS 中。一个可选的参数可以用=符号来指定。这个参数只被附加到 --enable-entry 配置选项中。比如说:

OPTIONS_DEFINE=	OPT1 OPT2
OPT1_CONFIGURE_ENABLE=	test1 test2
OPT2_CONFIGURE_ENABLE=	test2=exhaustive

相当于:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
CONFIGURE_ARGS+=	--enable-test1 --enable-test2
.else
CONFIGURE_ARGS+=	--disable-test1 --disable-test2
.endif

.if ${PORT_OPTIONS:MOPT2}
CONFIGURE_ARGS+=	--enable-test2=exhaustive
.else
CONFIGURE_ARGS+=	--disable-test2
.endif

5.14.3.3.2. OPT_CONFIGURE_WITH

当选项OPT被选中时,对于OPT_CONFIGURE_WITH中的每个条目,--with-entry被附加到CONFIGURE_ARGS。当没有选择OPT选项时,--without-entry被附加到CONFIGURE_ARGS中。可以用=符号来指定一个可选参数。这个参数只被附加到--with-entry configure选项中。例如:

OPTIONS_DEFINE=	OPT1 OPT2
OPT1_CONFIGURE_WITH=	test1
OPT2_CONFIGURE_WITH=	test2=exhaustive

相当于:

OPTIONS_DEFINE=	OPT1 OPT2

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
CONFIGURE_ARGS+=	--with-test1
.else
CONFIGURE_ARGS+=	--without-test1
.endif

.if ${PORT_OPTIONS:MOPT2}
CONFIGURE_ARGS+=	--with-test2=exhaustive
.else
CONFIGURE_ARGS+=	--without-test2
.endif

5.14.3.3.3. OPT_CONFIGURE_ON OPT_CONFIGURE_OFF

当选择选项 OPT 时,OPT_CONFIGURE_ON 的值(如果定义了的话)被附加到 CONFIGURE_ARGSOPT_CONFIGURE_OFF 的作用与此相同,但当 OPT 未被选中时。比如说

OPTIONS_DEFINE=	OPT1
OPT1_CONFIGURE_ON=	--add-test
OPT1_CONFIGURE_OFF=	--no-test

相当于:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
CONFIGURE_ARGS+=	--add-test
.else
CONFIGURE_ARGS+=	--no-test
.endif

技巧

大多数时候,OPT_CONFIGURE_ENABLEOPT_CONFIGURE_WITH 中的帮助器提供了更短、更全面的功能。

5.14.3.4. CMAKE_ARGS 帮助者

5.14.3.4.1. OPT_CMAKE_ON OPT_CMAKE_OFF

当选项 OPT 被选中时,OPT_CMAKE_ON 的值(如果定义了的话)被附加到 CMAKE_ARGS 中。OPT_CMAKE_OFF 的作用与此相同,但当 OPT 未被选中时。比如说

OPTIONS_DEFINE=	OPT1
OPT1_CMAKE_ON=	-DTEST:BOOL=true -DDEBUG:BOOL=true
OPT1_CMAKE_OFF=	-DOPTIMIZE:BOOL=true

相当于:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
CMAKE_ARGS+=	-DTEST:BOOL=true -DDEBUG:BOOL=true
.else
CMAKE_ARGS+=	-DOPTIMIZE:BOOL=true
.endif

技巧

参见 OPT_CMAKE_BOOLOPT_CMAKE_BOOL_OFF,当值为布尔时,有一个更短的帮助器。

5.14.3.4.2. OPT_CMAKE_BOOL OPT_CMAKE_BOOL_OFF

当选项 OPT 被选中时,对于 OPT_CMAKE_BOOL 中的每个条目,-D_entry_:BOOL=true 被附加到 CMAKE_ARGS。当未选择选项 OPT 时,-D_entry_:BOOL=false 被附加到 CONFIGURE_ARGSOPT_CMAKE_BOOL_OFF 则相反,当选项被选中时,-D_entry_:BOOL=false 被追加到 CMAKE_ARGS 中,而当选项未被选中时,-D_entry_:BOOL=true。比如说:

OPTIONS_DEFINE=	OPT1
OPT1_CMAKE_BOOL=	TEST DEBUG
OPT1_CMAKE_BOOL_OFF=	OPTIMIZE

相当于:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
CMAKE_ARGS+=	-DTEST:BOOL=true -DDEBUG:BOOL=true \
		-DOPTIMIZE:BOOL=false
.else
CMAKE_ARGS+=	-DTEST:BOOL=false -DDEBUG:BOOL=false \
		-DOPTIMIZE:BOOL=true
.endif

5.14.3.5. MESON_ARGS 帮助者

5.14.3.5.1. OPT_MESON_ON OPT_MESON_OFF

当选择选项 OPT 时,OPT_MESON_ON 的值(如果定义了的话)被附加到 MESON_ARGS 中。OPT_MESON_OFF 的作用与此相同,但当 OPT 未被选中时。例如:

OPTIONS_DEFINE=	OPT1
OPT1_MESON_ON=	-Dopt=1
OPT1_MESON_OFF=	-Dopt=2

相当于:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
MESON_ARGS+=	-Dopt=1
.else
MESON_ARGS+=	-Dopt=2
.endif

5.14.3.5.2. OPT_MESON_TRUE OPT_MESON_FALSE

当选项 OPT 被选中时,对于 OPT_MESON_TRUE 中的每个条目,-D_entry_=true 被附加到 MESON_ARGS。当未选择选项 OPT 时,-D_entry_=false 被附加到 MESON_ARGSOPT_MESON_FALSE 则相反,当选项被选中时,-D_entry_=false 被附加到 MESON_ARGS,而当选项未被选中时,-D_entry_=true 被附加到 MESON_ARGS。比如说:

OPTIONS_DEFINE=	OPT1
OPT1_MESON_TRUE=	test debug
OPT1_MESON_FALSE=	optimize

相当于:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
MESON_ARGS+=	-Dtest=true -Ddebug=true \
		-Doptimize=false
.else
MESON_ARGS+=	-Dtest=false -Ddebug=false \
		-Doptimize=true
.endif

5.14.3.5.3. OPT_MESON_YES OPT_MESON_NO

当选项 OPT 被选中时,对于 OPT_MESON_YES 中的每个条目,-D_entry_=yes 被附加到 MESON_ARGS。当未选择选项 OPT 时,-D_entry_=no 被附加到 MESON_ARGSOPT_MESON_NO 则相反,当选项被选中时,-D_entry_=no 被附加到 MESON_ARGS,而当选项未被选中时,-D_entry_=yes 被附加到 MESON_ARGS。比如说:

OPTIONS_DEFINE=	OPT1
OPT1_MESON_YES=	test debug
OPT1_MESON_NO=	optimize

相当于:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
MESON_ARGS+=	-Dtest=yes -Ddebug=yes \
		-Doptimize=no
.else
MESON_ARGS+=	-Dtest=no -Ddebug=no \
		-Doptimize=yes
.endif

5.14.3.5.4. OPT_MESON_ENABLED OPT_MESON_DISABLED

当选项 OPT 被选中时,对于 OPT_MESON_ENABLED 中的每个条目,-D_entry_=enabled 被附加到 MESON_ARGS。当未选择选项 OPT 时,-D_entry_=disabled 将被附加到 MESON_ARGSOPT_MESON_DISABLED 则相反,当选项被选中时,-D_entry_=disabled 被附加到 MESON_ARGS,而当选项未被选中时,-D_entry_=enabled 被附加到 MESON_ARGS。比如说:

OPTIONS_DEFINE=	OPT1
OPT1_MESON_ENABLED=	test
OPT1_MESON_DISABLED=	debug

相当于:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
MESON_ARGS+=	-Dtest=enabled -Ddebug=disabled
.else
MESON_ARGS+=	-Dtest=disabled -Ddebug=enabled
.endif

5.14.3.6. OPT_QMAKE_ONOPT_QMAKE_OFF

当选项 OPT 被选中时,OPT_QMAKE_ON 的值(如果定义了的话)被附加到 QMAKE_ARGS 中。OPT_QMAKE_OFF 的作用与此相同,但当 OPT 未被选中时。比如说

OPTIONS_DEFINE=	OPT1
OPT1_QMAKE_ON=	-DTEST:BOOL=true
OPT1_QMAKE_OFF=	-DPRODUCTION:BOOL=true

相当于:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
QMAKE_ARGS+=	-DTEST:BOOL=true
.else
QMAKE_ARGS+=	-DPRODUCTION:BOOL=true
.endif

5.14.3.7. OPT_IMPLIES

提供了一种在选项之间添加依赖关系的方法。

当 OPT 被选中时,这个变量中列出的所有选项也将被选中。用前面描述的 OPT_CONFIGURE_ENABLE 来说明:

OPTIONS_DEFINE=	OPT1 OPT2
OPT1_IMPLIES=	OPT2

OPT1_CONFIGURE_ENABLE=	opt1
OPT2_CONFIGURE_ENABLE=	opt2

相当于:

OPTIONS_DEFINE=	OPT1 OPT2

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
CONFIGURE_ARGS+=	--enable-opt1
.else
CONFIGURE_ARGS+=	--disable-opt1
.endif

.if ${PORT_OPTIONS:MOPT2} || ${PORT_OPTIONS:MOPT1}
CONFIGURE_ARGS+=	--enable-opt2
.else
CONFIGURE_ARGS+=	--disable-opt2
.endif

例48. OPT_IMPLIES的简单使用

这个 Port 有一个 X11 选项, 和一个 GNOME 选项, 需要选择 X11 选项来构建。

OPTIONS_DEFINE=	X11 GNOME
OPTIONS_DEFAULT=	X11

X11_USES=	xorg
X11_USE=	xorg=xi,xextproto
GNOME_USE=	gnome=gtk30
GNOME_IMPLIES=	X11

5.14.3.8. OPT_PREVENTSOPT_PREVENTS_MSG

提供了一种添加选项之间冲突的方法。

当选择 OPT 时,OPT_PREVENTS 中列出的所有选项都必须取消选择。如果设置了 OPT_PREVENTS_MSG,并且触发了冲突,其内容将被显示出来,解释他们冲突的原因。比如说:

OPTIONS_DEFINE=	OPT1 OPT2
OPT1_PREVENTS=	OPT2
OPT1_PREVENTS_MSG=	OPT1 and OPT2 enable conflicting options

大致相当于:

OPTIONS_DEFINE=	OPT1 OPT2

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT2} && ${PORT_OPTIONS:MOPT1}
BROKEN=	Option OPT1 conflicts with OPT2 (select only one)
.endif

唯一的区别是,第一个会在运行 make config 后写一个错误,建议改变所选选项。

例49. OPT_PREVENTS 的简单使用

这个 Port 有 X509 和 SCTP 选项。这两个选项都添加了补丁,但补丁之间相互冲突,所以不能同时选择。

OPTIONS_DEFINE=	X509 SCTP

SCTP_PATCHFILES=	${PORTNAME}-6.8p1-sctp-2573.patch.gz:-p1
SCTP_CONFIGURE_WITH=	sctp

X509_PATCH_SITES=	http://www.roumenpetrov.info/openssh/x509/:x509
X509_PATCHFILES=	${PORTNAME}-7.0p1+x509-8.5.diff.gz:-p1:x509
X509_PREVENTS=		SCTP
X509_PREVENTS_MSG=	X509 and SCTP patches conflict

5.14.3.9. OPT_VARSOPT_VARS_OFF

提供一个通用的方法来设置和追加变量。

警告

在使用 OPT_VARSOPT_VARS_OFF 之前,看看在通用变量替换中是否已经有了更具体的帮助工具, OPT_VARIABLEOPT_VARIABLE_OFF

当选择了 OPT 选项,并且定义了 OPT_VARS,就会从 OPT_VARS 中评估 key=valuekey+=value 对。一个=导致 KEY 的现有值被覆盖,一个 += 附加到该值上。OPT_VARS_OFF 的工作方式与此相同,但当 OPT 未被选中时。

OPTIONS_DEFINE=	OPT1 OPT2 OPT3
OPT1_VARS=	also_build+=bin1
OPT2_VARS=	also_build+=bin2
OPT3_VARS=	bin3_build=yes
OPT3_VARS_OFF=	bin3_build=no

MAKE_ARGS=	ALSO_BUILD="${ALSO_BUILD}" BIN3_BUILD="${BIN3_BUILD}"

相当于:

OPTIONS_DEFINE=	OPT1 OPT2

MAKE_ARGS=	ALSO_BUILD="${ALSO_BUILD}" BIN3_BUILD="${BIN3_BUILD}"

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
ALSO_BUILD+=	bin1
.endif

.if ${PORT_OPTIONS:MOPT2}
ALSO_BUILD+=	bin2
.endif

.if ${PORT_OPTIONS:MOPT2}
BIN3_BUILD=	yes
.else
BIN3_BUILD=	no
.endif

重要

含有空白的值必须用引号括起来:

OPT_VARS=	foo="bar baz"

这是由于 make(1) 变量扩展处理空白的方式造成的。当 OPT_VARS= foo=bar baz 被扩展时,该变量最终包含两个字符串,foo=barbaz。但提交者可能希望只有一个字符串,foo=bar baz。引述该值可以防止空格被用作分隔符。

另外,不要在 var= 符号后和值前添加额外的空格,它也会被分割成两个字符串。这将不会起作用:

OPT_VARS=	foo=	bar

5.14.3.10. 依赖性, OPT_DEPTYPEOPT_DEPTYPE_OFF

对于这些依赖类型中的任何一种:

  • PKG_DEPENDS

  • EXTRACT_DEPENDS

  • PATCH_DEPENDS

  • FETCH_DEPENDS

  • BUILD_DEPENDS

  • LIB_DEPENDS

  • RUN_DEPENDS

当选择选项 OPT 时,OPT_DEPTYPE 的值(如果定义了)会附加到 DEPTYPE 上。OPT_DEPTYPE_OFF 的作用与此相同,但当 OPT 未被选中时。比如说

OPTIONS_DEFINE=	OPT1
OPT1_LIB_DEPENDS=	liba.so:devel/a
OPT1_LIB_DEPENDS_OFF=	libb.so:devel/b

相当于:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
LIB_DEPENDS+=	liba.so:devel/a
.else
LIB_DEPENDS+=	libb.so:devel/b
.endif

5.14.3.11. 通用变量替换, OPT_VARIABLEOPT_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 未被选中时。例如:

OPTIONS_DEFINE=	OPT1
OPT1_USES=	gmake
OPT1_CFLAGS_OFF=	-DTEST

相当于:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
USES+=		gmake
.else
CFLAGS+=	-DTEST
.endif

注意

有些变量不在这个列表中,特别是 PKGNAMEPREFIXPKGNAMESUFFIX。这是故意的。当一个 port 的选项集发生变化时, 它的名字不能改变。

警告

其中一些变量,至少是 ALL_TARGETDISTFILESINSTALL_TARGET,在选项被处理后有其默认值。

Makefile 中加入这几行:

ALL_TARGET=	all

DOCS_ALL_TARGET=	doc

如果启用了 DOCS 选项,ALL_TARGET 的最终值将是所有的 DOC;如果该选项被禁用,它的值将是所有。

Makefile 中只有 options helper 一行:

DOCS_ALL_TARGET=	doc

如果启用了 DOCS 选项,ALL_TARGET 的最终值将是 doc;如果禁用该选项,它的值将是 all

5.14.3.12. 额外的建设目标,目标 -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 未被选中时。比如说

OPTIONS_DEFINE=	OPT1

post-patch-OPT1-on:
	@${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${EXAMPLESDIR}/|' ${WRKSRC}/Makefile

post-patch-OPT1-off:
	@${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${PREFIX}/bin/|' ${WRKSRC}/Makefile

相当于:

OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

post-patch:
.if ${PORT_OPTIONS:MOPT1}
	@${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${EXAMPLESDIR}/|' ${WRKSRC}/Makefile
.else
	@${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${PREFIX}/bin/|' ${WRKSRC}/Makefile
.endif

最后更新于

FreeBSD 中文社区