2013-03-22 14 views
5

Così ho elenco di file (o valori) come questoCMake regex partita directory nella lista

set(HEADER_FILES DirA/header1.h DirA/header2.hpp 
       DirB/header3.h DirB/stuff.hpp) 

Poi come faccio a ottenere l'elenco dei file sub solo in DIRA? Sto usando CMake 2.8.x e mi stanco partita regex:

string(REGEX MATCHALL "DirA/(.+)" DirA_FILES ${HEADER_FILES}) 

Ma risultato è solo copia della stringa originale come: "Dira/header1.h Dira/header2.hpp DIRB/header3.h DIRB/stuff.hpp "o niente.

Bene ancora una volta, come sempre, durante la scrittura di questa domanda ho risolto:

set(SubListMatch) 
foreach(ITR ${HEADER_FILES}) 
    if(ITR MATCHES "(.*)DirA/(.*)") 
     list(APPEND SubListMatch ${ITR}) 
    endif() 
endforeach() 

Ma CMake è abbastanza cosa nuova per me, così come faccio avvolgere il codice in funzione? Non ho mai scritto nessuna funzione di CMake finora.

risposta

4

È possibile trasformarlo in una funzione come questa:

# Define function 
function(GetSubList resultVar) 
    set(result) 
    foreach(ITR ${ARGN}) # ARGN holds all arguments to function after last named one 
    if(ITR MATCHES "(.*)DirA/(.*)") 
     list(APPEND result ${ITR}) 
    endif() 
    endforeach() 
    set(${resultVar} ${result} PARENT_SCOPE) 
endfunction() 

# Call it 
GetSubList(SubListMatch ${HEADER_FILES}) 

Quando questo codice viene eseguito, SubListMatch terrà gli elementi corrispondenti.

È possibile migliorare la funzione, ad es. dandogli un parametro in più per il nome della directory, in modo che altri che DirA possono essere abbinati per:

function(GetSubList resultVar dirName) 
    # as before, except the if() 
    if(ITR MATCHES "(.*)${dirName}/(.*)") 
    # same as before 
endfunction() 
Problemi correlati