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 --graphviz
wyjście ma pokazać tę różnicę, więc wyraźnie CUpewnij zna kontekst wewnętrznie. Chciałbym jednak napisać tree
podobny 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-api
czy nie zawierają tej informacji. Myślałem, że to codemodel/target/dependencies
pole może działać, ale zawiera zarówno mieszanki lokalne, jak i przechodnie. A backtrace
pole każdej zależności wiąże się tylko z add_executable
/ add_library
call dla bieżącego celu.
--graphiz
opcja 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ągvpr
narzę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?Odpowiedzi:
Możesz przeanalizować
dot
plik wygenerowany przezgraphviz
i wyodrębnić szczegóły, które chcesz. Poniżej znajduje się przykładowy skrypt Pythona, aby to zrobić.Możesz także dodać ten skrypt, aby uruchamiał się z cmake jako niestandardowy cel, dzięki czemu można go wywoływać z poziomu kompilacji systemu. Można znaleźć przykładowy projekt cmake tutaj
źródło
pydot
.