7 ответов:
make -dдолжно дать вам больше чем достаточно информации для отладки сборки.
будьте осторожны: это займет некоторое время и усилия, чтобы проанализировать вывод, но загрузка вывода в ваш любимый редактор и делать поиск поможет много.
вы можете значительно уменьшить объем вывода отладки, если вы укажете конкретную цель, которая вас интересует. Так что если вас интересует только
dodgyцель, а не простоmake -dчто может сделать сотню разных вещей, попробуйте:make clean make -d dodgy(если у вас есть
cleanцель конечно).The
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 от John Graham-Cumming
Я использую сделать GNU делать шаблоны, чтобы определить правила для каждого целевого объекта;
Шаблоны похожи на макросы, которые пишут правила, они объясняются здесь https://www.gnu.org/software/make/manual/html_node/Eval-Function.html
эта функция полезна, когда у вас есть система make, которая включает в себя основной 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
- $(колл ... ) вызывает шаблон
- $(info ... ) выводит результат подстановки шаблона; (eval вызвал бы разбор вывода и добавление к текущему файлу make )
подробнее о моих файлах make здесь: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html
Comments