Как мне исключить отдельный файл из шаблона cmake `файл (GLOB…)`?

86

My CMakeLists.txtсодержит эту строку:

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

и IlmImfпапка содержит b44ExpLogTable.cpp, который мне нужно исключить из сборки.

Как этого добиться?

Berak
источник

Ответы:

100

Вы можете использовать эту listфункцию для управления списком, например:

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

В вашем случае может сработать что-то вроде этого:

list(REMOVE_ITEM lib_srcs "IlmImf/b44ExpLogTable.cpp")
Lindydancer
источник
1
помимо lib_srcs вместо lib_src и IlmImf вместо IlmThread, это помогло! благодаря тонну !
berak
20
Примечание. При удалении элемента из списка убедитесь, что значение, которое вы ищете, совпадает в точности с тем, что находится в списке. У меня возникли проблемы со смешиванием $ {CMAKE_SOURCE_DIR} /src/file_to_remove.cpp с $ {CMAKE_CURRENT_SOURCE_DIR} /../ file_to_remove.cpp. Он указывает на то же место, но это не та же строка. message ("$ {VARIABLE_NAME}") может помочь вам отладить это содержимое.
hbobenicio
Это не помогает, если вы используете CONFIGURE_DEPENDSи вам нужно исключить файл, созданный сборкой. Фильтр в списке после fileвызова по-прежнему вызывает перестройку, чего в моем случае я стараюсь избежать.
simon.watts
Намного лучше использоватьlist(FILTER
hukeping
2
Вышеупомянутое решение не работает для меня с camke версии 3.10.2, но решение ниже: list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>) работает для меня хорошо.
MH Yip
42

ФИЛЬТР - еще один вариант, который может быть более удобным в некоторых случаях:

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

Эта строка исключает каждый элемент, заканчивающийся требуемым именем файла:

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

Вот спецификация Regex для 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).
Евгений
источник
Может быть намного надежнее, чем возиться с абсолютными / относительными
путями
1
Намного лучше, чемlist(REMOVE_ITEM
ceztko 01
1
Обратите внимание, что list(FILTER ...)было введено в cmake v3.6: stackoverflow.com/a/42167646/3476780
yano
Это определенно лучший ответ, хотя, если вы пытаетесь использовать это для исключения всего каталога или если ваше регулярное выражение испорчено, вы можете исключить больше, чем хотите. Например, попытка исключения .*test/.*может исключить все, если ваш проект находится внутри дерева каталогов, где один из родительских каталогов называется примерно так mytest.
AnthonyD973 08
1

попробуй это : 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
Джеймс
источник