MesonToolchain

重要

此类将生成仅与 Meson 版本 >= 0.55.0 兼容的文件

generate() 方法中,可以使用 MesonToolchain 作为 Meson 的工具链生成器,如下所示

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 生成器。请勿使用其他生成器,因为它们可能存在重叠的定义,从而导致冲突。

生成的文件

MesonToolchainconan install (或在缓存中构建包) 之后生成以下文件,其中包含在 generate() 方法中提供的信息以及从当前 settingsconf 等翻译的信息。

  • 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.iniconan_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.iniconan_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.iniconan_meson_cross.ini 文件中,为 MYVAR 定义一个子项目 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.iniconan_meson_cross.ini 文件中,为 MYDEF 定义一个预处理器定义。

conf

MesonToolchain 受这些 [conf] 变量影响

  • tools.meson.mesontoolchain:backend。meson 后端 以使用。可能的值:ninjavsvs2010vs2015vs2017vs2019xcode

  • tools.apple:sdk_path 在 Apple 交叉编译的情况下,用于 SDK 路径的参数。它用作标志 -isysroot 的值。

  • tools.android:ndk_path 在 Android 交叉编译的情况下,用于 NDK 路径的参数。它用于从 conan_meson_cross.ini[binaries] 部分获取一些二进制文件,例如 ccppar

  • tools.build:cxxflags 用于 cpp_args 的额外 C++ 标志列表。

  • tools.build:cflags 用于 c_args 的纯 C 标志列表。

  • tools.build:sharedlinkflags 用于 c_link_argscpp_link_args 的额外链接器标志列表。

  • tools.build:exelinkflags 用于 c_link_argscpp_link_args 的额外链接器标志列表。

  • tools.build:linker_scripts 链接器脚本列表,每个脚本都将以 -T 为前缀,并传递给 c_link_argscpp_link_args。仅当链接器支持使用 -T 标志指定链接器脚本时才使用此标志,例如 ldgoldlld

  • tools.build:defines 预处理器定义的列表,每个定义都将以 -D 为前缀,并传递给 cpp_argsc_args

  • tools.build:compiler_executables 一个类似字典的 Python 对象,其中编译器作为键,编译器可执行文件路径作为值。这些键将映射如下

  • tools.build:sysroot 接受指向系统根目录的路径,并设置 c_argscpp_argsc_link_argscpp_link_args 使用的 --sysroot 标志。

    • 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: 请勿使用 Conan 选项值。 这种方法被认为是不良实践,因为它可能导致项目构建过程中出现意外错误。

Apple 和 Android 的交叉构建

MesonToolchain 生成器添加了交叉编译 Apple(MacOS M1、iOS 等)和 Android 所需的所有标志。

Apple

它添加了链接标志 -arch XXX-isysroot [SDK_PATH] 和最小部署目标标志,例如 -mios-version-min=8.0MesonToolchain c_argsc_link_argscpp_argscpp_link_args 属性,给定用于任何 Apple OS(iOS、watchOS 等)的 Conan 设置和 tools.apple:sdk_path 配置值,如本主机配置文件的示例所示

ios_host_profile
[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 ccppar 属性,这些属性对于交叉编译 Android 是必需的,给定 Android 的 Conan 设置和 tools.android:ndk_path 配置值,如本主机配置文件的示例所示

android_host_profile
[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++ 参数:objcobjcppobjc_argsobjc_link_argsobjcpp_argsobjcpp_link_args,它们是 MesonToolchain 类的公共属性,其中变量 objcobjcpp 默认初始化为 clangclang++ 分别。

另请参阅

参考

class MesonToolchain(conanfile, backend=None, native=False)

MesonToolchain 生成器

参数:
  • conanfile< ConanFile 对象 > 当前配方对象。始终使用 self

  • backend – (已弃用,请使用 self.backend 代替) str backend Meson 变量值。默认值为 ninja

  • nativebool 指示您是否希望 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_argscpp_link_args

extra_defines

额外的预处理器定义列表。添加到 c_argscpp_args,格式为 -D[FLAG_N]

arch_flag

Conan 推断的体系结构标志,添加到 c_argscpp_argsc_link_argscpp_link_args

Conan 推断的链接体系结构标志,添加到 c_link_argscpp_link_args

threads_flags

Conan 推断的线程标志,添加到 c_argscpp_argsc_link_argscpp_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

定义 Meson c_link_args 变量。默认值为构建环境中的 LDFLAGS

cpp_args

定义 Meson cpp_args 变量。默认值为构建环境中的 CXXFLAGS

定义 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 位码、可见性和 arc 标志

objc

定义 Meson objc 变量。默认值为 None,如果任何 Apple OS clang

objcpp

定义 Meson 的 objcpp 变量。默认值为 None,如果存在任何 Apple OS 的 clang++

objc_args

定义 Meson 的 objc_args 变量。默认值为构建环境中的 OBJCFLAGS

定义 Meson 的 objc_link_args 变量。默认值为构建环境中的 LDFLAGS

objcpp_args

定义 Meson 的 objcpp_args 变量。默认值为构建环境中的 OBJCXXFLAGS

定义 Meson 的 objcpp_link_args 变量。默认值为构建环境中的 LDFLAGS

generate()

创建一个 conan_meson_native.ini(如果为原生构建)或一个 conan_meson_cross.ini(如果为交叉构建),其中包含正确的内容。如果操作系统为 Windows,则还会创建一个 conanvcvars.bat