【问题标题】:How to load variables in a "bar=foo" syntax in CMake?如何在 CMake 中以“bar=foo”语法加载变量?
【发布时间】:2013-06-18 09:57:24
【问题描述】:

很高兴能够在 Makefile 和 shell 脚本之间共享同一个文件,因为它们都可以处理以下键值对语法:

$> cat config 
  var1=value
  var2=value
  var3=value
  var4=value
  var5=value

因此,只需来自 shell 脚本的 source config 以及来自 Makefileinclude config 就可以了。但是,使用 CMake,语法变为 SET(var1 value)。有没有一些简单的方法可以使用上面的语法向 CMake 提供带有变量的文件?我的意思是容易,因为我不喜欢跑步,例如sed 在上面。

【问题讨论】:

    标签: cmake key-value


    【解决方案1】:

    @Guillaume 的答案非常适合从 CMakeLists.txt 中生成配置文件。

    但是,如果您希望将像这样的配置文件的内容导入您的 CMake 环境,则需要添加如下内容:

    file(STRINGS <path to config file> ConfigContents)
    foreach(NameAndValue ${ConfigContents})
      # Strip leading spaces
      string(REGEX REPLACE "^[ ]+" "" NameAndValue ${NameAndValue})
      # Find variable name
      string(REGEX MATCH "^[^=]+" Name ${NameAndValue})
      # Find the value
      string(REPLACE "${Name}=" "" Value ${NameAndValue})
      # Set the variable
      set(${Name} "${Value}")
    endforeach()
    

    【讨论】:

    • 我喜欢这种方法。它并不完全“简单”,但它不需要我现在使用的 sed 之类的依赖项。我只是没想到在 cmake 本身中使用正则表达式!
    • 嗯...将两个答案放在一个地方很好。它具有对称性:)
    【解决方案2】:

    创建一个 config.in 文件,其中包含要从 CMakeLists 中“提取”的所有变量:

    var1=@VAR1@
    var2=@VAR2@
    var3=@VAR3@
    var4=@VAR4@
    var5=@VAR4@
    

    并在您的 CMakeLists.txt 中添加 configure_file 调用:

    configure_file(
        ${CMAKE_CURRENT_SOURCE_DIR}/config.in
        ${CMAKE_CURRENT_BINARY_DIR}/config
        @ONLY
    )
    

    这将创建一个配置文件。

    【讨论】:

      【解决方案3】:

      使用 cmake 3.12 可以尝试这样的事情:

      file(STRINGS config CONFIG REGEX "^[ ]*[A-Za-z0-9_]+[ ]*=")
      list(TRANSFORM CONFIG STRIP)
      list(TRANSFORM CONFIG REPLACE "([^=]+)=[ ]*(.*)" "set(\\1 \"\\2\")\n")
      cmake_language(EVAL CODE ${CONFIG})
      
      # just for test
      message(STATUS "a=\"${a}\"")
      message(STATUS "b=\"${b}\"")
      

      测试:

      rion@dizzynb ~/temp $ cmake --trace -P test.cmake 
      Running with trace output on.
      /home/rion/temp/test.cmake(1):  file(STRINGS config CONFIG REGEX ^[ ]*[A-Za-z0-9_]+[ ]*= )
      /home/rion/temp/test.cmake(2):  list(TRANSFORM CONFIG STRIP )
      /home/rion/temp/test.cmake(3):  list(TRANSFORM CONFIG REPLACE ([^=]+)=[ ]*(.*) set(\\1 \"\\2\")\n )
      /home/rion/temp/test.cmake(4):  cmake_language(EVAL CODE ${CONFIG} )
      /home/rion/temp/test.cmake:4:EVAL(1):  set(a hello world )
      /home/rion/temp/test.cmake:4:EVAL(2):  set(b 10 )
      /home/rion/temp/test.cmake(6):  message(STATUS a=\"${a}\" )
      -- a="hello world"
      /home/rion/temp/test.cmake(7):  message(STATUS b=\"${b}\" )
      -- b="10"
      
      rion@dizzynb ~/temp $ cat config 
      # this is my config
      a=hello world
       b = 10 
      #c= O_o
      

      但请记住,上面的 eval 对于某些内容可能不可靠。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-04
        • 2019-10-07
        • 1970-01-01
        • 1970-01-01
        • 2017-09-20
        • 2011-11-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多