Отладка GNU make



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

639   7  

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, как говорили предыдущие ответчики.

Я:

  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 от 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

    Ничего не найдено.