Debugowanie GNU make

Czy istnieje sposób wiersza poleceń make, aby dowiedzieć się, który z warunków wstępnych nie jest aktualizowany?

Author: Mateusz Piotrowski, 2009-11-17

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 jak make -d i make --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'.
 91
Author: paxdiablo,
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.

 19
Author: LiraNuna,
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
 7
Author: Beta,
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

 7
Author: rocky,
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:

  1. 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.
  2. ciężkie użycie funkcji $(info).
  3. 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
 6
Author: George André,
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

 1
Author: Alex,
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

 0
Author: MichaelMoser,
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