如何从CMake向conanfile.py传递变量并在package方法中访问?
从CMake向Conan的package方法传递变量的实现方案
有两种可靠的方式可以实现这个需求,具体如下:
方法一:通过CMake缓存变量直接读取(推荐)
如果要传递的值是CMake中的缓存变量(通过CACHE关键字定义),可以直接在Conan的build方法中读取该变量,并存储到self对象的属性中,供package方法使用。
步骤1:在CMakeLists.txt中定义缓存变量
# 定义需要传递的缓存变量,INTERNAL表示仅内部使用,不暴露给用户 set(MY_CUSTOM_VAR "my_target_value" CACHE INTERNAL "Variable to pass to Conan")
步骤2:在conanfile.py的build方法中读取并保存变量
from conans import ConanFile, CMake class MyPackageConan(ConanFile): name = "my_package" version = "1.0.0" def build(self): cmake = CMake(self) cmake.configure() # 读取CMake缓存中的变量 self.my_custom_var = cmake.get_variable("MY_CUSTOM_VAR") cmake.build() def package(self): # 在package方法中直接访问存储的变量 self.output.info(f"Received value from CMake: {self.my_custom_var}") # 执行打包逻辑...
方法二:通过生成中间文件传递(适用于复杂或动态生成的值)
如果要传递的值是动态生成的,或者需要传递多个变量,可以让CMake生成一个包含变量内容的文件(如JSON、文本文件),再在Conan中读取该文件并解析。
步骤1:在CMakeLists.txt中生成变量文件
# 生成JSON格式的变量文件,方便Python解析 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/conan_vars.json" "{\"LIB_VERSION\": \"1.2.3\", \"BUILD_TYPE\": \"${CMAKE_BUILD_TYPE}\"}")
步骤2:在conanfile.py中读取文件并保存变量
from conans import ConanFile, CMake import json class MyPackageConan(ConanFile): name = "my_package" version = "1.0.0" def build(self): cmake = CMake(self) cmake.configure() cmake.build() # 读取CMake生成的JSON文件 var_file = f"{self.build_folder}/conan_vars.json" with open(var_file, "r") as f: self.conan_vars = json.load(f) def package(self): # 访问传递过来的变量 self.output.info(f"Library version: {self.conan_vars['LIB_VERSION']}") self.output.info(f"Build type: {self.conan_vars['BUILD_TYPE']}") # 执行打包逻辑...
注意事项
- 确保CMake中写入文件的路径和Conan中读取的路径一致,
CMAKE_CURRENT_BINARY_DIR对应Conan中的self.build_folder。 - 如果使用文本文件传递单个变量,可直接按键值对格式写入,Python读取后拆分即可。
内容的提问来源于stack exchange,提问作者user3852441
相关产品推荐
相关产品推荐

