5.14.Makefile 参数

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

5.14.1. OPTIONS

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_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 不够详细,请进行覆盖。

OPTIONS 可以作为单选项,每组只允许选择一个选项:

OPTIONS_SINGLE=		SG1
OPTIONS_SINGLE_SG1=	OPT3 OPT4

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 之前。只能在包含 bsd.port.options.mk 之后测试 PORT_OPTIONS 的值。也可以使用包含 bsd.port.pre.mk,并且在引入 bsd.port.options.mk 之前编写的 ports 中仍然广泛使用。但请注意,在包含 bsd.port.pre.mk 之后,一些变量将无法像预期的那样工作,通常是一些 USE_* 标志。

例 39。 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>

例 40。检查未设置Port OPTIONS

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

上面显示的形式不鼓励使用。首选方法是使用配置开关来真正启用和禁用该功能以匹配该选项。

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

示例 41. 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 协议支持。

5.14.2. 功能自动激活

当使用 GNU 配置脚本时,请留意自动检测激活的可选功能。通过在 CONFIGURE_ARGS 中添加 --without-xxx 或 --disable-xxx 来明确禁用不需要的可选功能。

例 42. 选项处理错误

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

在上面的例子中,假设系统上已安装了一个名为 libfoo 的库。用户不希望该应用程序使用 libfoo,因此在 make config 对话框中关闭了该选项。但是,应用程序的配置脚本检测到系统中存在该库,并在生成的可执行文件中包含其支持。现在,当用户决定从系统中删除 libfoo 时,ports 系统没有发出警告(对 libfoo 的依赖未被记录),但应用程序却会崩溃。

示例 43. 正确处理选项

FOO_LIB_DEPENDS=		libfoo.so:devel/foo
# Will add --enable-foo / --disable-foo
FOO_CONFIGURE_ENABLE=	foo
.if !empty(VARIABLE:MVALUE)

作为另一种选择

.if ${VARIABLE:MVALUE}

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 。

对于布尔参数( on , off , true , false , 0 , 1 ),请参阅 OPT_CMAKE_BOOL 和 OPT_CMAKE_BOOL_OFF 。

对于所有其他情况,请参阅 OPT_CMAKE_ON 和 OPT_CMAKE_OFF 。

MESON_ARGS

对于接受 true 或 false 的参数,请参阅 OPT_MESON_TRUE 和 OPT_MESON_FALSE 。

对于接受 yes 或 no 的参数,请使用 OPT_MESON_YES 和 OPT_MESON_NO 。

对于接受 enabled 或 disabled 的参数,请参见 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 设置为 yes ,那么添加到 OPTIONS_DEFINE 的每个选项将添加到 PLIST_SUB 和 SUB_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

5.14.3.2. OPT_USE 和 OPT_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-entry 追加到 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 配置选项。例如:

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_ARGS 上。 OPT_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

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

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_ARGS 。 OPT_CMAKE_BOOL_OFF 是相反的,当选中该选项时,将 -D_entry_:BOOL=false 附加到 CMAKE_ARGS ,当未选中该选项时,将 -D_entry_:BOOL=true 附加到 CMAKE_ARGS 。例如:

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_ARGS 。 OPT_MESON_FALSE 是相反的,当选择该选项时,将 -D_entry_=false 附加到 MESON_ARGS ,未选择该选项时附加到 -D_entry_=true 。例如:

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_ARGS 中。 OPT_MESON_NO 则相反,选项选择时追加 -D_entry_=no 到 MESON_ARGS ,未选择选项时追加 -D_entry_=yes 。例如:

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_ARGS 中。 OPT_MESON_DISABLED 是相反的,当选择该选项时, -D_entry_=disabled 被追加到 MESON_ARGS 中,当未选择该选项时,追加 -D_entry_=enabled 。例如:

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_ON 和 OPT_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

示例 44. OPT_IMPLIES 的简单用法

此 port 具有 X11 选项,并且需要选择 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_PREVENTS 和 OPT_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 后写入错误,建议更改选定的选项。

示例 45。 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_VARS 和 OPT_VARS_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=bar 和 baz 。但提交者可能本意只想要一个字符串, foo=bar baz 。引用该值可以防止空格被用作分隔符。

另外,不要在 var= 符号后和值前添加额外的空格,否则它也会被分割为两个字符串。这样是行不通的:

OPT_VARS=	foo=	bar

5.14.3.10. 依赖项, 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 时。例如:

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_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 时。例如:

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
ALL_TARGET=	all

DOCS_ALL_TARGET=	doc

如果 DOCS 选项已启用,则 ALL_TARGET 的最终值为 all doc ;如果该选项已禁用,则其值为 all 。

仅使用 Makefile 中的选项辅助行:

DOCS_ALL_TARGET=	doc

如果 DOCS 选项已启用,则 ALL_TARGET 的最终值为 doc ;如果该选项已禁用,则其值为 all 。

5.14.3.12. 额外构建目标, target-OPT-on 和 target-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 中文社区 2024