Отладка 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, как говорили предыдущие ответчики.
Я:
- используйте -p для печати базы данных, чтобы увидеть, какие правила были созданы. Это удобно, если у вас есть вторые правила расширения и вы создаете правила на лету, особенно рекурсивный make.
- интенсивное использование функции $(info).
- используйте советы и трюк, описанные в этой статье 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