2015-05-05 3 views
10

get_filename_component può essere utilizzato per rimuovere/estrarre l'estensione più lunga.Estensione del nome file strip (più breve) da CMake (ottenere il nome file che rimuove l'ultima estensione)

EXT = Nome file più lungo estensione (.BC da d/abc)

NAME_WE = nome del file senza directory o l'estensione più lunga

Ho un file con un punto nel suo nome, quindi ho bisogno l'estensione più breve:

set(MYFILE "a.b.c.d") 
get_filename_component(MYFILE_WITHOUT_EXT ${MYFILE} NAME_WE) 
message(STATUS "${MYFILE_WITHOUT_EXT}") 

riporta

-- a 

ma voglio

-- a.b.c 

Qual è il modo migliore per trovare il nome del file senza l'estensione più breve?

risposta

2

mi piacerebbe risolvere questo con una semplice espressione regolare:

string(REGEX MATCH "^(.*)\\.[^.]*$" dummy ${MYFILE}) 
set(MYFILE_WITHOUT_EXT ${CMAKE_MATCH_1}) 
+0

Credo che si possa fare in una riga, per favore controlla la mia risposta qui sotto. – Antonio

11

lo farei:

string(REGEX REPLACE "\\.[^.]*$" "" MYFILE_WITHOUT_EXT ${MYFILE}) 

L'espressione regolare corrisponde a un punto (\\., vedi paragrafo successivo), seguita da un numero qualsiasi di caratteri che non è un punto [^.]* fino alla fine della stringa ($), quindi lo sostituisce con una stringa vuota "".

Il punto del metacarattere (normalmente in un'espressione regolare significa "corrisponde a qualsiasi carattere") deve essere preceduto da escape con un \ da interpretare come un punto letterale. Tuttavia, in letterali stringa CMake (come i letterali stringa C), \ è un carattere speciale e need to be escaped as well (vedere anche here). Quindi ottieni la strana sequenza \\..

Nota che (quasi tutto) metacharacters do not need to be escaped within a Character Class: pertanto abbiamo [^.] e non [^\\.].

Infine, si noti che questa espressione è sicura anche se non vi è alcun punto nel nome file analizzato (l'uscita corrisponde alla stringa di input in quel caso).

Collegamento a string command documentation.

+0

Hai ragione, anche l'one-liner funziona. Ma la necessità di raddoppiare i backslash non ha nulla a che fare con i letterali stringa C - è semplicemente il fatto che il backslash è anche il carattere di escape di CMake che lo causa. – Angew

+0

@Angew Stai dicendo che [la risposta che ho linkato] (http://stackoverflow.com/questions/4490793/cmake-how-to-get-the-backslash-literal-in-regexp-replace/4490920#4490920) è sbagliato? – Antonio

+0

Sì; Ho commentato questo effetto sulla risposta. – Angew