交叉和原生文件引用

交叉和原生文件几乎相同,但并非完全相同。 这是两者通用值的文档,有关两者中特定值的详细信息,请参阅 交叉编译原生环境

从 0.56.0 开始更改 部分内的键现在区分大小写。 这是为了使项目选项正常工作所必需的。

数据类型

机器文件中存在四种基本数据类型

  • 字符串
  • 数组
  • 布尔值
  • 整数

字符串用单引号指定

[section]
option1 = 'false'
option2 = '2'

数组用方括号括起来,必须包含字符串或布尔值

[section]
option = ['value']

布尔值必须为 truefalse,且不带引号。

option = false

整数必须是不带引号的数字常量。

option = 42

部分

允许以下部分

  • 常量
  • 二进制文件
  • 路径
  • 属性
  • cmake
  • 项目选项
  • 内置选项

常量

从 0.56.0 开始

使用 + 运算符支持字符串和列表连接,使用 / 运算符支持连接路径。 在 [constants] 部分中定义的条目可以在任何其他部分中使用(它们始终首先解析),任何其他部分中的条目只能在该部分本身内且仅在定义后才能使用。

[constants]
toolchain = '/toolchain'
common_flags = ['--sysroot=' + toolchain / 'sysroot']

[properties]
c_args = common_flags + ['-DSOMETHING']
cpp_args = c_args + ['-DSOMETHING_ELSE']

[binaries]
c = toolchain / 'gcc'

这在交叉文件组合中也很有用。 可以用一个平台特定的文件组合一个通用的交叉文件,在该文件中定义常量

# aarch64.ini
[constants]
arch = 'aarch64-linux-gnu'
# cross.ini
[binaries]
c = arch + '-gcc'
cpp = arch + '-g++'
strip = arch + '-strip'
pkg-config = arch + '-pkg-config'
...

这可以用作 meson setup --cross-file aarch64.ini --cross-file cross.ini builddir

请注意,文件组合发生在解析值之前。 下面的示例导致 b'HelloWorld'

# file1.ini:
[constants]
a = 'Foo'
b = a + 'World'
#file2.ini:
[constants]
a = 'Hello'

下面的示例在 file1.ini 在 file2.ini 之前包含时会导致错误,因为 b 将在 a 之前定义

# file1.ini:
[constants]
b = a + 'World'
#file2.ini:
[constants]
a = 'Hello'

从 1.3.0 开始 解析机器文件之前,某些标记会被替换

  • @GLOBAL_SOURCE_ROOT@:项目源树的绝对路径
  • @DIRNAME@:机器文件的父目录的绝对路径。

例如,它可以用于将路径设置为相对于源目录或相对于工具链的安装目录。

[binaries]
c = '@DIRNAME@/toolchain/gcc'
exe_wrapper = '@GLOBAL_SOURCE_ROOT@' / 'build-aux' / 'my-exe-wrapper.sh'

二进制文件

二进制文件部分包含一个二进制文件列表。 这些可以在 Meson 内部使用,也可以由 find_program 函数使用。

这些值必须是字符串或字符串数组

编译器和链接器在此处使用 <lang><lang>_ld 定义。 <lang>_ld 是特殊的,因为它特定于编译器。 对于像 gcc 和 clang 这样的编译器,这些编译器用于调用链接器,这是一个传递给其“选择链接器”参数的值(在本例中为 -fuse-ld=)。 对于像 MSVC 和 Clang-Cl 这样的编译器,这是 Meson 要调用的链接器的路径,例如 link.exelld-link.exe。 对 ld 的支持是 从 0.53.0 开始的新增功能

从 0.53.1 开始更改 ld 变量被 <lang>_ld 替换,因为它使大量项目出现回归。 在 0.53.0 中,使用了 ld 变量。

原生示例

c = '/usr/bin/clang'
c_ld = 'lld'
sed = 'C:\\program files\\gnu\\sed.exe'
llvm-config = '/usr/lib/llvm8/bin/llvm-config'

交叉示例

c = ['ccache', '/usr/bin/i586-mingw32msvc-gcc']
cpp = ['ccache', '/usr/bin/i586-mingw32msvc-g++']
c_ld = 'gold'
cpp_ld = 'gold'
ar = '/usr/i586-mingw32msvc/bin/ar'
strip = '/usr/i586-mingw32msvc/bin/strip'
pkg-config = '/usr/bin/i586-mingw32msvc-pkg-config'

此处可以覆盖的内部使用程序的不完整列表是

  • cmake
  • cups-config
  • gnustep-config
  • gpgme-config
  • libgcrypt-config
  • libwmf-config
  • llvm-config
  • pcap-config
  • pkg-config
  • sdl2-config
  • wx-config(或 wx-3.0-config 或 wx-config-gtk)

路径和目录

从 0.56.0 开始弃用 使用内置部分。

从 0.50.0 开始,libdir 等路径和目录可以在原生文件和交叉文件中定义在 paths 部分中。 这些应该是字符串。

[paths]
libdir = 'mylibdir'
prefix = '/my prefix'

这些值仅在不进行交叉编译时加载。 命令行上的任何参数都将覆盖原生文件中的任何选项。 例如,传递 --libdir=otherlibdir 将导致前缀为 /my prefix 且 libdir 为 otherlibdir

