Conan 1.30:改进 GCC 的 libcxx 检测,Intel 编译器支持的实验性工具,实验性 MSBuildToolchain,self.cpp_info.requires 属性,macOS 11 支持
Conan 1.30 现已发布。此版本在多个集成方面取得进展,包括 GCC、Intel 编译器和 MSBuild。它使组件更加成熟,并添加了一种使用自定义生成器的新方法。此外,macOS 11(又名“Big Sur”)现已添加到 Conan 的默认设置中。
改进 GCC 的 libcxx 检测
安装 Conan 时,它会根据环境自动检测许多设置。这些设置包括 compiler
和 compiler.version
。当 compiler
为 gcc
时,它还会检测 compiler.libcxx
,后者在一段时间内存在一些具有挑战性的极端情况。此版本增强了 libcxx
检测的鲁棒性,希望这将使 Conan 安装时这些极端情况下的默认值得到更好的改进。
注意:如果我们默认启用此行为,则可能被视为重大更改,因此我们必须默认将其关闭,用户必须设置 CONAN_V2_MODE
环境变量 以将其打开。
Intel 编译器支持的实验性工具
Conan 的 tools 模块为 conanfile.py
作者提供了一些辅助函数,以减少配方中的样板代码并避免常见错误。现在公开了三个新函数,用于配方需要特殊处理才能与 Intel 编译器一起使用的情况
tools.intel_installation_path()
tools.intel_compilervars()
tools.intel_compilervars_dict()
MSBuild 的实验性工具链
在 Conan 的新工具链策略方面继续我们的工作,此版本包含一个用于 MSBuild
构建系统的工具链类。与之前添加的现有 CMake
和 Make
工具链一样,此新的工具链类生成包含 Conan 中所有相关构建变量的 .props
文件。这些 .props
文件不包含与依赖项相关的变量。依赖项相关的信息应仍然由 msbuild
生成器生成。
新的 self.cpp_info.requires 属性
我们还继续发展和改进围绕组件功能的体验。出现的一个常见情况是,许多声明组件的包被不声明组件的下游包所依赖。以前,当下游包仅依赖于上游包的特定组件时,它无法在其自己的 cpp_info
中建模。这意味着所有传递性使用者最终都会依赖于原始上游的所有组件。
在没有示例的情况下描述这个问题很棘手,因此这里提供了 OpenSSL 配方中的 package_info
方法以及 OpenSSL 使用者的一个示例。
# Conanfile for OpenSSL:
def package_info(self):
self.cpp_info.name = "OpenSSL"
self.cpp_info.components["crypto"].names["cmake_find_package"] = "Crypto"
self.cpp_info.components["crypto"].libs = ["libcrypto"]
self.cpp_info.components["crypto"].defines = ["DEFINE_CRYPTO=1"]
self.cpp_info.components["crypto"].requires = ["zlib::zlib"]
self.cpp_info.components["ssl"].names["cmake"] = "SSL"
self.cpp_info.components["ssl"].includedirs = ["include/headers_ssl"]
self.cpp_info.components["ssl"].libs = ["libssl"]
# Conanfile for consumer of OpenSSL:
def package_info(self):
self.cpp_info.requires = ['openssl::ssl']
# Depends only on ssl component
# Which notably does NOT depend on zlib
# ...
OpenSSL 声明了两个组件:ssl
和 crypto
。使用者包只需要其中一个(ssl
)。使用新的 cpp_info.requires
属性,使用者可以正确声明该依赖项。结果是,此使用者及其所有未来的下游使用者将仅链接到 OpenSSL 包的 ssl
组件,而不是 libcrypto
或 zlib
。
其他值得注意的更改
Qbs 生成器收到了一个重大更新,使其能够使用本机依赖项声明语法正确地建模传递性依赖项。这减少了混乱,并应正确强制执行链接器顺序。JSON
和 Markdown
生成器都学会了如何包含 cpp_info.names
和 cpp_info.filenames
属性。
除了上面列出的项目之外,还有一些小的错误修复,您可能希望阅读。如果是这样,请参阅 更改日志 以获取完整列表。
我们希望您喜欢此版本,并期待您的 反馈。