CMake:循环一个字符串并获得前三位

时间:2018-02-01 16:54:26

标签: makefile scripting cmake

我正在尝试编写执行以下操作的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(第二和第三)中的任何其他我得到一个空字符串作为结果。 请帮助我理解我的逻辑中的错误以及我做错了什么。

请帮助我理解我做错了什么。谢谢。

1 个答案:

答案 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"