Comment exclure un seul fichier d'un modèle cmake `file (GLOB…)`?

86

My CMakeLists.txtcontient cette ligne:

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

et le IlmImfdossier contient b44ExpLogTable.cpp, que je dois exclure de la construction.

Comment y parvenir?

berak
la source

Réponses:

100

Vous pouvez utiliser la listfonction pour manipuler la liste, par exemple:

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

Dans votre cas, peut-être que quelque chose comme ça fonctionnera:

list(REMOVE_ITEM lib_srcs "IlmImf/b44ExpLogTable.cpp")
Lindydancer
la source
1
outre lib_srcs au lieu de lib_src et IlmImf au lieu d'IlmThread, cela a fait l'affaire! Merci beaucoup !
berak
20
Remarque: lorsque vous supprimez l'élément de la liste, assurez-vous que la valeur que vous recherchez correspond exactement à ce qu'elle est dans la liste. J'avais des difficultés à mélanger $ {CMAKE_SOURCE_DIR} /src/file_to_remove.cpp avec $ {CMAKE_CURRENT_SOURCE_DIR} /../ file_to_remove.cpp. Il pointe vers le même emplacement, mais ce n'est pas la même chaîne. message ("$ {VARIABLE_NAME}") peut vous aider à déboguer ces contenus.
hbobenicio
Cela n'aide pas si vous utilisez CONFIGURE_DEPENDSet devez exclure un fichier produit par la construction. Un filtre sur la liste après l' fileappel déclenche toujours une reconstruction que, dans mon cas, j'essaie d'éviter.
simon.watts
C'est beaucoup mieux d'utiliserlist(FILTER
hukeping le
2
La solution ci-dessus ne fonctionne pas pour moi avec camke version 3.10.2 Mais la solution ci-dessous: list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>) fonctionne bien pour moi.
MH Yip
42

FILTER est une autre option qui pourrait être plus pratique dans certains cas:

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

Cette ligne exclut tous les éléments se terminant par le nom de fichier requis:

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

Voici la spécification Regex pour 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).
Eugène
la source
Peut être beaucoup plus fiable que de se débrouiller avec des chemins absolus / relatifs
EFraim
1
Bien mieux quelist(REMOVE_ITEM
ceztko
1
Notez qui a list(FILTER ...)été introduit dans cmake v3.6: stackoverflow.com/a/42167646/3476780
yano
C'est certainement une meilleure réponse, bien que si vous essayez de l'utiliser pour exclure un répertoire entier ou si votre regex est foirée, vous pourriez en exclure plus que vous ne le souhaitez. Par exemple, essayer d'exclure .*test/.*peut tout exclure si votre projet se trouve dans une arborescence de répertoires où l'un des répertoires parents est appelé quelque chose comme mytest.
AnthonyD973
1

essaye ça : 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
la source