MesonToolchain¶
重要
此类将生成仅与 Meson 版本 >= 0.55.0 兼容的文件
MesonToolchain 是 Meson 的工具链生成器,可以在 generate() 方法中使用,如下所示:
from conan import ConanFile
from conan.tools.meson import MesonToolchain
class App(ConanFile):
settings = "os", "arch", "compiler", "build_type"
requires = "hello/0.1"
options = {"shared": [True, False]}
default_options = {"shared": False}
def generate(self):
tc = MesonToolchain(self)
tc.preprocessor_definitions["MYDEFINE"] = "MYDEF_VALUE"
tc.generate()
重要
当您的配方有依赖项时,MesonToolchain 仅与 PkgConfigDeps 生成器一起使用。请不要使用其他生成器,因为它们可能会有重叠的定义并发生冲突。
生成的文件¶
MesonToolchain 在 generate() 方法中提供的信息以及从当前 settings、conf 等翻译的信息,在执行 conan install(或在缓存中构建包时)后生成以下文件:
conan_meson_native.ini:如果执行原生构建。
conan_meson_cross.ini:如果执行交叉构建(conan.tools.build)。
conan_meson_native.ini¶
此文件包含与当前包、平台等相关的 Conan 选项和设置的所有 Meson 属性的定义。这包括但不限于以下内容:
从 Conan 设置检测
default_library。基于名为
shared的选项的存在/值。
从 Conan 设置检测
buildtype。根据需要定义 C++ 标准。
Visual Studio 运行时(
b_vscrt),从 Conan 输入设置获取。
conan_meson_cross.ini¶
此文件包含与之前的 conan_meson_native.ini 相同的信息,但增加了描述主机、目标和构建机器(如处理器架构)的额外信息。
有关原生文件和交叉文件的更多详细信息,请参阅 meson 文档
默认目录¶
MesonToolchain 管理 Meson 使用的一些目录。这些是 conan_meson_native.ini 和 conan_meson_cross.ini 文件 [project options] 部分下声明的变量(有关 Meson 目录 的更多信息)。
bindir:值来自 self.cpp.package.bindirs。默认为 None。sbindir:值来自 self.cpp.package.bindirs。默认为 None。libexecdir:值来自 self.cpp.package.bindirs。默认为 None。datadir:值来自 self.cpp.package.resdirs。默认为 None。localedir:值来自 self.cpp.package.resdirs。默认为 None。mandir:值来自 self.cpp.package.resdirs。默认为 None。infodir:值来自 self.cpp.package.resdirs。默认为 None。includedir:值来自 self.cpp.package.includedirs。默认为 None。libdir:值来自 self.cpp.package.libdirs。默认为 None。
请注意,它需要一个 layout 才能初始化这些 self.cpp.package.xxxxx 变量。例如:
from conan import ConanFile
from conan.tools.meson import MesonToolchain
class App(ConanFile):
settings = "os", "arch", "compiler", "build_type"
def layout(self):
self.folders.build = "build"
self.cpp.package.resdirs = ["res"]
def generate(self):
tc = MesonToolchain(self)
self.output.info(tc.project_options["datadir"]) # Will print '["res"]'
tc.generate()
注意
所有值仅在它们具有任何值时才会被保存。如果值为``None``,则它们不会在 [project options] 部分中提及。
自定义¶
属性¶
project_options¶
此属性允许定义 Meson 项目选项。
def generate(self):
tc = MesonToolchain(self)
tc.project_options["MYVAR"] = "MyValue"
tc.generate()
这被翻译为:
在
conan_meson_native.ini或conan_meson_cross.ini文件中为MYVAR定义一个项目选项。
默认情况下,wrap_mode: nofallback 被定义为一个项目选项,以确保依赖项能在 Conan 包中找到。可以通过以下方式更改或删除它:
def generate(self):
tc = MesonToolchain(self)
tc.project_options.pop("wrap_mode")
tc.generate()
请注意,在这种情况下,Meson 可能会在“wraps”中找到依赖项,用户有责任检查行为并确保依赖项的来源。
subproject_options¶
此属性允许定义 Meson 子项目选项。
def generate(self):
tc = MesonToolchain(self)
tc.subproject_options["SUBPROJECT"] = [{'MYVAR': 'MyValue'}]
tc.generate()
这被翻译为:
在
conan_meson_native.ini或conan_meson_cross.ini文件中为SUBPROJECT定义一个子项目和选项。
请注意,与 project_options 不同,subproject_options 是一个字典列表的字典。这是因为 Meson 允许有多个子项目,并且每个子项目可以有多个选项。
preprocessor_definitions¶
此属性允许为多个配置(Debug、Release 等)定义预处理器定义。
def generate(self):
tc = MesonToolchain(self)
tc.preprocessor_definitions["MYDEF"] = "MyValue"
tc.generate()
这被翻译为:
在
conan_meson_native.ini或conan_meson_cross.ini文件中为MYDEF定义一个预处理器定义。
conf¶
MesonToolchain 受以下 [conf] 变量的影响:
tools.meson.mesontoolchain:backend。要使用的 Meson 后端。可能的值:ninja、vs、vs2010、vs2015、vs2017、vs2019、xcode。tools.apple:sdk_pathApple 交叉编译时的 SDK 路径参数。它用作-isysroot标志的值。tools.android:ndk_pathAndroid 交叉编译时的 NDK 路径参数。它用于获取conan_meson_cross.ini的[binaries]部分使用的一些二进制文件,例如c、cpp和ar。tools.build:cxxflags额外的 C++ 标志列表,用于cpp_args。tools.build:cflags额外的纯 C 标志列表,用于c_args。tools.build:sharedlinkflags额外的链接器标志列表,用于c_link_args和cpp_link_args。tools.build:exelinkflags额外的链接器标志列表,用于c_link_args和cpp_link_args。tools.build:linker_scripts链接器脚本列表,每个脚本都将以-T为前缀并传递给c_link_args和cpp_link_args。仅与支持使用-T标志指定链接器脚本的链接器一起使用,例如ld、gold和lld。tools.build:defines预处理器定义列表,每个定义都将以-D为前缀并传递给cpp_args和c_args。tools.build:compiler_executables一个类似字典的 Python 对象,其中编译器作为键,编译器可执行文件路径作为值。这些键将映射如下tools.build:sysroot接受系统根目录的路径,并设置--sysroot标志,该标志用于c_args、cpp_args、c_link_args和cpp_link_args。c:将在 conan_meson_xxxx.ini 的[binaries]部分中设置c。cpp:将在 conan_meson_xxxx.ini 的[binaries]部分中设置cpp。objc:将在 conan_meson_xxxx.ini 的[binaries]部分中设置objc。objcpp:将在 conan_meson_xxxx.ini 的[binaries]部分中设置objcpp。
在 Meson 中使用正确的 Conan 选项数据类型¶
在将 Conan 选项作为 Meson 值分配之前,始终将其转换为有效的 Python 数据类型。
options = {{"shared": [True, False], "fPIC": [True, False], "with_msg": ["ANY"]}}
default_options = {{"shared": False, "fPIC": True, "with_msg": "Hi everyone!"}}
def generate(self):
tc = MesonToolchain(self)
tc.project_options["DYNAMIC"] = bool(self.options.shared) # shared is bool
tc.project_options["GREETINGS"] = str(self.options.with_msg) # with_msg is str
tc.subproject_options["SUBPROJECT"] = [{'MYVAR': str(self.options.with_msg)}] # with_msg is str
tc.subproject_options["SUBPROJECT"].append({'MYVAR': bool(self.options.shared)}) # shared is bool
tc.generate()
相反,直接将 Conan 选项分配为 Meson 值是强烈不推荐的。
options = {{"shared": [True, False], "fPIC": [True, False], "with_msg": ["ANY"]}}
default_options = {{"shared": False, "fPIC": True, "with_msg": "Hi everyone!"}}
# ...
def generate(self):
tc = MesonToolchain(self)
tc.project_options["DYNAMIC"] = self.options.shared # == <PackageOption object>
tc.project_options["GREETINGS"] = self.options.with_msg # == <PackageOption object>
tc.subproject_options["SUBPROJECT"] = [{'MYVAR': self.options.with_msg}] # == <PackageOption object>
tc.subproject_options["SUBPROJECT"].append({'MYVAR': self.options.shared}) # == <PackageOption object>
tc.generate()
这些不是布尔值或字符串值,而是表示这些选项值的内部 Conan 类。如果您直接分配这些值,在执行 generate() 函数时,您应该会在控制台中收到一条警告:“WARN: deprecated: Please, do not use a Conan option value directly.” 这种方法被认为是糟糕的做法,因为它可能导致项目构建过程中出现意外错误。
为 Apple 和 Android 进行交叉编译¶
MesonToolchain 生成器添加了交叉编译 Apple(MacOS M1、iOS 等)和 Android 所需的所有标志。
Apple
它将链接标志 -arch XXX、-isysroot [SDK_PATH] 和最低部署目标标志(例如,-mios-version-min=8.0)添加到 MesonToolchain 的 c_args、c_link_args、cpp_args 和 cpp_link_args 属性中,根据任何 Apple OS(iOS、watchOS 等)的 Conan 设置和 tools.apple:sdk_path 配置值,如下例所示:
[settings]
os = iOS
os.version = 10.0
os.sdk = iphoneos
arch = armv8
compiler = apple-clang
compiler.version = 12.0
compiler.libcxx = libc++
[conf]
tools.apple:sdk_path=/my/path/to/iPhoneOS.sdk
Android
它初始化 MesonToolchain 的 c、cpp 和 ar 属性,这些属性对于交叉编译 Android 是必需的,根据 Android 的 Conan 设置和 tools.android:ndk_path 配置值,如下例所示:
[settings]
os = Android
os.api_level = 21
arch = armv8
[conf]
tools.android:ndk_path=/my/path/to/NDK
交叉编译和 native=true¶
自 Conan 2.3.0 起新增
当您进行交叉编译时,有时需要构建一个用于生成源文件的工具。为此,您希望使用系统的原生编译器来构建一些目标。然后,您需要 Conan 创建这两个上下文文件:
def generate(self):
tc = MesonToolchain(self)
tc.generate()
# Forcing to create the native context too
if cross_building(self):
tc = MesonToolchain(self, native=True)
tc.generate()
有关更多信息,请参阅 Meson 文档中的 此参考。
Objective-C 参数¶
在 Apple OS 中,还有特定的 Objective-C/Objective-C++ 参数:objc、objcpp、objc_args、objc_link_args、objcpp_args 和 objcpp_link_args,作为 MesonToolchain 类的公共属性,其中 objc 和 objcpp 变量默认初始化为 clang 和 clang++。
另请参阅
参考¶
- class MesonToolchain(conanfile, backend=None, native=False)¶
MesonToolchain 生成器
- 参数:
conanfile –
< ConanFile 对象 >当前配方对象。始终使用self。backend – (已弃用,请使用
self.backend代替)strbackendMeson 变量值。默认值为ninja。native –
bool指示您是否希望 Conan 在交叉构建上下文中创建conan_meson_native.ini。请注意,这仅在您的项目的meson.build使用native=true时才有意义(另请参阅 https://mesonbuild.cn/Cross-compilation.html#mixing-host-and-build-targets)。
- backend¶
要使用的后端。由配置
tools.meson.mesontoolchain:backend定义。默认值为ninja。
- buildtype¶
要使用的构建类型。
- b_ndebug¶
禁用断言。
- b_staticpic¶
将静态库构建为位置无关。默认值为
self.options.get_safe("fPIC")。
- default_library¶
默认库类型,例如:“shared”。
- cpp_std¶
要使用的 C++ 语言标准。默认通过
to_cppstd_flag()定义。
- c_std¶
要使用的 C 语言标准。默认通过
to_cstd_flag()定义。
- b_vscrt¶
要使用的 VS 运行时库。默认通过
msvc_runtime_flag()定义。
- extra_cxxflags¶
额外的
CXX标志列表。添加到cpp_args。
- extra_cflags¶
额外的
C标志列表。添加到c_args。
- extra_ldflags¶
额外的链接器标志列表。添加到
c_link_args和cpp_link_args。
- extra_defines¶
额外的预处理器定义列表。以
-D[FLAG_N]的格式添加到c_args和cpp_args。
- arch_flag¶
Conan 推断的架构标志,添加到
c_args、cpp_args、c_link_args和cpp_link_args。
- arch_link_flag¶
Conan 推断的架构链接标志,添加到
c_link_args和cpp_link_args。
- threads_flags¶
Conan 推断的线程标志,添加到
c_args、cpp_args、c_link_args和cpp_link_args。
- properties¶
类似字典的对象,以
key=value格式定义 Mesonproperties。
- project_options¶
类似字典的对象,以
key=value格式定义 Mesonproject options。
- preprocessor_definitions¶
类似字典的对象,定义 Meson
preprocessor definitions。
- subproject_options¶
类似字典的对象,定义 Meson
subproject options。
- pkg_config_path¶
定义 Meson
pkg_config_path变量。
- cross_build¶
类似字典的对象,包含 Meson 机器上下文的构建、主机和目标。
- c¶
设置 Meson
c变量,默认值为CC构建环境值。如果提供为空格分隔的字符串,它将被转换为列表。否则,它仍是单个字符串。
- cpp¶
设置 Meson
cpp变量,默认值为CXX构建环境值。如果提供为空格分隔的字符串,它将被转换为列表。否则,它仍是单个字符串。
- ld¶
设置 Meson
ld变量,默认值为LD构建环境值。如果提供为空格分隔的字符串,它将被转换为列表。否则,它仍是单个字符串。
- c_ld¶
定义 Meson
c_ld变量。默认值为CC_LD环境值。
- cpp_ld¶
定义 Meson
cpp_ld变量。默认值为CXX_LD环境值。
- ar¶
定义 Meson
ar变量。默认值为AR构建环境值。
- strip¶
定义 Meson
strip变量。默认值为STRIP构建环境值。
- as_¶
定义 Meson
as变量。默认值为AS构建环境值。
- windres¶
定义 Meson
windres变量。默认值为WINDRES构建环境值。
- pkgconfig¶
定义 Meson
pkgconfig变量。默认值为PKG_CONFIG构建环境值。
- c_args¶
定义 Meson
c_args变量。默认值为CFLAGS构建环境值。
- c_link_args¶
定义 Meson
c_link_args变量。默认值为LDFLAGS构建环境值。
- cpp_args¶
定义 Meson
cpp_args变量。默认值为CXXFLAGS构建环境值。
- cpp_link_args¶
定义 Meson
cpp_link_args变量。默认值为LDFLAGS构建环境值。
- apple_arch_flag¶
Apple 架构标志(列表形式),例如:
["-arch", "i386"]。
- apple_isysroot_flag¶
Apple sysroot 标志(列表形式),例如:
["-isysroot", "./Platforms/MacOSX.platform"]。
- apple_min_version_flag¶
Apple 最低二进制版本标志(列表形式),例如:
["-mios-version-min", "10.8"]。
- apple_extra_flags¶
Apple bitcode、visibility 和 arc 标志。
- objc¶
定义 Meson
objc变量。默认值为None,如果为任何 Apple OS 则为clang。
- objcpp¶
定义 Meson
objcpp变量。默认值为None,如果为任何 Apple OS 则为clang++。
- objc_args¶
定义 Meson
objc_args变量。默认值为OBJCFLAGS构建环境值。
- objc_link_args¶
定义 Meson
objc_link_args变量。默认值为LDFLAGS构建环境值。
- objcpp_args¶
定义 Meson
objcpp_args变量。默认值为OBJCXXFLAGS构建环境值。
- objcpp_link_args¶
定义 Meson
objcpp_link_args变量。默认值为LDFLAGS构建环境值。
- generate()¶
创建
conan_meson_native.ini(如果是原生构建)或conan_meson_cross.ini(如果是交叉构建),并包含相应的内容。如果是 Windows 操作系统,还会创建conanvcvars.bat。