很高兴能够在Makefile和shell脚本之间共享相同的文件,因为它们都可以处理键值对的以下语法:
$> cat config
var1=value
var2=value
var3=value
var4=value
var5=value
因此,只需一个来自shell脚本的source config
就可以了,以及来自include config
的{{1}}。但是,使用CMake语法变为Makefile
。有一些简单的方法,我可以使用上面的语法用变量文件提供CMake吗?我的意思很简单,我不喜欢跑步,例如SET(var1 value)
超过它。
答案 0 :(得分:14)
@ 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()
答案 1 :(得分: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
)
这将创建一个配置文件。
答案 2 :(得分: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 对于某些内容可能不可靠。