Mac/Windows构建时抛出Conan 'CMake'助手异常问题排查
问题场景
我希望不构建项目,仅通过Conan将变量传入CMake,因此在conanfile中使用Conan提供的CMakeToolchain,代码如下:
from conan.tools.cmake import CMake, CMakeToolchain ... def generate(self): tc = CMakeToolchain(self) tc.variables["SAMPLE_VAR"] = "SAMPLE_VAR" tc.generate()
在Jenkins流水线的Mac/Windows节点构建时出现如下错误(Debian节点正常),节点上的Conan版本为1.60.1:
[2023-07-18T12:25:58.188Z] ConanException: Using the wrong 'CMake' helper. To use CMakeDeps, CMakeToolchain you should use 'from conan.tools.cmake import CMake'. Set environment variable CONAN_DISABLE_STRICT_MODE=1 to override this check (should only be used to build old packages).
我是因为报错才引入了CMake模块,但实际并未使用该模块。我按照Conan官方文档的方式使用CMakeToolchain,却仍出现问题,想了解正确的使用方式。
官方文档示例(中文翻译):
from conan import ConanFile from conan.tools.cmake import CMakeToolchain class App(ConanFile): settings = "os", "arch", "compiler", "build_type" requires = "hello/0.1" generators = "CMakeDeps" options = {"shared": [True, False], "fPIC": [True, False]} default_options = {"shared": False, "fPIC": True} def generate(self): tc = CMakeToolchain(self) tc.variables["MYVAR"] = "MYVAR_VALUE" tc.preprocessor_definitions["MYDEFINE"] = "MYDEF_VALUE" tc.generate()
正确使用方式
1. 移除不必要的模块导入
如果你仅使用CMakeToolchain,不需要导入CMake模块,直接导入CMakeToolchain即可。多余的CMake导入会触发Conan的严格模式检查,这可能是Mac/Windows节点报错的原因(不同平台的严格模式触发逻辑存在差异)。
修正后的导入代码:
from conan.tools.cmake import CMakeToolchain
2. 避免混用新旧版CMake工具
确保你的conanfile中没有同时使用旧版的cmake生成器(例如generators = "cmake"),也没有导入旧版的CMake模块(如from conan.client.cmake import CMake,这是Conan 1.x早期版本的导入方式)。Conan 1.60.1的严格模式会检测新旧工具混用的情况,进而抛出错误。
3. 正确配置generators
如果需要处理依赖的CMake配置,需在conanfile的generators中添加CMakeDeps,就像官方示例那样。如果仅需传递变量给CMake,确保没有冲突的生成器配置即可。
4. 临时绕过方案(不推荐)
如果上述方法无法快速解决问题,可以临时设置环境变量CONAN_DISABLE_STRICT_MODE=1绕过检查,但官方明确说明这仅适用于构建旧包,长期来看仍需修正代码以符合规范。
内容的提问来源于stack exchange,提问作者JDGross

