Як виключити один файл із шаблону cmake `file (GLOB…)`?


86

Мій CMakeLists.txtмістить цей рядок:

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

і IlmImfпапка містить b44ExpLogTable.cpp, що мені потрібно виключити зі збірки.

Як цього досягти?

Відповіді:


100

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

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

У вашому випадку, можливо, щось подібне підійде:

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

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. Він вказує на те саме місце, але це не той самий рядок. повідомлення ("$ {VARIABLE_NAME}") може допомогти вам налагодити цей вміст.
hbobenicio

Це не допомагає, якщо ви використовуєте CONFIGURE_DEPENDSта потрібно виключити файл, створений збіркою. Фільтр у списку після fileдзвінка все ще викликає відновлення, якого, у моєму випадку, я намагаюся уникати.
simon.watts

Це набагато краще використовуватиlist(FILTER
хакепінг

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

1
Зверніть увагу , що list(FILTER ...)був введений в CMake v3.6: stackoverflow.com/a/42167646/3476780
Яно

Це, безумовно, краща відповідь, хоча якщо ви намагаєтеся використовувати це для виключення цілого каталогу або якщо ваш регулярний вираз переплутаний, ви можете виключити більше, ніж хочете. Наприклад, спроба виключити .*test/.*може виключити все, якщо ваш проект знаходиться всередині дерева каталогів, де один із батьківських каталогів називається приблизно так mytest.
AnthonyD973

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.