Debugowanie GNU make
Czy istnieje sposób wiersza poleceń make
, aby dowiedzieć się, który z warunków wstępnych nie jest aktualizowany?
7 answers
make -d
Powinno dać ci więcej niż wystarczająco dużo informacji, aby debugować Twój plik makefile.
Uwaga: analiza danych wyjściowych zajmie trochę czasu i wysiłku, ale załadowanie danych wyjściowych do ulubionego edytora i wyszukiwanie będzie bardzo pomocne.
Możesz znacznie zmniejszyć ilość danych wyjściowych debugowania, jeśli określisz konkretny cel, który Cię interesuje. Więc jeśli interesuje Cię tylko cel dodgy
, a nie tylko make -d
, który może sprawić, że sto różnych rzeczy, spróbuj:
make clean
make -d dodgy
(zakładając, że masz clean
cel oczywiście).
make --debug
jest identyczne z make -d
, ale można również podać:
make --debug=FLAGS
Gdzie flagi mogą być:
-
a
dla wszystkich debugowań (tak samo jakmake -d
imake --debug
). -
b
do podstawowego debugowania. -
v
dla nieco bardziej szczegółowego debugowania podstawowego. -
i
dla reguł ukrytych. -
j
dla informacji o inwokacji. -
m
dla informacji podczas Makefile remakes.
Wygląda na to, że make --debug=b
jest najlepszą opcją na to, czego potrzebujesz, jak pokazano w następującej transkrypcji:
pax@paxbox> cat makefile
c:a b
touch c
pax@paxbox> touch a b ; make
touch c
pax@paxbox> make
make: 'c' is up to date.
pax@paxbox> touch a ; make --debug=b
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc. Blah, blah, blah.
Reading makefiles...
Updating goal targets....
Prerequisite 'a' is newer than target 'c'.
Must remake target 'c'.
touch c
Successfully remade target file 'c'.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-17 01:42:37
Szukasz "dry run"Make' a? Wydrukuje to, co robi marka, nie robiąc tego w rzeczywistości, co pozwala zobaczyć, co się dzieje.
Flaga to -n
, używaj jej jak make -n
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-17 01:03:44
Twoje pytanie jest trochę niejasne. Jeśli chcesz zobaczyć, które pliki nie zostały Ostatnio zmodyfikowane, użyj ls-l, aby zobaczyć czas ich modyfikacji. Jeśli chcesz zobaczyć, co robi Marka, spróbuj tego:
# Make will announce when it is making this target, and why. sometarget: preq1 preq2 preq3 @echo making $@ @echo The following preqs are newer than the target: $? do_things
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-17 01:11:30
Jest też GNU make z debuggerem i lepszym wyjściem trace/error: Remake
screencast: http://showmedo.com/videotutorials/video?name=linuxBernsteinMakeDebug1&fromSeriesID=40
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-07 21:51:34
To, co zwykle robię, to nie używam -d, jak mówili poprzedni odpowiadający.
Ja albo:
- użyj opcji-p, aby wydrukować bazę danych, aby zobaczyć, jakie reguły zostały utworzone. Jest to przydatne, jeśli masz reguły drugiego rozszerzenia i tworzysz reguły w locie, szczególnie rekurencyjny make.
- ciężkie użycie funkcji $(info).
- Użyj wskazówek i trików opisanych w tym artykule DrDobbs debugowanie plików Makefile
Poniżej znajduje się kod, którego używam do drukowania wartości:
define pv
$(info $(1) [$(origin $(1))] : >|$($(1))|<)
endef
define pva
$(foreach t,$(1),$(call pv,$(t)))
endef
define itemizer
$(foreach t,$($(1)),$(info $(t)))
endef
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-16 09:33:21
Kilka razy użyłem również tego (starego, ale wciąż działającego) interaktywnego debuggera make by John Graham-Cumming
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-23 10:00:23
Używam szablonów make gnu make, aby zdefiniować reguły make dla danego celu;
Szablony są jak makra, które piszą zasady, są wyjaśnione tutaj https://www.gnu.org/software/make/manual/html_node/Eval-Function.html
Ta funkcja jest przydatna, gdy masz system make, który zawiera podstawowy plik makefile do generowania wszystkich reguł dla każdego typu projektu; jeśli mówi, aby zrobić bibliotekę współdzieloną, to pisze reguły do kompilacji biblioteki współdzielonej; itd. dla innych typów cele.
W tym przykładzie: jeśli dodasz SHOW_RULES=1 do linii poleceń make, wyświetli się również tekst reguł generowanych przez PROGRAM_target_setup_template ; wraz z wygenerowaniem samych reguł (za pomocą eval).
# this one defines the target for real
$(foreach prog, $(TARGETS), $(eval $(call PROGRAM_target_setup_template,$(prog))))
ifneq "$(SHOW_RULES)" ""
$(foreach prog, $(TARGETS), $(info $(call PROGRAM_target_setup_template,$(prog))))
endif
- $(call ... ) wywołuje szablon
- $(info ... ) wyświetla wynik podstawiania szablonu; ( eval wywołałby parsowanie wyjścia i dodanie do bieżącego pliku make)
Więcej o moich plikach make tutaj: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-20 11:55:58