交叉和原生文件引用
交叉和原生文件几乎相同,但并非完全相同。 这是两者通用值的文档,有关两者中特定值的详细信息,请参阅 交叉编译 和 原生环境。
从 0.56.0 开始更改 部分内的键现在区分大小写。 这是为了使项目选项正常工作所必需的。
数据类型
机器文件中存在四种基本数据类型
- 字符串
- 数组
- 布尔值
- 整数
字符串用单引号指定
[section]
option1 = 'false'
option2 = '2'
数组用方括号括起来,必须包含字符串或布尔值
[section]
option = ['value']
布尔值必须为 true
或 false
,且不带引号。
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.exe
或 lld-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 是否应从机器文件中的其他部分(binaries
、host_machine
等)自动生成默认工具链变量。 默认值始终被[cmake]
部分中设置的变量覆盖。 默认值为true
。(从 0.56.0 开始新增) -
cmake_skip_compiler_test
是一个枚举,指定 Meson 应在何时自动生成工具链变量以跳过 CMake 编译器健全性检查。 这仅在cmake_defaults
为true
时有效。 支持的值为always
、never
、dep_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_library
和 werror
。 优先级顺序为
- 命令行
- 机器文件
- 构建系统定义
[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.ini
,second.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 个原生文件来表达。
搜索结果为