Meson 文件重写器

从 0.50.0 版本开始,Meson 可以从命令行对 meson.build 文件进行一些基本修改。目前支持的操作包括

  • 对于构建目标
    • 添加/删除源文件
    • 添加/删除目标
    • 修改选定的关键字参数集合
    • 打印一些 JSON 信息
  • 对于依赖项
    • 修改选定的关键字参数集合
  • 对于 project 函数
    • 修改选定的关键字参数集合
    • 修改默认选项列表

重写器既有正常的命令行界面,也有“脚本模式”。正常的 CLI 主要用于日常使用。“脚本模式”则用于外部程序(IDE、图形前端等)。

重写器本身被认为是稳定的,但用户界面和“脚本模式”API 可能会在未来发生变化。这些变化也可能破坏与旧版本的向后兼容性。

我们也欢迎 API 改进建议。

使用重写器

所有重写器函数都通过 meson rewrite 访问。Meson 重写器假定它是在项目根目录中运行的。如果不是这种情况,请使用 --sourcedir 指定实际的项目源目录。

添加和删除源代码

最常见的操作可能是向构建目标添加和删除源文件。这可以通过以下方式轻松完成:

meson rewrite target <target name/id> {add/rm} [list of sources]

例如,给定以下示例

src = ['main.cpp', 'fileA.cpp']

exe1 = executable('testExe', src)

源文件 fileB.cpp 可以通过以下方式添加:

meson rewrite target testExe add fileB.cpp

执行此命令后,新的 meson.build 将如下所示:

src = ['main.cpp', 'fileA.cpp', 'fileB.cpp']

exe1 = executable('testExe', src)

在这种情况下,exe1 也可用于目标名称。这是因为重写器还会搜索赋值和唯一的 Meson ID,这些 ID 可以通过自省获取。如果有多个目标具有相同的名称,Meson 将不会执行任何操作并打印一条错误消息。

有关更多信息,请参阅重写器目标命令的帮助输出。

添加和删除 extra_files

从 0.61.0 版本开始

与向目标添加和删除源文件的方式相同,您可以修改目标的 extra_files 列表

meson rewrite target <target name/id> {add_extra_files/rm_extra_files} [list of extra files]

设置项目版本

也可以使用重写器设置特定函数的关键字参数。设置或删除关键字参数的通用命令为

meson rewrite kwargs {set/delete} <function type> <function ID> <key1> <value1> <key2> <value2> ...

例如,可以使用以下命令设置项目版本:

meson rewrite kwargs set project / version 1.0.0

目前,仅支持以下函数类型

  • dependency
  • target(任何构建目标,函数 ID 为目标名称/ID)
  • project(函数 ID 必须为 /,因为 project() 只能调用一次)

有关更多信息,请参阅 rewrite kwargs 命令的帮助输出。

请注意,msys bash 可能会将 / 展开为路径。传递 // 将被 msys bash 转换为 /,但为了保持使用 shell 无关,rewrite 命令也允许使用 // 作为函数 ID,这样它就可以在 msys bash 和其他 shell 中使用。

设置项目默认选项

要设置和删除默认选项,请使用以下命令:

meson rewrite default-options {set/delete} <opt1> <value1> <opt2> <value2> ...

限制

重写 Meson 文件不能保证保留修改函数的缩进。此外,修改语句中的注释将被删除。此外,所有源文件都将按字母顺序排序。

例如,在以下代码中将 e.c 添加到 srcs

# Important comment

srcs = [
'a.c', 'c.c', 'f.c',
# something important about b
       'b.c', 'd.c', 'g.c'
]

# COMMENT

将导致以下代码

# Important comment

srcs = [
  'a.c',
  'b.c',
  'c.c',
  'd.c',
  'e.c',
  'f.c',
  'g.c'
]

# COMMENT

使用“脚本模式”

“脚本模式”应该是第三方程序的首选 API,因为它提供了更大的灵活性以及更高的 API 稳定性。“脚本”存储在 JSON 格式中,并使用 meson rewrite command <JSON 文件或字符串> 执行。

JSON 格式定义如下

[
  {
    "type": "function to execute",
    ...
  }, {
    "type": "other function",
    ...
  },
  ...
]

主数组中的每个对象都必须包含一个 type 条目,该条目指定应执行哪个函数。

目前,支持以下函数

  • target
  • kwargs
  • default_options

目标修改格式

类型 target 的格式定义如下

{
  "type": "target",
  "target": "target ID/name/assignment variable",
  "operation": "one of ['src_add', 'src_rm', 'target_rm', 'target_add', 'extra_files_add', 'extra_files_rm', 'info']",
  "sources": ["list", "of", "source", "files", "to", "add, remove"],
  "subdir": "subdir where the new target should be added (only has an effect for operation 'tgt_add')",
  "target_type": "function name of the new target -- same as in the CLI (only has an effect for operation 'tgt_add')"
}

sourcessubdirtarget_type 是可选的。

关键字参数修改格式

类型 target 的格式定义如下

{
  "type": "kwargs",
  "function": "one of ['dependency', 'target', 'project']",
  "id": "function ID",
  "operation": "one of ['set', 'delete', 'add', 'remove', 'remove_regex', 'info']",
  "kwargs": {
    "key1": "value1",
    "key2": "value2",
    ...
  }
}

默认选项修改格式

类型 default_options 的格式定义如下

{
  "type": "default_options",
  "operation": "one of ['set', 'delete']",
  "options": {
    "opt1": "value1",
    "opt2": "value2",
    ...
  }
}

对于操作 deleteoptions 的值可以是任何东西(包括 null

提取信息

重写器还为 targetkwargs 类型提供 info 操作。使用此操作时,Meson 将向 stderr 打印一个 JSON 转储,其中包含有关重写器所关注的构建目标/函数关键字参数的所有可用信息。

输出格式目前处于试验阶段,将来可能会发生变化。

搜索结果为