如何创建仅含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项目中引入:
- bar的
conanfile.py添加依赖:requires = "foo/0.1.0",并启用CMakeDeps生成器。 - bar的
CMakeLists.txt中:cmake_minimum_required(VERSION 3.27) project(bar) find_package(foo REQUIRED) # 直接引入模块(已自动添加路径) include(foo_module)
- bar的
内容的提问来源于stack exchange,提问作者Florian Wolters
相关产品推荐
相关产品推荐

