Conan与CMake:如何从无CMakeLists的其他项目获取项目目录
实现步骤
1. 编写项目A的Conan配方(无需修改项目A原有内容)
项目A是纯配置文件无构建逻辑,直接编写conanfile.py放在项目A根目录即可,内容如下:
from conan import ConanFile import os class ProjectAConan(ConanFile): name = "project_a" version = "1.0.0" # 导出项目A所有配置文件,可根据实际配置文件路径调整匹配规则 exports_sources = "*" def build(self): # 无编译逻辑,空实现即可 pass def package(self): # 将所有配置文件拷贝到包的config目录下,也可以保持原有目录结构 self.copy("*", dst="config") def package_info(self): # 声明CMake目标和命名规则,方便下游查找 self.cpp_info.set_property("cmake_file_name", "ProjectA") self.cpp_info.set_property("cmake_target_name", "ProjectA::ProjectA") # 可选:直接给下游暴露配置目录的CMake变量 self.cpp_info.set_property("cmake_user_code", f"set(PROJECT_A_CONFIG_DIR \"{os.path.join(self.package_folder, 'config')}\" CACHE PATH \"Path to project A configs\")" )
写完后执行以下命令将项目A打包到本地Conan缓存:
conan create .
2. 配置项目B的依赖
在项目B的conanfile.py中添加项目A的依赖:
class ProjectBConan(ConanFile): # 其他配置省略 requires = "project_a/1.0.0" generators = "CMakeDeps", "CMakeToolchain"
执行conan install .生成项目B的依赖配置文件。
3. 在项目B的CMakeLists中引用配置目录
Conan会自动生成ProjectAConfig.cmake,直接查找并使用暴露的变量即可:
cmake_minimum_required(VERSION 3.15) project(project_b) # 查找项目A的依赖 find_package(ProjectA REQUIRED) # 你的测试目标配置 add_executable(test_b test.cpp) # 方式1:使用Conan自动暴露的包根目录变量拼接配置路径 target_compile_definitions(test_b PRIVATE PROJECT_A_CONFIG_PATH="${ProjectA_PACKAGE_FOLDER}/config" ) # 方式2:使用你在项目A配方里自定义的PROJECT_A_CONFIG_DIR变量 target_include_directories(test_b PRIVATE ${PROJECT_A_CONFIG_DIR})
补充说明
- 如果不需要保留配置文件的原有结构,也可以在项目A的
package方法中按分类拷贝到不同目录,下游按需引用即可。 - 整个流程不需要修改项目A的任何原有文件,完全通过Conan配方实现目录导出。
内容的提问来源于stack exchange,提问作者cauchi
相关产品推荐
相关产品推荐

