如何在Conan生成的vsgConfig.cmake中自动引入vsgMacros.cmake?
解决VulkanSceneGraph(VSG) Conan包中vsgMacros.cmake自动引入问题
核心思路:自定义Conan的CMake配置模板
Conan默认生成的vsgConfig.cmake不会自动包含额外宏文件,要还原原生VSG的隐式引入体验,需要自定义CMake配置模板,让生成的Config文件自动加载vsgMacros.cmake。
具体实现步骤
- 添加自定义Config模板文件
在VSG根仓库的Conan recipe目录下,创建vsgConfig.cmake.in模板,内容如下:
@PACKAGE_INIT@ # 自动引入vsgMacros.cmake,保持原生使用逻辑 include("${CMAKE_CURRENT_LIST_DIR}/vsgMacros.cmake") # 保留Conan默认的目标导入逻辑 include("${CMAKE_CURRENT_LIST_DIR}/vsgTargets.cmake") check_required_components(vsg)
这个模板会在包配置初始化时,自动引入同目录下的宏文件,同时保留Conan生成的目标导入逻辑。
- 修改Conan Recipe配置
在conanfile.py中,确保模板和宏文件被正确打包,并指定使用自定义模板生成Config文件:
def package(self): # 复制原生VSG的cmake文件(包含vsgMacros.cmake) self.copy("*.cmake", dst="lib/cmake/vsg", src="cmake") # 复制自定义Config模板 self.copy("vsgConfig.cmake.in", dst="lib/cmake/vsg") def generate(self): from conan.tools.cmake import CMakeDeps cmake_deps = CMakeDeps(self) # 指定使用自定义模板生成vsgConfig.cmake cmake_deps.configure_configs(vsg={"cmake_file": "vsgConfig.cmake.in"}) cmake_deps.generate()
- 下游项目验证
下游项目通过find_package(vsg REQUIRED)后,无需手动执行include(vsgMacros),即可直接使用VSG的宏定义,和原生安装的使用体验完全一致。
轻量化替代方案:动态修改生成的Config文件
如果不想维护额外模板,可以在Conan生成Config文件后,直接追加宏文件引入语句:
def generate(self): from conan.tools.cmake import CMakeDeps cmake_deps = CMakeDeps(self) cmake_deps.generate() # 找到生成的vsgConfig.cmake,追加引入逻辑 config_file = self.generators_folder / "vsgConfig.cmake" if config_file.exists(): with open(config_file, "a") as f: f.write('\ninclude("${CMAKE_CURRENT_LIST_DIR}/vsgMacros.cmake")\n')
这种方式无需额外模板,但要确保vsgMacros.cmake已被正确打包到Conan包的lib/cmake/vsg目录下。
关键注意事项
- 打包时必须保证
vsgMacros.cmake和vsgConfig.cmake处于同一路径,否则CMAKE_CURRENT_LIST_DIR无法正确定位宏文件。 - VSG下游仓库(如vsgXchange)的Conan recipe只需依赖根仓库的vsg包,即可自动继承宏文件的隐式引入逻辑,无需额外配置。
内容的提问来源于stack exchange,提问作者Sebastian Messerschmidt
相关产品推荐
相关产品推荐

