我正在尝试编写执行以下操作的CMake脚本:
使用execute_process指令读取命令的输出并将其存储到名为' STRING_VARIABLE'的变量中。返回其中包含字符和数字的内容的命令。像这样:RESULT-v1.2.8 -...
我已正确读取此值并将其显示在终端上以确认此值。 现在我要做的是存储此输出的前三位数字并将它们存储在另外3个变量中:' FIRST_DIGIT',' SECOND_DIGIT'并且' THIRD_DIGIT'。
我的逻辑是这样的: 每次在变量名中遇到数字时使用计数器计数。每次遇到一个数字时,将数字存储在三个变量之一中,然后递增计数器。因此,计数器从0到2进行计数,并且对于这3个值中的每一个都进行存储。
这是我写的脚本:
SET(COUNTER 0)
foreach(LETTER ${STRING_VARIABLE})
if(LETTER EQUAL '0,1,2,3,4,5,6,7,8,9')
if( COUNTER EQUAL 0 ) # if first digit is encountered
list(GET STRING_VARIABLE LETTER FIRST_DIGIT) # store it in FIRST_DIGIT
SET(COUNTER 1)
elseif( COUNTER EQUAL 1 ) # if second digit is encountered
list(GET STRING_VARIABLE LETTER SECOND_DIGIT) # store it in SECOND_DIGIT
SET(COUNTER 2)
else( COUNTER EQUAL 2 ) # if second digit is encountered
list(GET STRING_VARIABLE LETTER THIRD_DIGIT) # store it in THIRD_DIGIT
endif()
endif()
endforeach()
# To check the variables
#message("*****${STRING_VARIABLE}") # OK!
message("*****${FIRST_DIGIT}") # NOT OK :(
由于我是CMake的初学者,我认为我的问题出现在两个(或两个)中的任何一个: - 循环通过' STRING_VARIABLE'我使用了foreach(LETTER),因为我的字符串也包含数字,程序可能看不到它们。如果这是错误,我还应该替换LETTER以获取字符串的每个字符? - 在第一个如果我在哪里检查' LETTER'是一个数字。我认为这是正确的语法,尽管我不确定。基本上我在那里做的是试图检查每个索引处的字母是否是一个数字。
' STRING_VARIABLE'正如我所说,打印好。 但是当我尝试打印'FIRST_DIGIT'或者3(第二和第三)中的任何其他我得到一个空字符串作为结果。 请帮助我理解我的逻辑中的错误以及我做错了什么。
请帮助我理解我做错了什么。谢谢。
答案 0 :(得分:0)
如果知道格式,可以使用字符串(REGEX REPLACE ...)。
功能:
function(get_versions versionstring libname major minor patch)
string(REGEX REPLACE "([A-Za-z0-9_]*)-[vV].*" "\\1" locallibname ${versionstring} )
set(libname ${locallibname} PARENT_SCOPE)
string(REGEX REPLACE "^([A-Za-z0-9_]*-[vV])([0-9]*)([.][0-9]*[.][0-9]*-?.*)$" "\\2" numbers ${versionstring} )
set(major ${numbers} PARENT_SCOPE)
string(REGEX REPLACE "^([A-Za-z0-9_]*-[vV][0-9]*[.])([0-9]*)([.][0-9]*-?.*)$" "\\2" numbers ${versionstring} )
set(minor ${numbers} PARENT_SCOPE)
string(REGEX REPLACE "^([A-Za-z0-9_]*-[vV][0-9]*[.][0-9]*[.])([0-9]*)(-?.*)$" "\\2" numbers ${versionstring} )
set(patch ${numbers} PARENT_SCOPE)
endfunction()
用法:
get_versions("MyLib-V11.222.034-remark" libname major minor patch)
status_ref(libname)
status_ref(major)
status_ref(minor)
status_ref(patch)
结果:
STATUS: libname = "MyLib"
STATUS: major = "11"
STATUS: minor = "222"
STATUS: patch = "034"