Я зараз переписую застарілу програму 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, а також можете імпортувати їх іншими мовами. Чому точковий файл, який буквально представляє деревоподібну структуру залежностей між цілями, а не "спосіб бачити" те, про що ви просите?