孵化中的特性

本节致力于正在开发中的新特性,寻求用户测试和反馈。它们通常隐藏在标志之后,以便在此测试阶段显式选择启用它们。它们需要最新的 Conan 版本(有时建议从 develop2 源代码分支运行),并显式设置这些标志。

新的 CMakeConfigDeps 生成器

该生成器旨在替代当前的 CMakeDeps 生成器,具有多个待处理的修复和改进,而这些修复和改进很难在不破坏兼容性的情况下在当前生成器中完成。

  • 创建真实的 SHARED/STATIC/INTERFACE IMPORTED 目标,不再有虚假的接口目标。 CONAN_LIB:: 和其他类似的目标不再存在。

  • 为目标定义 IMPORTED_CONFIGURATIONS。

  • 依赖项的 CONFIG 定义与依赖项的 Release/Debug/etc build_type 相匹配,不再使用消费者的配置。

  • 为库目标定义 IMPORTED_LOCATION 和 IMPORTED_IMPLIB。

  • 基于配方中的 languagescpp_info/component languages 属性定义 LINK_LANGUAGES。

  • 所有这些都允许更好地传播链接要求和可见性,避免 Linux 中共享库的某些链接错误。

  • 更好地定义了相同包内组件之间的 requires 关系以及与其他包的关系。

  • 它不需要任何 build_context_activatedbuild_context_suffix 来使用 tool_requires 依赖项。

  • 定义 cpp_info/component.exe 信息(应包括 .location 定义),以定义可以运行的 EXECUTABLE 目标。

  • 来自 requires 的可执行文件也可以在非交叉构建场景中使用。当存在到相同依赖项的 tool_requires 时,这些可执行文件将具有优先级。

  • 创建一个新的 conan_cmakedeps_paths.cmake,其中包含 <pkg>_DIR 路径的定义,以便直接查找依赖项。该文件还计划用于 cmake-conan 以扩展其用法并避免由于 CMake 驱动的安装无法稍后注入工具链而导致的一些当前限制。

  • (Conan 2.14 之后新增) 通过 cpp_info.frameworks 更好地管理系统 OSX Frameworks。

  • (Conan 2.14 之后新增) 定义 cpp_info/component.package_framework 信息(应包括 .location 定义,例如 os.path.join(self.package_folder, "MyFramework.framework", "MyFramework")),以定义要链接的自定义 OSX Framework 库。

注意

此生成器仅旨在生成 config.cmake 配置文件,它不会生成 Find*.cmake 查找模块,并且不支持它。对于此,请使用 CMakeDeps 生成器。

可以在 cpp_infocpp_info.components 中定义的新字段,除了在 CppInfo 中已经定义的字段之外,还有

# EXPERIMENTAL FIELDS, used exclusively by new CMakeConfigDeps (-c tools.cmake.cmakedeps:new)
self.cpp_info.type  # The type of this artifact "shared-library", "static-library", etc (same as package_type)
self.cpp_info.location # full location (path and filename with extension) of the artifact or the Apple Framework library one
self.cpp_info.link_location  # Location of the import library for Windows .lib associated to a dll
self.cpp_info.languages # same as "languages" attribute, it can be "C", "C++"
self.cpp_info.exe  # Definition of an executable artifact
self.cpp_info.package_framework  # Definition of an Apple Framework (new since Conan 2.14)
self.cpp_info.sources  # List of paths to source files in the package (for packages that provide source code to consumers)

这些字段将从其他 cpp_infocomponents 定义中自动推断,例如 libslibdirs 字段,但自动推断可能存在限制。显式定义它们将抑制自动推断并使用配方中提供的值。

使用以下方式声明目标的源文件

self.cpp_info.sources = ["src/mylib.cpp", "src/other.cpp"]

这允许包将源代码作为依赖项提供给消费者。路径应相对于包文件夹。源文件将作为 INTERFACE_SOURCES 属性添加到 CMake 库(或组件)目标,并且链接到此目标的消费者将在构建自己的目标时编译这些源文件。

此功能使用 -c tools.cmake.cmakedeps:new=will_break_next 配置启用。值 will_break_next 将在下一个版本中更改,以强调该功能不适合超出测试的用途。只需启用此配置并强制构建使用 CMakeDeps 的包,即可触发新生成器的使用。

此新生成器也可以在 conanfile 文件中使用

conanfile.txt
[generators]
CMakeConfigDeps
conanfile.py
class Pkg(ConanFile):
   generators = "CMakeConfigDeps"

或者

conanfile.py
from conan import ConanFile
from conan.tools.cmake import CMakeConfigDeps

class TestConan(ConanFile):

   def generate(self):
      deps = CMakeConfigDeps(self)
      deps.generate()

仍然需要 -c tools.cmake.cmakedeps:new=will_break_next 用于此配方 CMakeConfigDeps 用法,如果未启用配置,这些配方将失败。也可以定义 -c tools.cmake.cmakedeps:new=recipe_will_break 以仅启用 CMakeConfigDeps 生成器的用法,而不自动替换现有的 CMakeDeps 生成器为 CMakeConfigDeps

请注意,即使对于显式的 CMakeConfigDeps 生成器语法,此功能仍然是“孵化中的”,此配方可能会随时中断或被删除。

有关任何反馈,请在 https://github.com/conan-io/conan/issues 上创建新工单。此反馈对于稳定该功能并使其退出孵化非常重要,因此即使它工作良好并且您没有发现任何问题,报告积极的反馈也非常有用。

工作区

已移动到 工作区

工作区文件语法

已移动到 工作区文件

工作区命令

已移动到 conan workspace

工作区单体构建

已移动到 单体构建

有关任何反馈,请在 https://github.com/conan-io/conan/issues 上创建新工单。