8

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

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

因此,仅source config来自 shell 脚本的 a 以及include config来自Makefile. 但是,使用 CMake,语法变为SET(var1 value). 有没有一些简单的方法可以使用上面的语法向 CMake 提供带有变量的文件?我的意思是容易,因为我不喜欢跑sed过去。

4

3 回答 3

27

@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()
于 2013-06-18T12:28:22.817 回答
3

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

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

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

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

这将创建一个配置文件。

于 2013-06-18T11:25:52.187 回答
1

使用 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 对于某些内容可能不可靠。

于 2021-01-16T12:43:51.850 回答