属性

从 0.54.0 开始在原生文件中新增,始终在交叉文件中新增。

除了可以在交叉文件中指定的特殊数据之外,此部分可能包含使用 meson.get_external_property()meson.get_cross_property() 访问的随机键值对。

从 0.56.0 开始更改<lang>_args<lang>_link_args 放入 properties 部分已被弃用,应将其放入内置选项部分。

支持的属性

这是 [properties] 部分中支持变量的非详尽列表。

  • cmake_toolchain_file 指定现有 CMake 工具链文件的绝对路径,该文件将使用 include() 作为 Meson 自动生成的 CMake 工具链文件的最后一条指令加载。(从 0.56.0 开始新增
  • cmake_defaults 是一个布尔值,指定 Meson 是否应从机器文件中的其他部分(binarieshost_machine 等)自动生成默认工具链变量。 默认值始终被 [cmake] 部分中设置的变量覆盖。 默认值为 true。(从 0.56.0 开始新增
  • cmake_skip_compiler_test 是一个枚举,指定 Meson 应在何时自动生成工具链变量以跳过 CMake 编译器健全性检查。 这仅在 cmake_defaultstrue 时有效。 支持的值为 alwaysneverdep_only。 默认值为 dep_only。(从 0.56.0 开始新增
  • cmake_use_exe_wrapper 是一个布尔值,控制是否使用 [binaries] 中指定的 exe_wrapper 在 CMake 子项目中运行生成的可执行文件。 如果未指定 exe_wrapper,则此设置无效。 默认值为 true。(从 0.56.0 开始新增
  • java_home 是一个指向 Java 安装根目录的绝对路径。
  • bindgen_clang_arguments 是一个在调用 bindgen 时传递给 clang 的额外参数数组

CMake 变量

从 0.56.0 开始新增

[cmake] 部分中设置的所有变量都将添加到用于 CMake 依赖项和 CMake 子项目的生成 CMake 工具链文件中。 每个条目的类型必须是字符串或字符串列表。

注意:所有键值中 \ 的所有出现都将被替换为 /,因为 CMake 在处理变量时(即使在 CMAKE_C_COMPILER 中的路径正确转义的情况下,CMake 也会在内部出错,例如)对正确转义 \ 有很多问题

      A custom toolchain file should be used (via the `cmake_toolchain_file`
      property) if `\` support is required.
[cmake]

CMAKE_C_COMPILER    = '/usr/bin/gcc'
CMAKE_CXX_COMPILER  = 'C:\\usr\\bin\\g++'
CMAKE_SOME_VARIABLE = ['some', 'value with spaces']

例如,上面的 [cmake] 部分将在 CMake 工具链文件中生成以下代码

set(CMAKE_C_COMPILER    "/usr/bin/gcc")
set(CMAKE_CXX_COMPILER  "C:/usr/bin/g++")
set(CMAKE_SOME_VARIABLE "some" "value with spaces")

项目特定选项

从 0.56.0 开始新增

不允许使用路径选项,必须在 [paths] 部分中设置这些选项。

可以通过使用特定文件的 [project options] 部分来设置交叉文件或原生文件中的项目特定选项(如果进行交叉构建,则来自原生文件的选项将被忽略)

要设置子项目中的选项,请改用 [<subproject>:project options] 部分。

[project options]
build-tests = true

[zlib:project options]
build-tests = false

Meson 内置选项

在 0.56.0 之前,<lang>_args<lang>_link_args 必须放在 properties 部分中,否则将被忽略。

可以使用相同的方式设置 Meson 内置选项

[built-in options]
c_std = 'c99'

可以在每个子项目的基础上设置一些 Meson 内置选项,例如 default_librarywerror。 优先级顺序为

  1. 命令行
  2. 机器文件
  3. 构建系统定义
[zlib:built-in options]
default_library = 'static'
werror = false

在每个子项目的基础上设置的选项将从父级继承选项,如果父级有设置而子项目没有,即使在 Meson 语言中设置了默认值时也是如此。

[built-in options]
default_library = 'static'

将使子项目使用 default_library 作为静态库。

某些选项可以在每个机器的基础上设置(换句话说,构建机器的值可以与交叉编译中的主机机器不同)。 在这些情况下,将使用来自交叉文件和原生文件的值。

选项的不完整列表是

  • pkg_config_path
  • cmake_prefix_path

加载多个机器文件

原生文件允许分层(交叉文件从 Meson 0.52.0 开始可以分层)。 可以加载多个文件,前一个文件的值将被下一个文件的值覆盖。 这样做的目的是不是覆盖,而是允许组合文件。 此组合是通过多次传递命令行参数来完成的

meson setup builddir/ --cross-file first.ini --cross-file second.ini --cross-file third.ini

在本例中,将加载 first.ini,然后加载 second.inisecond.ini 中的值将替换 first.ini 中的值,依此类推。

例如,如果有一个项目使用 C 和 C++、python 3.4-3.7 以及 LLVM 5-7,并且需要使用 clang 5、6 和 7 以及 gcc 5.x、6.x 和 7.x 构建; 在整体配置中表达所有这些配置将导致 81 个不同的原生文件。 通过分层它们,可以通过仅使用 12 个原生文件来表达。

搜索结果为