2015-05-05 21 views
10

get_filename_component może być użyty do usunięcia/wypakowania najdłuższego przedłużenia.Usuń nazwę pliku (najkrótszy) przez CMake (pobierz nazwę pliku usuwając ostatnie rozszerzenie)

EXT = nazwa pliku najdłuższy przedłużenie (.BC od d/ABC)

NAME_WE = nazwa pliku bez rozszerzenia katalogu lub najdłuższym

Mam plik z kropką w nazwie, więc muszę najkrótszą rozszerzenia:

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

donosi

-- a 

ale chcę

-- a.b.c 

Co jest najlepszym sposobem, aby znaleźć nazwę pliku bez rozszerzenia najkrótszym?

Odpowiedz

2

chciałbym rozwiązać ten problem za pomocą prostego wyrażenia regularnego:

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

Uważam, że można to zrobić w jednym wierszu, proszę sprawdzić moją odpowiedź poniżej. – Antonio

11

zrobiłbym:

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

Wyrażenie regularne dopasowuje kropkę (\\., patrz następny akapit), a następnie przez dowolną liczbę znaków, które nie są kropkami [^.]* do końca ciągu znaków ($), a następnie zastępuje go pustym ciągiem "".

Kropka metaznaków (zwykle w wyrażeniu regularnym oznacza "dopasuj dowolny znak") musi zostać zmieniona na wartość \, aby była interpretowana jako kropka literalna. Jednak w literałach ciągów CMake (takich jak literały łańcuchowe C), \ jest znakiem specjalnym i need to be escaped as well (patrz także here). Dlatego otrzymujesz dziwną sekwencję \\..

Zauważ, że (prawie wszystkie) metacharacters do not need to be escaped within a Character Class: dlatego mamy [^.] i nie [^\\.].

Na koniec zwróć uwagę, że to wyrażenie jest bezpieczne również wtedy, gdy w analizowanej nazwie pliku nie ma kropki (w tym przypadku wynik odpowiada wejściowemu łańcuchowi znaków).

Link do string command documentation.

+0

Masz rację, działa też jeden liniowiec. Ale potrzeba podwójnego ukośnika nie ma nic wspólnego z literałami napisanymi w języku C - jest to po prostu fakt, że ukośnik odwrotny jest także ucieczką CMake'a, która ją powoduje. – Angew

+0

@Angew Czy mówisz, że [odpowiedź, którą podłączyłem] (http://stackoverflow.com/questions/4490793/cmake-how-to-get-the-backslash-literal-in-regexp-replace/4490920#4490920) jest źle? – Antonio

+0

Tak; Skomentowałem ten efekt w odpowiedzi. – Angew

Powiązane problemy