Come escludo un singolo file da un cmake `file (GLOB ...)` pattern?


90

My CMakeLists.txtcontiene questa riga:

file(GLOB lib_srcs Half/half.cpp Iex/*.cpp IlmThread/*.cpp Imath/*.cpp IlmImf/*.cpp)

e la IlmImfcartella contiene b44ExpLogTable.cpp, che devo escludere dalla build.

Come ottenerlo?

Risposte:


104

È possibile utilizzare la listfunzione per manipolare l'elenco, ad esempio:

list(REMOVE_ITEM <list> <value> [<value> ...])

Nel tuo caso, forse qualcosa del genere funzionerà:

list(REMOVE_ITEM lib_srcs "IlmImf/b44ExpLogTable.cpp")

1
oltre a lib_srcs invece di lib_src e IlmImf invece di IlmThread, questo ha funzionato! grazie mille!
berak

21
Nota: quando si rimuove l'elemento dall'elenco, assicurarsi che il valore che si sta cercando corrisponda esattamente a quello che si trova nell'elenco. Ho avuto qualche problema a mescolare $ {CMAKE_SOURCE_DIR} /src/file_to_remove.cpp con $ {CMAKE_CURRENT_SOURCE_DIR} /../ file_to_remove.cpp. Punta alla stessa posizione, ma non è la stessa stringa. message ("$ {VARIABLE_NAME}") può aiutarti a eseguire il debug di quei contenuti.
hbobenicio

Questo non aiuta se stai usando CONFIGURE_DEPENDSe devi escludere un file prodotto dalla build. Un filtro nell'elenco dopo la filechiamata attiva ancora una ricostruzione che, nel mio caso, sto cercando di evitare.
simon.watts

È molto meglio da usarelist(FILTER
hukeping

3
La soluzione di cui sopra non funziona per me con camke versione 3.10.2 Ma la soluzione di seguito: list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>) funziona bene per me.
MH Yip

44

FILTER è un'altra opzione che potrebbe essere più conveniente in alcuni casi:

list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>)

Questa riga esclude ogni elemento che termina con il nome file richiesto:

list(FILTER lib_srcs EXCLUDE REGEX ".*b44ExpLogTable.cpp$")

Ecco la specifica Regex per cmake:

The following characters have special meaning in regular expressions:

^         Matches at beginning of input
$         Matches at end of input
.         Matches any single character
[ ]       Matches any character(s) inside the brackets
[^ ]      Matches any character(s) not inside the brackets
 -        Inside brackets, specifies an inclusive range between
          characters on either side e.g. [a-f] is [abcdef]
          To match a literal - using brackets, make it the first
          or the last character e.g. [+*/-] matches basic
          mathematical operators.
*         Matches preceding pattern zero or more times
+         Matches preceding pattern one or more times
?         Matches preceding pattern zero or once only
|         Matches a pattern on either side of the |
()        Saves a matched subexpression, which can be referenced
          in the REGEX REPLACE operation. Additionally it is saved
          by all regular expression-related commands, including
          e.g. if( MATCHES ), in the variables CMAKE_MATCH_(0..9).

Può essere molto più affidabile che andare in giro con
percorsi

1
Molto meglio dilist(REMOVE_ITEM
ceztko

1
Si noti che list(FILTER ...)è stato introdotto nel cmake v3.6: stackoverflow.com/a/42167646/3476780
Yano

Questa è sicuramente una risposta migliore, anche se se stai cercando di usarlo per escludere un'intera directory o se la tua espressione regolare è incasinata, potresti escludere più di quanto desideri. Ad esempio, il tentativo di escludere .*test/.*potrebbe escludere tutto se il progetto si trova all'interno di un albero di directory in cui una delle directory principali è chiamata qualcosa di simile mytest.
AnthonyD973

1

prova questo : CMakeLists.txt

install(DIRECTORY   ${CMAKE_SOURCE_DIR}/ 
            DESTINATION ${CMAKE_INSTALL_PREFIX}
            COMPONENT   copy-files
            PATTERN     ".git*"   EXCLUDE
            PATTERN     "*.in"    EXCLUDE
            PATTERN     "*/build" EXCLUDE)

add_custom_target(copy-files
            COMMAND ${CMAKE_COMMAND} -D COMPONENT=copy-files
            -P cmake_install.cmake)
$cmake <src_path> -DCMAKE_INSTALL_PREFIX=<install_path>
$cmake --build . --target copy-files
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.