conf 用于声明不影响 package ID 但影响工具链或构建流程的全局配置项,如 CMake 生成器、sysroot、并发数等;必须严格区分 conf 与 buildenv 的用途,键名需完全匹配且格式正确,否则 CMakeToolchain 可能静默失效。

conf 里只放影响构建行为的全局配置项
conf 是 Conan 2.x 中用于声明「非 settings、非 options,但会影响工具链或构建流程」的键值对区域。它不参与 package ID 计算,也不决定二进制兼容性,而是告诉 Conan 的生成器(如 CMakeToolchain)和构建工具「怎么干活」。
常见误用是把编译器路径、环境变量、自定义宏全塞进 conf——这些该去 [buildenv] 或 [env]。错放会导致 CMake 不读取、交叉编译失效、甚至 conan install 静默忽略。
-
tools.cmake.cmaketoolchain:generator:必须设,否则 Ninja/MSVC/Unix Makefiles 会 fallback 到默认值,可能不匹配你的构建系统 -
tools.build:sysroot:交叉编译时让 CMakeToolchain 自动注入-DCMAKE_SYSROOT,比手动写CMAKE_TOOLCHAIN_FILE更可靠 -
tools.cmake.cmaketoolchain:user_toolchain:指向已有的toolchain.cmake,适合复用 BSP 或 Yocto 提供的链工具链 -
tools.build:jobs:控制并发数,避免ninja -j或cmake --build -j无约束耗尽内存 -
tools.cmake.cmaketoolchain:presets:启用 CMake Presets 输出(Conan 2.4+),配合cmake --preset使用
conf 和 buildenv 的边界必须划清
[conf] 是 Conan 内部指令,[buildenv] 是 shell 环境注入。两者不能混用,否则行为不可预测。
例如交叉编译需要 PKG_CONFIG_SYSROOT_DIR:它必须进 [buildenv],因为 pkg-config 只读环境变量;而 tools.build:sysroot 进 [conf],是为了让 CMakeToolchain 生成正确的 set(CMAKE_SYSROOT ...)。
- 要让 CMake 读到的变量 → 放
[conf](如tools.cmake.cmaketoolchain:extra_variables) - 要让子进程(
gcc、pkg-config、meson)读到的变量 → 放[buildenv] - 要传给
conanfile.py里self.conf.get()用的运行时配置 → 必须是[conf],且 key 格式为user.mycompany:xxx - 想在
CMakeLists.txt里用get_property(... PROPERTY CONAN_XXX)→ 要靠[conf]+CMakeToolchain的extra_variables显式导出
conf 值里带模板表达式要小心求值时机
[conf] 支持 {{ os.cpu_count() }} 这类 Jinja 表达式,但它在 profile 解析阶段求值,不是在 conan install 执行时。这意味着:
-
tools.build:jobs={{ os.cpu_count() - 2 }}在 profile 加载时就算好了,不会随构建机负载动态变 -
{{ env.HOME }}读的是执行conan install的用户环境,不是 profile 文件所在机器的$HOME - 路径中含
~的写法(如tools.build:sysroot=~/sysroots/arm64)会被自动展开为绝对路径,但仅限于当前用户主目录 —— 别指望它跨用户或跨 CI agent 复用 - 不要在
[conf]里写条件逻辑(如{% if arch == "armv8" %}...),profile 不支持条件块,会直接报错
profile 里 conf 写错,CMakeToolchain 可能静默失效
最常被忽略的一点:CMakeToolchain 对 [conf] 键名极其敏感。拼错、多空格、大小写错,它就当没看见,继续用默认值,而 conan install 不报错。
比如写成 tools.cmake.cmaketoolchain:generater=Ninja(generater 拼错),结果生成的是 Unix Makefiles 工具链;又或者写成 tools.cmake.cmaketoolchain:generator=ninja(小写),某些 Conan 版本会忽略,仍用默认值。
- 始终用
conan profile show <profile_name>核对输出,确认conf条目真实存在且 key 名完全匹配文档 - 怀疑 toolchain 生成异常时,先检查
conan install输出里有没有Using conf: ...行 - 最终生成的
conan_toolchain.cmake文件里搜set(CMAKE_SYSROOT或set(CMAKE_GENERATOR,看是否按预期写入 -
tools.cmake.cmaketoolchain:extra_variables必须是 JSON 字符串格式,不是 Python dict,写错格式会导致整个 toolchain 生成失败


















