如何在CMake中配置Conan包提供的convert.exe路径到指定变量
如何在CMake中获取Conan包内convert.exe的路径
问题描述
我有一个基于CMake的项目,需要使用convert.exe转换测试数据,转换逻辑写在convert.cmake的自定义宏里:
set( ConversionCall ${ConvertExecutablePath} -i -w -k) macro( convert_test_data InputFilename ) set( OutputFilename ${InputFilename}.converted) add_custom_command( OUTPUT ${OutputFilename} COMMAND ${ConversionCall} ${InputFilename} ${OutputFilename} MAIN_DEPENDENCY ${InputFilename} ) endmacro (convert_test_data)
这个convert.exe由Conan开发工具包提供,对应的Conan配方如下,会克隆包含convert.exe的Git仓库并将工具打包到Conan包的bin目录:
from conans import ConanFile, tools class ConvertConan(ConanFile): name = "convert" version = "6.7.9" settings = "os" no_copy_source = True description="Provides the test data conversion tool." def build(self): self.run("git clone https://myrepo") def package(self): self.copy("*", src="myrepo/tools", dst="bin", keep_path=False)
因为convert.exe名称太通用,我不想把它的路径加到系统环境变量里,希望直接把Conan包中convert.exe的路径赋值给CMake变量ConvertExecutablePath,但按照官方文档方法尝试后失败了,请问该怎么定义这个变量?
解决方案
要正确获取Conan包内convert.exe的路径,需要从Conan侧传递路径信息到CMake,或者在CMake中直接查询Conan生成的文件,以下两种方式均可实现:
方法1:修改Conan配方,暴露路径给CMake
在Conan包的配方中添加package_info()方法,将convert.exe的路径通过CMake变量直接暴露:
from conans import ConanFile, tools class ConvertConan(ConanFile): name = "convert" version = "6.7.9" settings = "os" no_copy_source = True description="Provides the test data conversion tool." def build(self): self.run("git clone https://myrepo") def package(self): self.copy("*", src="myrepo/tools", dst="bin", keep_path=False) def package_info(self): # 通过CMake变量传递完整路径 self.cpp_info.cmake_vars["ConvertExecutablePath"] = f"{self.package_folder}/bin/convert.exe"
之后在CMake项目中,加载Conan构建信息后即可直接使用变量:
# 加载Conan构建信息(根据Conan版本选择对应方法) include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) conan_basic_setup() # 直接使用Conan传递的变量 set(ConversionCall ${ConvertExecutablePath} -i -w -k)
方法2:在CMake中直接查询Conan包路径
如果不想修改Conan配方,可以在CMake中通过Conan生成的配置文件获取包的安装路径,再拼接出convert.exe的完整路径:
# 加载Conan构建信息 include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) conan_basic_setup() # 获取convert包的根目录 get_property(CONVERT_PACKAGE_DIR GLOBAL PROPERTY CONAN_CONVERT_ROOT) # 拼接出convert.exe的路径 set(ConvertExecutablePath "${CONVERT_PACKAGE_DIR}/bin/convert.exe") # 后续使用该变量 set(ConversionCall ${ConvertExecutablePath} -i -w -k)
针对Conan 2.x版本:需改用工具链文件并通过find_package引入包,再从目标属性中获取路径:
find_package(convert REQUIRED) # 从导入目标中提取可执行文件路径 get_target_property(ConvertExecutablePath convert::convert IMPORTED_LOCATION)
关键注意事项
- 若涉及跨平台,需根据
CMAKE_HOST_SYSTEM_NAME判断可执行文件后缀(Windows为.exe,Linux/macOS无后缀)。 - 确保路径中无空格,或使用引号包裹路径避免解析错误。
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

