Problem
Chcę zobaczyć zależności dla jednego lub większej liczby celów makefile. Szukam więc programu, który może analizować pliki makefile, a następnie będzie reprezentować zależności w jakimś drzewiastym formacie (wcięcie, ascii-art, ...) lub jako wykres (kropka, ...).
Podobny
Istnieją programy, które robią to w innych sytuacjach:
- pactree lub dług może wyświetlać zależności dla pakietów oprogramowania w odpowiednim formacie w drzewie jak format ascii lub jako
dot
wykres, gcc -M source_file.c
wyświetla zależności pliku źródłowego C jako regułę make,- pstree wyświetla ascii reprezentację drzewa procesów.
Postęp
Przeszukując Internet, znalazłem niewielką pomoc . To skłoniło mnie do spróbowania
make --always-make --silent --dry-run some_target | \
grep --extended-regexp 'Considering target file|Trying rule prerequisite'
ale wygląda na to, że muszę zhakować trochę więcej parsującego kodu w Perlu lub Pythonie, aby przedstawić to jako ładne drzewo / wykres. I nie wiem jeszcze, czy naprawdę w ten sposób uzyskam pełny i poprawny wykres.
Wymagania
Byłoby miło ograniczyć wykres w pewien sposób (brak wbudowanej reguły, tylko dany cel, tylko pewna głębokość), ale w przeważającej części szukam tylko narzędzia, które da mi zależności w pewnym „rozsądnym” ludzkim sensie -widoczny format (jak programy w „Podobne” zrobić).
pytania
- Czy są jakieś programy, które mogą to zrobić?
- Czy otrzymam pełne i prawidłowe informacje
make -dnq ...
? - Czy istnieje lepszy sposób na uzyskanie tych informacji?
- Czy skrypty / próby analizy tych informacji już istnieją?
źródło
printf 'A\n B\n D\n C\n D\n'
. (Kto powiedział, że nie mogę wstawiać nowych wierszy w komentarzach? :)dot
wykresy zamówień są oczywiście w porządku.) Zaktualizuję to pytanie nieco, aby było jaśniejsze (mam nadzieję).Odpowiedzi:
Spróbuj makefile2graph od tego samego autora, zamiast tego jest napisane podobne narzędzie MakeGraphDependencies .
java
c
Następnie użyj edytora grafiki wektorowej, aby podświetlić potrzebne połączenia.
źródło
Znalazłem rodzaj włamania, aby przynajmniej uzyskać jasno skonstruowane informacje o tym, który cel zależy od wymagań wstępnych. Minusem jest to, że jest dość nachalne. Innymi słowy, musisz zmienić swój plik makefile, aby zawrzeć receptury kompilacji wszystkich celów w małą funkcję warunkową. Podam krótki przykład:
W tym przykładzie używam ręcznie zwiniętej funkcji getRecipe, aby zawinąć recepturę każdego celu, a następnie zdecydować, czy faktycznie uruchomić ten przepis, czy po prostu wypisać, który cel jest budowany i od których warunków zależy. To drugie dzieje się tylko wtedy, gdy zmienna
DEPENDENCY_GRAPH
jest ustawiona (np. Jako zmienna środowiskowa). W tym przykładzie przepis na kompilację jest niczym więcej niż echem mówiącym, że budowany jest cel, ale można oczywiście zastąpić to poleceniem według własnego wyboru.Przy
DEPENDENCY_GRAPH
ustawieniu na 1 daje to wynik:które powinno być wystarczająco łatwe do przeanalizowania, a następnie przekształcenia w wykres punktowy.
Jeśli
DEPENDENCY_GRAPH
nie jest ustawiony wcale lub ustawiony na 0, wynikiem jest:lub innymi słowy, zamiast tego używana jest normalna receptura kompilacji. Nie testowałem jeszcze, czy działa to niezawodnie ze skomplikowanymi przepisami. Jednym z problemów, na które już natknąłem się, jest to, że w ogóle nie działa z recepturami wieloliniowymi.
Na przykład w przepisie kompilacji ostatniego celu, jeśli oprócz stwierdzenia, że cel jest budowany, naprawdę chciałem do
touch
pliku:make
wydaje się myśleć, że tatouch $@
część jest jedynie częścią echa w poprzedniej linii:Jeśli zostawiam ostatni odwrotny ukośnik w poprzedniej linii,
make
narzeka na*** unterminated call to function
wezwanie: brak.)'. Stop.
Jeśli ktoś ma pomysł, jakmake
grać ładnie, jestem cały. :)EDYCJA: Innym problemem związanym z tym podejściem jest to, że zadziała to tylko wtedy, gdy wyniki kompilacji już nie istnieją, ponieważ
make
oczywiście nie wykonuje się przepisu kompilacji celu, który uważa za aktualny.źródło
;
potarget $@
komendzie dotyku do pracymake -B
opcji, która bezwarunkowo czyni wszystkie cele.Użyłem remake --profile (zamiennik drop-in
make
), wygenerowało drzewo zależności w formacie callgrind.Następnie gprof2dot może wygenerować obraz drzewa docelowego.
źródło
remake --profile
wyświetla tylko wykres zależności dla wykonywanego celu? Czy może w jakiś sposób generuje wykres dla wszystkich celów?remake --targets -r | grep -v %| grep -v '\t*\.'|xargs remake -n --profile -B
wygląda obiecująco.