Я переписываю устаревшую настройку CMake, чтобы использовать современные функции, такие как автоматическое распространение зависимостей. (т.е. используя такие вещи, как target_include_directories(<target> PUBLIC <dir>)вместо include_directories(<dir>).) В настоящее время мы вручную обрабатываем всю информацию о зависимостях проекта, устанавливая набор глобальных свойств каталога.
В моем тестировании я обнаружил несколько примеров, когда цель в новой сборке будет ссылаться на библиотеку, а старая сборка - нет. Я не ссылаюсь на него явно, поэтому я знаю, что это происходит из зависимостей цели, но для того, чтобы выяснить, какие из них мне нужно рекурсивно просмотреть все проекты CMakeLists.txt, следуя иерархии зависимостей, пока не найду тот, который тянет в рассматриваемой библиотеке. У нас есть десятки библиотек, так что это не тривиальный процесс.
Предоставляет ли CMake какой-либо способ увидеть для каждой цели, какие из ее зависимостей были добавлены явно, а какие были распространены через транзитивные зависимости?
Похоже , что --graphvizвыход делает показать это различие, так ясно CMake знает контекст внутри. Тем не менее, я хотел бы написать treeподобный скрипт для отображения информации о зависимостях в командной строке, и анализ файлов Graphviz звучит как кошмар и взлом.
Насколько я могу судить, cmake-file-apiэто не включает эту информацию. Я думал, что codemodel/target/dependenciesполе может работать, но в нем перечислены как локальные, так и транзитивные зависимости, смешанные вместе. И backtraceполе каждой зависимости связывается только с вызовом add_executable/ add_libraryдля текущей цели.
--graphizвариант не ответить на ваш вопрос? Почему при разборе файлов с точками кажется кошмаром? Точечные файлы - это самый простой, распространенный и гибкий способ восприятия человеком связанных точек. С помощьюgvprутилиты вы можете делать с ними все что угодно в стиле awk-ish и импортировать их на других языках. Почему точечный файл, который буквально представляет древовидную структуру зависимостей между целями, а не «способ увидеть» то, что вы просите?