#cmake #glob
Вопрос:
В моем проекте у меня есть поддиректор с именем foo
, и мне нужен список всех .cpp
файлов в разделе foo
и его подкаталоги. Итак, для меня это GLOB_RECURSE. Теперь, просматривая документацию CMake, я вижу, что синтаксис:
file(GLOB_RECURSE <variable> [FOLLOW_SYMLINKS]
[LIST_DIRECTORIES true|false] [RELATIVE <path>] [CONFIGURE_DEPENDS]
[<globbing-expressions>...])
и в моем случае:
file(GLOB_RECURSE my_list "foo/" "*.cpp")
К сожалению, я получаю пути ко всем .cpp
файлам в моем проекте, а не только к foo/
ним . Это почему?
Ответ №1:
Вы неправильно поняли роль <path>
заполнителя в синтаксисе. Это актуально только при использовании RELATIVE
ключевого слова, а вы его не используете RELATIVE
.
Таким образом, то, что вы на самом деле предоставили GLOB_RECURSE
, — это два глобулирующих выражения.
Как ни странно, считается, что каждое выражение глобирования содержит как корневой каталог для рекурсии, так и шаблон глобирования одновременно. В вашем случае это было бы:
file(GLOB_RECURSE my_list "foo/*.cpp")
CMake разделит эту строку, чтобы она искала .cpp
файлы во всех подкаталогах foo/
.
Комментарии:
1. В документации , на которую вы ссылаетесь, приведен пример выражения с глобализацией:
/dir/*.py - match all python files in /dir and subdirectories
. Не уверен, почему использование подобного выражения выглядит для вас «достаточно странно». Что касается<path>
аргументации, то в документации, по-видимому, четко определена ее роль: она является частьюRELATIVE
опции.2. @Tsyvarev: Я не ожидал, что CMake в конце разберет один строковый аргумент
/
и будет использовать одну часть в качестве корня, а другую-в качестве шаблона.3. В исходном вызове
"foo/"
и"*.cpp"
являются отдельными глобальными выражениями. CMake сначала создает список файлов, соответствующих первому выражению, затем создает список файлов, соответствующих второму выражению. Затем эти списки объединяются в единый список (путем добавления).4. @Tsyvarev: Да, именно в этом я и обнаружил проблему. Возможно, мне следует уточнить это в своем ответе.
5. Да, теперь в ответе гораздо больше смысла, чем было.