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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:43:32