2013-09-06 21 views
7

Ich habe eine Programmversion VariableSplit String 3 Variablen in CMake

set(MY_PROGRAM_VERSION "2.5.1") 

und ich möchte 2,5,1 zu 3 verschiedene Variablen speichern, wie

MY_PROGRAM_VERSION_MAJOR=2 
MY_PROGRAM_VERSION_MINOR=5 
MY_PROGRAM_VERSION_PATCH=1 

Aber ich wirklich don Ich weiß nicht, wie ich auf einzelne Elemente in einer CMake-Liste zugreifen kann. Irgendeine Idee?

Antwort

0

CMake string Befehl ist der Weg, hier zu gehen.

Falls Sie den Wert der Variablen selbst gesetzt und es nicht von einer Drittanbieter-Quelle bekommen, könnte man diesen Ansatz will stattdessen verwenden:

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

erspart Sie, Regex zu tun Voodoo;)

+0

Danke, gespeichert Sie meinen Tag! – linello

21

nach this und this ich würde vermuten Sie die Zeichenfolge so etwas wie eine Liste umwandeln müssen wörtliche und GET auf Ihre neue Liste zu verwenden:

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

Sie können folgende Hilfsfunktion verwenden, um automatisch die Version Komponentenvariablen eingerichtet haben:

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

Das Makro kann auf folgende Weise aufgerufen werden:

set(MY_PROGRAM_VERSION "2.5.1") 
setup_package_version_variables(MY_PROGRAM) 

Das Makro setzt auch MY_PROGRAM_VERSION_COUNT auf die Anzahl der Versionskomponenten und MY_PROGRAM_VERSION_TWEAK wenn die Versionsnummer 4 Komponenten hat (zB "2.5.1.0")

1

Ich benutze diese Funktion, um den Paketnamen und die Versionen zu erhalten.

Text nach dem Patch-Level wird übersprungen. (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() 

Verbrauch:

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

Details sehen cmake_parse_versionstring.html