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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:12:44