Conan 1.55:CMakeDeps 现在可以自定义其依赖项的目标名称、文件和类型,新增工具。build:compiler_executables 配置文件,新增 NMakeDeps 和 NMakeToolchain 集成,启用可编辑包的环境变量和配置文件
我们很高兴地宣布 Conan 1.55 发布,并带来了一些重要的新功能和错误修复。首先,CMakeDeps 提供了在消费者端设置属性的功能。此外,我们添加了新的 tools.build:compiler_executables 配置,用于在 CMakeToolchain、MesonToolchain 和 AutotoolsToolchain 中定义编译器的可执行文件位置。我们改进了与 NMAKE 的集成,使用了 NMakeDeps 和 NMakeToolchain 生成器。最后,我们启用了环境变量和配置,以便在可编辑包中使用。
CMakeDeps 现在可以自定义其属性
您可能知道,Conan 在几个版本之前引入了属性模型,以添加一种通用方法来将某些信息传递给生成器。Conan 将此模型用于 新的生成器,替换了旧的 cpp_info 属性,如 cpp_info.names 和 cpp_info.filenames(您可以查看从旧模型迁移的指南 此处)。在 1.55 之前,无法覆盖依赖项设置的值。例如,如果一个配方将 cmake_find_mode 设置为 both,Conan 将为该配方的每个使用者生成配置文件和模块文件,但这可能不是该配方的使用者想要的。
从 1.55 开始,Conan 允许从消费者端覆盖 CMakeDeps 的以下属性:cmake_file_name、cmake_target_name、cmake_find_mode、cmake_module_file_name 和 cmake_module_target_name。让我们来看一个将 Zlib 作为依赖项的配方的示例。
例如,如果您检查 Conan Center 中的 Zlib 配方,它会在 package_info() 方法中为 CMakeDeps 定义多个属性
...
def package_info(self):
self.cpp_info.set_property("cmake_find_mode", "both")
self.cpp_info.set_property("cmake_file_name", "ZLIB")
self.cpp_info.set_property("cmake_target_name", "ZLIB::ZLIB")
...
假设您有一个使用 Zlib 的应用程序,并且您想更改这些属性,因为您只想生成配置文件,并且您在 CMakeLists.txt 中为 Zlib 使用了不同的目标名称。然后,您可以在 generate() 方法中使用 CMakeDeps.set_property 来覆盖 Zlib 配方中设置的值
from conan.tools.cmake import CMakeDeps
...
class ConsumerRecipe(ConanFile):
...
def generate(self):
deps = CMakeDeps(self)
# We want to use zlib target name instead of ZLIB::ZLIB
deps.set_property("zlib", "cmake_target_name", "zlib")
# We invalidate whatever value the zlib recipe sets and fallback to
# the default for Conan
deps.set_property("zlib", "cmake_find_mode", None)
...
关于示例的一些说明
- 我们显式地将
cmake_target_name设置为zlib - 我们使用值
None来设置cmake_find_mode属性。如果将属性设置为None,Conan 将使配方中设置的属性失效,并使用该属性的默认值,在本例中为config。在本例中,deps.set_property("zlib", "cmake_find_mode", None)等效于deps.set_property("zlib", "cmake_find_mode", "config")
您可以在 Conan 文档 中阅读有关 CMakeDeps set_property 方法的更多信息。
新的 tools.build:compiler_executables 配置文件
我们添加了 tools.build:compiler_executables 配置来设置编译器可执行文件的位置。此配置定义了一个字典,其中语言作为键,可执行文件位置作为值。例如,您可以在 Conan 配置文件中使用它
[settings]
os=Macos
arch=x86_64
[conf]
tools.build:compiler_executables={"cpp": "path_to_my_c++_compiler", "c": "path_to_my_c_compiler"}
此配置适用于 CMakeToolchain、AutotoolsToolchain 和 MesonToolchain
CMakeToolchain:为 CMake 定义相应的CMAKE_<LANG>_COMPILER变量。检查文档中接受的键列表 此处AutotoolsToolchain:为 CMake 定义相应的CMAKE_<LANG>_COMPILER变量。检查文档中接受的键列表 此处MesonToolchain:定义相应的环境变量(如CC或CXX)。检查文档中接受的键列表 此处
NMakeDeps 和 NMakeToolchain 生成器
我们通过 NMakeDeps 和 NMakeToolchain 生成器改进了与 NMAKE 的集成。这些生成器将生成环境脚本,定义 NMAKE 在构建时使用的环境变量。
- NMakeDeps 定义
CL、LIB和_LINK_环境变量,注入必要的标志以定位和链接在 requires 中声明的依赖项 - NMakeToolchain 定义
CL环境变量,注入从 Conan 设置(如compiler.cppstd或 Visual Studio 运行时)推导出的必要标志
启用环境变量和配置以在可编辑包中使用
我们修复了在可编辑模式下但需要配方在开发过程中在 package_info() 方法中设置的信息时可能发生的情况。例如,在可编辑模式下的如下包中可能会发生这种情况
import os
from conan import ConanFile
class ConanPackage(ConanFile):
...
def package_info(self):
# This is BROKEN if we put this package in editable mode
self.runenv_info.define_path("MYDATA_PATH",
os.path.join(self.package_folder, "my/data/path"))
如果处于可编辑模式,这将中断,因为还没有包。对于这些情况,我们可以在 layout() 方法中定义它,就像可以在那里定义 cpp_info 一样。layouts 对象包含 source、build 和 package 范围,并且每个范围都包含一个 buildenv_info、runenv_info 和 conf_info 实例
from conan import ConanFile
class SayConan(ConanFile):
...
def layout(self):
# The final path will be relative to the self.source_folder
self.layouts.source.buildenv_info.define_path("MYDATA_PATH", "my/data/path")
# The final path will be relative to the self.build_folder
self.layouts.build.buildenv_info.define_path("MYDATA_PATH", "my/data/path")
# The final path will be relative to the self.build_folder
self.layouts.build.conf_info.define_path("MYCONF", "my/conf/folder")
除了上面列出的项目之外,还有一些小的错误修复,您可能希望了解。如果是这样,请参阅 更改日志 以获取完整列表。
我们希望您喜欢此版本,并期待您的 反馈。