构建选项
大多数非平凡的构建都需要用户设置的选项。例如,一个程序可能有两个不同的数据后端,可以在构建时选择。Meson 通过提供一个选项定义文件来实现这一点。它的名称是 meson.options
,它位于源代码树的根目录下。对于 1.1 之前的 Meson 版本,此文件名为 meson_options.txt
。
这是一个简单的选项文件。
option('someoption', type : 'string', value : 'optval', description : 'An option')
option('other_one', type : 'boolean', value : false)
option('combo_opt', type : 'combo', choices : ['one', 'two', 'three'], value : 'three')
option('integer_opt', type : 'integer', min : 0, max : 5, value : 3) # Since 0.45.0
option('free_array_opt', type : 'array', value : ['one', 'two']) # Since 0.44.0
option('array_opt', type : 'array', choices : ['one', 'two', 'three'], value : ['one', 'two'])
option('some_feature', type : 'feature', value : 'enabled') # Since 0.47.0
option('long_desc', type : 'string', value : 'optval',
description : 'An option with a very long description' +
'that does something in a specific context') # Since 0.55.0
有关内置选项,请参阅 内置选项。
构建选项类型
所有类型都允许设置一个 description
值来描述选项,如果没有设置描述,则将使用选项的名称。
字符串
字符串类型是自由格式字符串。如果未设置默认值,则将使用空字符串作为默认值。
布尔值
布尔值可以是 true
或 false
。如果没有提供默认值,则将使用 true
作为默认值。
组合
组合允许选择 choices
参数中的任何一个值。如果没有设置默认值,则第一个值将是默认值。
整数
整数选项包含单个整数,并具有可选的上限和下限值,这些值通过 min
和 max
关键字参数指定。
此类型从 Meson 版本 0.45.0 开始可用。
数组
数组表示字符串数组。默认情况下,数组可以包含任意字符串。要限制可以使用值的范围,请设置 choices
参数。Meson 随后将仅允许值数组包含给定列表中的字符串。数组可以为空。value
参数指定选项的默认值,如果未设置,则将使用 choices
的值作为默认值。
从 0.47.0 开始 -Dopt= 和 -Dopt=[] 都传递一个空列表,在此之前 -Dopt= 会传递一个包含空字符串的列表。
此类型从版本 0.44.0 开始可用。
功能
feature
选项有三种状态:enabled
、disabled
或 auto
。它旨在作为大多数函数的 required
关键字参数的值传递。当前在 add_languages()
、compiler.find_library()
、compiler.has_header()
、dependency()
、find_program()
、import()
和 subproject()
函数中支持。
-
enabled
与传递required : true
相同。 -
auto
与传递required : false
相同。 -
disabled
不查找依赖项,并且始终返回“未找到”。
使用 get_option()
获取此类型选项的值时,会返回一个特殊的 feature
对象,而不是选项值的字符串表示形式。此对象可以传递给 required
d = dependency('foo', required : get_option('myfeature'))
if d.found()
app = executable('myapp', 'main.c', dependencies : [d])
endif
要检查特征的值,该对象有三个方法返回布尔值,并且不接受任何参数
.enabled()
.disabled()
.auto()
这对依赖特征的自定义代码很有用
if get_option('myfeature').enabled()
# ...
endif
如果 feature
选项的值设置为 auto
,则该值会被全局 auto_features
选项(默认为 auto
)覆盖。这旨在供打包程序使用,他们希望完全控制哪些依赖项是必需的,哪些是被禁用的,并且不依赖于构建依赖项(在正确的版本中)来启用功能。如果需要,他们可以设置 auto_features=enabled
来启用所有功能,并仅显式禁用他们不希望启用的功能。
此类型从版本 0.47.0 开始可用。
已弃用的选项
从 0.60.0 开始
项目选项可以标记为已弃用,Meson 会在用户设置其值时发出警告。也可以仅弃用某些选择,并将已弃用的值映射到新值。
# Option fully deprecated, it warns when any value is set.
option('o1', type: 'boolean', deprecated: true)
# One of the choices is deprecated, it warns only when 'a' is in the list of values.
option('o2', type: 'array', choices: ['a', 'b'], deprecated: ['a'])
# One of the choices is deprecated, it warns only when 'a' is in the list of values
# and replace it by 'c'.
option('o3', type: 'array', choices: ['a', 'b', 'c'], deprecated: {'a': 'c'})
# A boolean option has been replaced by a feature, old true/false values are remapped.
option('o4', type: 'feature', deprecated: {'true': 'enabled', 'false': 'disabled'})
# A feature option has been replaced by a boolean, enabled/disabled/auto values are remapped.
option('o5', type: 'boolean', deprecated: {'enabled': 'true', 'disabled': 'false', 'auto': 'false'})
从 0.63.0 开始,deprecated
关键字参数可以采用替换此选项的新选项的名称。在这种情况下,在已弃用选项上设置值将在旧的和新的名称上都设置值,假设它们接受相同的值。
# A boolean option has been replaced by a feature with another name, old true/false values
# are accepted by the new option for backward compatibility.
option('o6', type: 'boolean', value: 'true', deprecated: 'o7')
option('o7', type: 'feature', value: 'enabled', deprecated: {'true': 'enabled', 'false': 'disabled'})
# A project option is replaced by a module option
option('o8', type: 'string', value: '', deprecated: 'python.platlibdir')
使用构建选项
optval = get_option('opt_name')
此函数还允许您查询 Meson 内置项目选项的值。例如,要获取安装前缀,您将发出以下命令
prefix = get_option('prefix')
需要注意的是,您不能在 Meson 脚本中设置选项值。它们必须使用 meson configure
命令行工具从外部设置。在构建目录中不带参数运行 meson configure
会显示您可以设置的所有选项。
要更改其值,请使用 -D
选项
$ meson configure -Doption=newvalue
设置数组的值有点特殊。如果您只传递一个字符串,则它被认为包含用逗号分隔的所有值。因此,执行以下命令
$ meson configure -Darray_opt=foo,bar
将把值设置为包含两个元素的数组:foo
和 bar
。
如果您的字符串值需要包含逗号,则需要使用适当的 shell 引号传递该值,如下所示
$ meson configure "-Doption=['a,b', 'c,d']"
内部值必须始终是单引号,外部值必须是双引号。
要更改子项目中的值,请在子项目名称和冒号前添加前缀
$ meson configure -Dsubproject:option=newvalue
注意:如果您无法调用 meson configure
,则可能是您的 Meson 版本过旧。在这种情况下,您可以改为调用 mesonconf
,但这在较新版本中已弃用
向超级项目选项让步
假设您有一个主项目和一个子项目。在某些情况下,使用在两者中具有相同值的选项可能很有用。这可以通过 yield
关键字实现。假设您有一个这样的选项定义
option('some_option', type : 'string', value : 'value', yield : true)
如果您单独构建此项目,则此选项的行为与平常一样。但是,如果您将此项目作为另一个项目的子项目构建,而另一个项目也有一个名为 some_option
的选项,则调用 get_option
将返回超级项目的值。如果 yield
的值为 false
,则 get_option
将返回子项目选项的值。
内置构建选项
有很多 内置选项。要获取当前列表,请在构建目录中执行 meson configure
。
Visual Studio
启动项目
backend_startup_project
选项可以设置为定义将在 Visual Studio 中使用“开始调试 F5”操作执行的默认项目。它应该与可执行目标名称相同。
project('my_project', 'c', default_options: ['backend_startup_project=my_exe'])
executable('my_exe', ...)
Ninja
最大链接数
backend_max_links
可以设置为限制 Ninja 使用的链接进程数。
搜索结果为