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()
重要
当您的 recipe 有依赖项时,MesonToolchain
仅与 PkgConfigDeps
生成器一起工作。请不要使用其他生成器,因为它们可能具有可能冲突的重叠定义。
生成的文件¶
MesonToolchain
在 conan install(或在缓存中构建包)后,根据 generate()
方法中提供的信息以及从当前 settings
、conf
等转换而来的信息,生成以下文件。
conan_meson_native.ini: 如果进行原生构建。
conan_meson_cross.ini: 如果进行交叉构建 (conan.tools.build)。
conan_meson_native.ini¶
此文件包含与当前包、平台等相关的 Conan 选项和设置的所有 Meson 属性定义。这包括但不限于以下内容:
从 Conan 设置检测
default_library
。基于名为
shared
的选项的存在/值。
从 Conan 设置检测
buildtype
。根据需要定义 C++ 标准。
从 Conan 输入设置获取的 Visual Studio 运行时 (
b_vscrt
)。
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
和选项MYVAR
定义。
请注意,与 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_path
Apple 交叉编译时 SDK 路径的参数。它用作-isysroot
标志的值。tools.android:ndk_path
Android 交叉编译时 NDK 路径的参数。它用于获取 conan_meson_cross.ini 的[binaries]
部分中使用的一些二进制文件,如c
、cpp
和ar
。tools.build:cxxflags
用作cpp_args
的额外 C++ 标志列表。tools.build:cflags
用作c_args
的纯 C 标志列表。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
它向 MesonToolchain
的 c_args
、c_link_args
、cpp_args
和 cpp_link_args
属性添加了链接标志 -arch XXX
、-isysroot [SDK_PATH]
和最小部署目标标志,例如 -mios-version-min=8.0
,这些标志基于任何 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
它根据 Android 的 Conan 设置和 tools.android:ndk_path
配置值初始化 MesonToolchain
的 c
、cpp
和 ar
属性,这些属性是 Android 交叉编译所必需的,如下面的宿主配置文件示例所示
[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 操作系统中,还有特定的 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 object >
当前的 recipe 对象。始终使用self
。backend – (已废弃,请改用
self.backend
)str
backend
Meson 变量值。默认值为ninja
。native –
bool
指示您是否希望 Conan 在交叉构建上下文中创建conan_meson_native.ini
。请注意,这仅在您的项目的meson.build
使用native=true
时才有意义(另请参阅 https://mesonbuild.cn/Cross-compilation.html#mixing-host-and-build-targets)。
- backend¶
要使用的后端。由 conf
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¶
定义 Meson
properties
的字典对象,格式为key=value
- project_options¶
定义 Meson
project options
的字典对象,格式为key=value
- 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、可见性和 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
。