2013-09-06 15 views
7

Mam wersję zmiennejPodział ciąg 3 zmienne w CMake

set(MY_PROGRAM_VERSION "2.5.1") 

programu i chcę zapisać 2,5,1 do 3 różne zmienne, jak

MY_PROGRAM_VERSION_MAJOR=2 
MY_PROGRAM_VERSION_MINOR=5 
MY_PROGRAM_VERSION_PATCH=1 

Ale naprawdę don wiesz, jak uzyskać dostęp do pojedynczych elementów na liście CMake. Jakiś pomysł?

Odpowiedz

0

Polecenie CMake'a string jest tutaj.

W przypadku ustawienia wartości zmiennej siebie i nie dostać go od pewnego źródła zewnętrznego, można użyć tej metody zamiast:

function(SetVersionNumber PREFIX VERSION_MAJOR VERSION_MINOR VERSION_PATCH) 
    set(${PREFIX}_VERSION_MAJOR ${VERSION_MAJOR} PARENT_SCOPE) 
    set(${PREFIX}_VERSION_MINOR ${VERSION_MINOR} PARENT_SCOPE) 
    set(${PREFIX}_VERSION_PATCH ${VERSION_PATCH} PARENT_SCOPE) 
    set(${PREFIX}_VERSION 
     "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}" 
     PARENT_SCOPE) 
endfunction() 

[...] 

SetVersionNumber(MY_PROGRAM 2 5 1) 
message(${MY_PROGRAM_VERSION_MAJOR}) 
message(${MY_PROGRAM_VERSION_MINOR}) 
message(${MY_PROGRAM_VERSION_PATCH}) 
message(${MY_PROGRAM_VERSION}) 

pozwala uniknąć konieczności wykonywania regex voodoo;)

+0

Dzięki, uratowałeś mój dzień! – linello

21

Według this i this przypuszczam trzeba przekształcić ciąg coś jak lista dosłownym i użyć GET na nowej liście:

cmake_minimum_required(VERSION 2.8) 

set(MY_PROGRAM_VERSION "2.5.1") 

string(REPLACE "." ";" VERSION_LIST ${MY_PROGRAM_VERSION}) 
list(GET VERSION_LIST 0 MY_PROGRAM_VERSION_MAJOR) 
list(GET VERSION_LIST 1 MY_PROGRAM_VERSION_MINOR) 
list(GET VERSION_LIST 2 MY_PROGRAM_VERSION_PATCH) 
2

można użyć następujących funkcji pomocnika automatycznie zmienne składowe wersja skonfigurować:

macro (setup_package_version_variables _packageName) 
    if (DEFINED ${_packageName}_VERSION) 
     string (REGEX MATCHALL "[0-9]+" _versionComponents "${${_packageName}_VERSION}") 
     list (LENGTH _versionComponents _len) 
     if (${_len} GREATER 0) 
      list(GET _versionComponents 0 ${_packageName}_VERSION_MAJOR) 
     endif() 
     if (${_len} GREATER 1) 
      list(GET _versionComponents 1 ${_packageName}_VERSION_MINOR) 
     endif() 
     if (${_len} GREATER 2) 
      list(GET _versionComponents 2 ${_packageName}_VERSION_PATCH) 
     endif() 
     if (${_len} GREATER 3) 
      list(GET _versionComponents 3 ${_packageName}_VERSION_TWEAK) 
     endif() 
     set (${_packageName}_VERSION_COUNT ${_len}) 
    else() 
     set (${_packageName}_VERSION_COUNT 0) 
     set (${_packageName}_VERSION "") 
    endif() 
endmacro() 

Makro można powoływać się w następujący sposób:

set(MY_PROGRAM_VERSION "2.5.1") 
setup_package_version_variables(MY_PROGRAM) 

makro ustawia również MY_PROGRAM_VERSION_COUNT do liczba składników wersji i MY_PROGRAM_VERSION_TWEAK, jeśli numer wersji zawiera 4 komponenty (np. "2.5.1.0")

1

Używam tej funkcji, aby uzyskać nazwę pakietu i wersje.

Tekst po poziomie poprawki jest pomijany. (Liba-v1.2.3-THIS_IS_SKIPPED)

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() 

Zastosowanie:

get_versions("TTN9Lib-V0.1.18" libname major minor patch) 

Zobacz szczegóły cmake_parse_versionstring.html

Powiązane problemy