Я переписываю устаревшую настройку 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 и импортировать их на других языках. Почему точечный файл, который буквально представляет древовидную структуру зависимостей между целями, а не «способ увидеть» то, что вы просите?Ответы:
Вы можете анализировать
dot
сгенерированный файлgraphviz
и извлекать детали, которые вы хотите. Ниже приведен пример скрипта Python для этого.Вы также можете добавить этот скрипт для запуска из cmake как пользовательскую цель, чтобы вы могли вызывать его из вашей системы сборки. Вы можете найти образец проекта cmake здесь
источник
pydot
.