2015-02-15 8 views
6

In cmake, come posso verificare se un token di stringa è incluso in un'altra stringa?controllo inclusione del token stringa cmake

Nel mio caso, vorrei sapere se il nome del compilatore contiene la stringa "Clang" (ad esempio "clang", "AppleClang", ...). Tutto quello che potevo fare finora è:

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") 
... 
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang") 
... 

Vorrei un approccio più flessibile, come il controllo per la presenza di una stringa.

Questo è ciò che nella documentazione che ho trovato:

se (corrisponde all'espressione regolare) True se la stringa data o il valore della variabile corrisponde all'espressione regolare data.
if (MENO) Vero se la stringa o il valore di una variabile è un numero valido e inferiore a quello a destra.
if (GREATER) Vero se la stringa o il valore di una variabile è un numero valido e maggiore di quello a destra.
if (EQUAL) Vero se la stringa o il valore di una variabile è un numero valido e uguale a quello a destra.
if (STRLESS) Vero se la stringa o il valore di una determinata variabile è lessicograficamente inferiore alla stringa o alla variabile a destra.
if (STRGREATER) Vero se la stringa o il valore di una determinata variabile è lessicograficamente maggiore della stringa o della variabile a destra.
if (STREQUAL) Vero se la stringa o il valore di una variabile data è lessicograficamente uguale alla stringa o alla variabile a destra.

+0

Uno degli approcci che si elencato sarà la risposta finale, ma senza un chiaro esempio del token che stai cercando e della stringa che stai cercando, nessuno sarà in grado di indirizzarti più da vicino. – kdopen

risposta

7

if(<variable|string> MATCHES regex) sarà probabilmente quello che stai cercando.

In questo caso particolare (supponendo che si sta facendo la stessa cosa all'interno del blocco per Clang e AppleClang) allora si può sostituire:

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") 
... 
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang") 
... 

con:

if(CMAKE_CXX_COMPILER_ID MATCHES "^(Apple)?Clang$") 
+0

Per quello che devo fare, funziona perfettamente: 'if (CMAKE_CXX_COMPILER_ID MATCHES" Clang ")' – Pietro

+0

E poiché l'iniziale può essere maiuscola o minuscola: 'if (CMAKE_CXX_COMPILER_ID MATCHES" (C | c?) Lang ")' – Pietro

+4

@Pietro Questo perché, sebbene mal documentato, MATCHES restituisce true quando la stringa ricercata è * contenuta * nella stringa analizzata. Questa è almeno la mia esperienza, testata in diversi casi, ma ancora una volta la documentazione non è chiara su questo aspetto. – Antonio

Problemi correlati