Отладка GNU make - PullRequest
       9

Отладка GNU make

68 голосов
/ 17 ноября 2009

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

Ответы [ 7 ]

95 голосов
/ 17 ноября 2009
make -d

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

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

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

Похоже, 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'.
22 голосов
/ 17 ноября 2009

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

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

8 голосов
/ 11 августа 2010

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

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

7 голосов
/ 17 ноября 2009

Ваш вопрос немного неясен. Если вы хотите увидеть, какие файлы предварительных требований не были изменены в последнее время, используйте 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
6 голосов
/ 16 июля 2014

Обычно я не использую -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
1 голос
/ 23 августа 2013

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

0 голосов
/ 20 июля 2014

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

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

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

в этом примере: если вы добавляете 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)

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

...