You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建仅含CMake源码的Conan 2.0包并供项目引用

纯CMake代码Conan包创建方案(适配Conan 2.0.14 + CMake 3.27.8)

1. 解决build_type setting should be defined错误

纯CMake模块无需编译构建,直接在conanfile.py中声明为头文件/无构建类型即可跳过Conan对build_type的强制要求:

from conan import ConanFile
from conan.tools.cmake import cmake_layout

class FooConan(ConanFile):
    name = "foo"
    version = "0.1.0"
    # 声明为无构建包,Conan自动跳过编译流程
    header_only = True
    # 仅保留与路径相关的系统设置(可选)
    settings = ["os"]

    def layout(self):
        cmake_layout(self)

    def package(self):
        # 直接复制所有CMake文件到包的cmake目录
        self.copy("*.cmake", dst="cmake", src=".")

    def package_info(self):
        # 告诉Conan包的CMake配置文件名
        self.cpp_info.set_property("cmake_file_name", "foo")
        # 将包的cmake目录添加到CMake模块搜索路径
        self.cpp_info.builddirs.append("cmake")
        # 导出环境变量,方便CMake自动识别模块路径
        self.env_info.CMAKE_MODULE_PATH.append(f"{self.package_folder}/cmake")

2. 无需带install命令的CMakeLists.txt

因为不需要编译目标,完全可以跳过编写CMakeLists.txt,直接通过conanfile.py的package步骤复制CMake文件即可,更简洁高效。

3. 编写foo-config.cmake实现find_package识别

创建foo-config.cmake文件,让bar项目能通过find_package(foo REQUIRED)找到包,并便捷引入自定义模块:

# foo-config.cmake
# 将当前目录(包的cmake目录)添加到CMake模块搜索路径
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")

# 导出变量供用户直接引用模块
set(foo_ROOT "${CMAKE_CURRENT_LIST_DIR}/..")
set(foo_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")

4. 包目录结构

foo/
├── conanfile.py
├── foo-config.cmake
└── foo_module.cmake  # 你的自定义CMake模块文件

5. 创建包与在bar项目中使用

  • 创建foo包:直接在foo目录执行conan create .,不会再出现build_type错误。
  • bar项目中引入:
    1. bar的conanfile.py添加依赖:requires = "foo/0.1.0",并启用CMakeDeps生成器。
    2. bar的CMakeLists.txt中:
      cmake_minimum_required(VERSION 3.27)
      project(bar)
      
      find_package(foo REQUIRED)
      # 直接引入模块(已自动添加路径)
      include(foo_module)
      

内容的提问来源于stack exchange,提问作者Florian Wolters

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:58:11