GLOB_RECURSE CMake, похоже, рекурсирует больше, чем я просил

#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. Да, теперь в ответе гораздо больше смысла, чем было.