如何用CMake读取已安装库的config.mk文件至本地变量
如何用CMake读取config.mk中的变量?
我已编译安装了MFEM库,在${INSTALL_PATH}/share目录下存在一个config.mk文件,内容如下:
MFEM_VERSION = 40502 MFEM_VERSION_STRING = 4.5.2 MFEM_SOURCE_DIR = /home/hbui/sw2/mfem-all/mfem-4.5.2 MFEM_INSTALL_DIR = /opt/mfem-4.5.2 MFEM_GIT_STRING = (unknown) MFEM_USE_MPI = YES MFEM_USE_METIS = YES MFEM_USE_METIS_5 = YES MFEM_DEBUG = NO
以下是两种可行的CMake实现方式:
方法一:逐行解析文件内容
通过file(STRINGS)读取文件所有行,再遍历解析变量定义,适合处理包含注释或特殊格式的config.mk:
# 定义config.mk的路径 set(CONFIG_MK_PATH "${INSTALL_PATH}/share/config.mk") # 读取文件所有行到列表中 file(STRINGS "${CONFIG_MK_PATH}" CONFIG_MK_LINES) # 遍历每行解析变量 foreach(LINE IN LISTS CONFIG_MK_LINES) # 跳过空行和注释行 if(LINE MATCHES "^#.*$" OR LINE STREQUAL "") continue() endif() # 匹配"变量名 = 值"的格式,兼容前后空格 if(LINE MATCHES "^([A-Z_]+)[ \t]*=[ \t]*(.*)$") set(VAR_NAME "${CMAKE_MATCH_1}") set(VAR_VALUE "${CMAKE_MATCH_2}") # 移除值两端的多余空格 string(STRIP "${VAR_VALUE}" VAR_VALUE) # 将解析结果设置为CMake本地变量 set(${VAR_NAME} "${VAR_VALUE}") endif() endforeach() # 验证变量是否读取成功 message(STATUS "MFEM_USE_MPI: ${MFEM_USE_MPI}") message(STATUS "MFEM_VERSION_STRING: ${MFEM_VERSION_STRING}")
方法二:直接包含文件
如果config.mk仅包含简单的变量赋值(无Makefile特有语法,如条件判断、函数调用),可直接用include()命令,CMake会自动识别并加载变量:
# 直接包含config.mk,加载其中的变量 include("${INSTALL_PATH}/share/config.mk") # 验证变量 message(STATUS "MFEM_INSTALL_DIR: ${MFEM_INSTALL_DIR}") message(STATUS "MFEM_DEBUG: ${MFEM_DEBUG}")
注意事项
- 方法二更简洁,但如果
config.mk包含Makefile专属语法,会导致CMake报错; - 方法一兼容性更强,可自定义处理逻辑(比如过滤特定变量、转换值类型)。
内容的提问来源于stack exchange,提问作者kstn
相关产品推荐
相关产品推荐

