构建选项

大多数非平凡的构建都需要用户设置的选项。例如,一个程序可能有两个不同的数据后端,可以在构建时选择。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 值来描述选项,如果没有设置描述,则将使用选项的名称。

字符串

字符串类型是自由格式字符串。如果未设置默认值,则将使用空字符串作为默认值。

布尔值

布尔值可以是 truefalse。如果没有提供默认值,则将使用 true 作为默认值。

组合

组合允许选择 choices 参数中的任何一个值。如果没有设置默认值,则第一个值将是默认值。

整数

整数选项包含单个整数,并具有可选的上限和下限值,这些值通过 minmax 关键字参数指定。

此类型从 Meson 版本 0.45.0 开始可用。

数组

数组表示字符串数组。默认情况下,数组可以包含任意字符串。要限制可以使用值的范围,请设置 choices 参数。Meson 随后将仅允许值数组包含给定列表中的字符串。数组可以为空。value 参数指定选项的默认值,如果未设置,则将使用 choices 的值作为默认值。

从 0.47.0 开始 -Dopt= 和 -Dopt=[] 都传递一个空列表,在此之前 -Dopt= 会传递一个包含空字符串的列表。

此类型从版本 0.44.0 开始可用。

功能

feature 选项有三种状态:enableddisabledauto。它旨在作为大多数函数的 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

将把值设置为包含两个元素的数组:foobar

如果您的字符串值需要包含逗号,则需要使用适当的 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 使用的链接进程数。

搜索结果为