Отладка GNU

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

Ответ 1

make -d

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

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

Вы можете значительно уменьшить объем вывода отладки, если задаете конкретную цель, в которой вы заинтересованы. Поэтому, если вас интересует только цель 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 - лучший вариант для того, что вам нужно, как показано в следующем расшифровке:

[email protected]> cat makefile
c:a b
    touch c

[email protected]> touch a b ; make
touch c

[email protected]> make
make: 'c' is up to date.

[email protected]> 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'.

Ответ 2

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

Флаг -n, используйте его как make -n.

Ответ 4

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

# Make will announce when it is making this target, and why.
sometarget: preq1 preq2 preq3
    @echo making [email protected]
    @echo The following preqs are newer than the target: $?
    do_things

Ответ 5

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

I:

  • Используйте -p для печати базы данных, чтобы узнать, какие правила были созданы. Это удобно, если у вас есть другие правила расширения и создаете правила "на лету", особенно рекурсивные.
  • Тяжелое использование функции $(info).
  • Используйте советы и трюки, описанные в этой статье DrDobbs Отладка Makefile

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

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

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

Ответ 7

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

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

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

Ответ 8

Если вы просто хотите видеть команды, которые выполняет make, как и настоящая команда gcc, используйте параметр VERBOSE=1, например:

$ make VERBOSE=1