Использование CMake GLOB_RECURSE для поиска каталогов - PullRequest
1 голос
/ 27 мая 2020

У меня следующая структура каталогов:

.
├── CMakeLists.txt
└── deps
    ├── eigen
    │   └── include
    │       ├── Eigen
    │       └── eigen.h
    └── osg
        ├── include
        │   └── Osg
        └── lib
            └── libosg.so

Я пытаюсь получить максимум файлов, которые мне не нужны для развертывания моего программного обеспечения, то есть библиотеки. Я попытался создать выражение подстановки, которое соответствует файлам *.h и каталогам include:

file(GLOB_RECURSE
  FOUND_FILES
  LIST_DIRECTORIES true
  ${CMAKE_SOURCE_DIR}/deps/*/include
  ${CMAKE_SOURCE_DIR}/deps/*/*.h)
message(STATUS "Files are ${FOUND_FILES}")

Однако по какой-то причине переменная FOUND_FILES содержит deps/osg/lib. Что я не понял про функцию GLOB_RECURSE?

- deps/eigen/include
- deps/eigen/include/eigen.h
- deps/osg/include
- deps/osg/lib
- deps/eigen/include
- deps/osg/include
- deps/osg/lib

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

Я думаю, это может быть обходной путь:

file(GLOB_RECURSE
    FOUND_FILES
    LIST_DIRECTORIES true
    ${CMAKE_SOURCE_DIR}/deps/*/include
)
list(FILTER FOUND_FILES INCLUDE REGEX "^${CMAKE_SOURCE_DIR}/deps/.*/include$")
file(GLOB_RECURSE
    tmp
    ${CMAKE_BINARY_DIR}/deps/*/*.h
)
list(APPEND FOUND_FILES ${tmp})

Я предполагаю, что это ошибка, когда GLOB_RECURSE используется с LIST_DIRECTORIES true с выражением, которое имеет * не в последней записи в тропинка. Как только каталог, содержащий совпадающую запись, будет сопоставлен в cmake: Glob.cxx # L404 , следующие каталоги будут добавлены рекурсивно к выходным данным безоговорочно в this add_file () в cmake Glob.cxx # L316 . Таким образом, если в каталоге ${CMAKE_SOURCE_DIR}/deps/* есть каталог или файл include, все каталоги рекурсивно из ${CMAKE_SOURCE_DIR}/deps/ добавляются к выходным данным. Файлы не добавляются, так как они проверяются на соответствие регулярному выражению в cmake Glob.cxx: # L326 .

2 голосов
/ 27 мая 2020

Похоже, что CMake отбрасывает последний компонент выражения подстановки при использовании GLOB_RECURSE для фильтрации каталогов. Вот почему CMake не фильтрует дальше каталог include в вашем примере. Это может быть ошибка в реализации CMake GLOB_RECURSE для каталогов или недосмотр в документации CMake .

EDIT: Решение 1 (не работает) :

Вместо этого вы можете смоделировать рекурсию, используя сам шаблон подстановки. Вместо этого используйте CMake GLOB и используйте ** в шаблоне подстановки, чтобы сопоставить что-либо с одним или несколькими символами между deps/ и /include:

file(GLOB
  FOUND_FILES
  LIST_DIRECTORIES true
  ${CMAKE_SOURCE_DIR}/deps/**/include
  ${CMAKE_BINARY_DIR}/deps/**/*.h)
)
message(STATUS "Files are ${FOUND_FILES}")

Решение 2 (уродливое):

Вы можете вручную добавить уровни каталогов для CMake для поиска include папок:

file(GLOB
  FOUND_FILES
  LIST_DIRECTORIES true
  ${CMAKE_SOURCE_DIR}/deps/*/include
  ${CMAKE_SOURCE_DIR}/deps/*/*/include
  ...
)

Однако это не очень масштабируемое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...