Jestem w trakcie przepisywania starszej konfiguracji CMake, aby korzystać z nowoczesnych funkcji, takich jak automatyczne propagowanie zależności. (tj. używając rzeczy takich jak target_include_directories(<target> PUBLIC <dir>)zamiast include_directories(<dir>).) Obecnie ręcznie obsługujemy wszystkie informacje o zależnościach projektu, ustawiając kilka globalnych właściwości katalogu.
Podczas moich testów znalazłem kilka przykładów, w których cel w nowej kompilacji będzie łączył się z biblioteką, której nie zbudowałaby stara kompilacja. Nie łączę się z tym wprost, więc wiem, że wynika to z zależności celu, ale aby znaleźć, które muszę rekurencyjnie przeglądać wszystkie projekty CMakeLists.txt, śledząc hierarchię zależności, aż znajdę taki, który pobiera daną bibliotekę. Mamy dziesiątki bibliotek, więc nie jest to trywialny proces.
Czy CMake umożliwia sprawdzenie, dla każdego celu, które z jego zależności zostały dodane wprost, a które propagowane przez zależności przechodnie?
Wygląda na to --graphvizwyjście ma pokazać tę różnicę, więc wyraźnie CUpewnij zna kontekst wewnętrznie. Chciałbym jednak napisać treepodobny skrypt, aby wyświetlić informacje o zależnościach w wierszu poleceń, a analiza plików Graphviz brzmi zarówno jak koszmar, jak i hack.
O ile mogę powiedzieć, cmake-file-apiczy nie zawierają tej informacji. Myślałem, że to codemodel/target/dependenciespole może działać, ale zawiera zarówno mieszanki lokalne, jak i przechodnie. A backtracepole każdej zależności wiąże się tylko z add_executable/ add_librarycall dla bieżącego celu.
--graphizopcja nie odpowiada na twoje pytanie? Dlaczego parsowanie plików kropek wydaje się koszmarem? Pliki kropkowe to najprostszy, powszechny i elastyczny sposób na czytelne dla człowieka reprezentowanie połączonych punktów. Za pomocągvprnarzędzia możesz robić z nimi wszystko w stylu awk-ish, a także importować je w innych językach. Dlaczego plik kropkowy, który dosłownie przedstawia drzewną strukturę zależności między celami, a nie „sposób zobaczenia” tego, o co prosisz?