¿Cómo excluyo un solo archivo de un patrón cmake `file (GLOB…)`?

86

Mi CMakeLists.txtcontiene esta línea:

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

y la IlmImfcarpeta contiene b44ExpLogTable.cpp, que necesito excluir de la compilación.

¿Cómo lograrlo?

Berak
fuente

Respuestas:

100

Puede utilizar la listfunción para manipular la lista, por ejemplo:

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

En su caso, tal vez algo como esto funcione:

list(REMOVE_ITEM lib_srcs "IlmImf/b44ExpLogTable.cpp")
Lindydancer
fuente
1
además de lib_srcs en lugar de lib_src e IlmImf en lugar de IlmThread, ¡Eso funcionó! gracias una tonelada !
berak
20
Nota: Al eliminar el elemento de la lista, asegúrese de que el valor que está buscando coincida exactamente con el que aparece en la lista. Tenía algunos problemas para mezclar $ {CMAKE_SOURCE_DIR} /src/file_to_remove.cpp con $ {CMAKE_CURRENT_SOURCE_DIR} /../ file_to_remove.cpp. Apunta a la misma ubicación, pero no es la misma cadena. message ("$ {VARIABLE_NAME}") puede ayudarlo a depurar esos contenidos.
hbobenicio
Esto no ayuda si usa CONFIGURE_DEPENDSy necesita excluir un archivo producido por la compilación. Un filtro en la lista después de la filellamada aún activa una reconstrucción que, en mi caso, estoy tratando de evitar.
simon.watts
Es mucho mejor de usarlist(FILTER
hukeping el
2
La solución anterior no me funciona con la versión 3.10.2 de camke, pero la solución a continuación: list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>) funciona bien para mí.
MH Yip
42

FILTRO es otra opción que podría ser más conveniente en algunos casos:

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

Esta línea excluye todos los elementos que terminan con el nombre de archivo requerido:

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

Aquí está la especificación Regex para 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).
Eugenio
fuente
Puede ser mucho más confiable que jugar con pathes absolutos / relativos
EFraim
1
Mucho mejor quelist(REMOVE_ITEM
ceztko
1
Tenga en cuenta que list(FILTER ...)se introdujo en cmake v3.6: stackoverflow.com/a/42167646/3476780
yano
Esta es definitivamente una mejor respuesta, aunque si está tratando de usar esto para excluir un directorio completo o si su expresión regular está desordenada, puede excluir más de las que desea. Por ejemplo, intentar excluir .*test/.*podría excluir todo si su proyecto está dentro de un árbol de directorios donde uno de los directorios principales se llama algo así como mytest.
AnthonyD973
1

prueba esto : 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
James
fuente