109 votes

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

Mon CMakeLists.txt contient cette ligne :

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

et le IlmImf Le dossier contient b44ExpLogTable.cpp que je dois exclure de la construction.

Comment y parvenir ?

124voto

Lindydancer Points 13353

Vous pouvez utiliser le list pour manipuler la liste, par exemple :

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

Dans votre cas, quelque chose comme ceci pourrait fonctionner :

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

63voto

Eugene Points 1457

FILTRE 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 Spécification de Regex pour cmake :

The following characters have special meaning in regular expressions:

^         Matches at the beginning of input
$         Matches at the 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).

3voto

James Points 41

Essayez ceci : 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

1voto

Stefan Falk Points 1224

Je ne suis pas très familier avec cmake mais j'ai trouvé ce ici.

0voto

arm Points 1

L'autre façon de faire est de laisser le fichier source inclus et d'utiliser la définition du préprocesseur pour éviter que le code soit compilé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X