Отладка GNU make

есть ли путь командной строки в make чтобы узнать, какие из предварительных условий цели не обновляются?

7 ответов


make -d

должно дать вам больше чем достаточно информации для отладки сборки.

будьте осторожны: это займет некоторое время и усилия для анализа вывода, но загрузка вывода в ваш любимый редактор и выполнение поиска поможет много.

вы можете значительно уменьшить количество выходных данных отладки, если вы укажете конкретную цель, которая вас интересует. Поэтому, если вас интересует только dodgy цель, а не просто make -d что может сделать сотню разных вещей, попробуйте:

make clean
make -d dodgy

(если у вас есть clean цель конечно).

на make --debug идентичен make -d но вы также можете указать:

make --debug=FLAGS

где флаги могут быть:

  • a для всей отладки (так же, как make -d и make --debug).
  • b для базовой отладки.
  • v для немного более подробной базовой отладки.
  • i для неявное правило.
  • j для информации вызова.
  • m для информации во время Makefile римейков.

похоже make --debug=b является лучшим вариантом для того, что вам нужно, как показано в следующей расшифровке:

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'.

вы ищете "сухой пробег"марки? Он распечатает то, что делает make, фактически не делая этого, позволяя вам видеть, что происходит.

флаг -n, использовать его как make -n.


Ваш вопрос немного неясен. Если вы хотите увидеть, какие необходимые файлы не были изменены в последнее время, используйте ls-l для просмотра времени их изменения. Если вы хотите увидеть, что делает make, попробуйте следующее:

# 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

есть также GNU make с отладчиком и лучшим выходом трассировки / ошибки:ремейк

скринкаст: http://showmedo.com/videotutorials/video?name=linuxBernsteinMakeDebug1&fromSeriesID=40


обычно я не использую -d, как говорили предыдущие ответчики.

Я:

  1. используйте -p для печати базы данных, чтобы увидеть, какие правила были созданы. Это удобно, если у вас есть вторые правила расширения и вы создаете правила на лету, особенно рекурсивный make.
  2. интенсивное использование функции $(info).
  3. используйте советы и трюк, описанные в этой статье DrDobbs Отладка Makefiles

ниже какой-то код, который я использую для распечатки значений:

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

несколько раз я также используется этой (старый, но все еще работает) интерактивный отладчик сделать Джон Грэм-Камминг


Я использую шаблоны make gnu make для определения правил make для каждой цели;

Шаблоны похожи на макросы, которые пишут правила, они объясняются здесь https://www.gnu.org/software/make/manual/html_node/Eval-Function.html

эта функция полезна, когда у вас есть сделать систему, которая включает в себя основной Makefile, чтобы создать все правила для каждого типа проектов; если он говорит, чтобы сделать общую библиотеку, то он пишет правила для компиляции разделяемой библиотеки; и т. д. для других типы целей.

в этом примере: если вы добавляете SHOW_RULES=1 в командную строку make, он также показывает текст правил, которые генерируются PROGRAM_target_setup_template; наряду с созданием самих правил (с 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 ... ) вызывает шаблон
  • $(info ... ) печатает результат подстановки шаблона; (eval вызвал бы разбор вывода и добавление к текущему файлу make )

мои файлы здесь: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html