2009-11-17 2 views
61

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

+0

не существует как многословной режим? И не можете ли вы просто ввести некоторую «отголоску» отладки для каждой цели, чтобы понять это? – Earlz

ответ

85
make -d 

должно дать вам болеечем достаточно информации для отладки Makefile.

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

Вы можете значительно уменьшить объем отладочного вывода, если задаете конкретную цель, в которой вы заинтересованы. Поэтому, если вас интересует только цель dodgy, а не только make -d, которая может сделать сотню разных вещей, попробуйте :

make clean 
make -d dodgy 

(при условии, у вас есть clean цель, конечно).

make --debug идентичен make -d, но вы можете также указать:

make --debug=FLAGS 

где флаги могут быть:

  • a для всех отладки (такой же, как и make -dmake --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'. 
+4

Другое предложение, что если вы хотите избавиться от встроенных неявных правил, вы можете использовать флаг '-r' рядом с простым' -d'. –

17

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

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

+0

Это мой любимый, '-d' слишком многословный (даже' --debug = b'). Особенно, если вы застряли с рекурсивным make (тьфу!). –

7

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

 
# 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 
+0

Я собирался предложить $? –

+0

На самом деле это не решение командной строки, но, тем не менее, полезно. Вы могли бы сделать его командной строкой, основываясь только на выполнении эха, только если установлен env-var. – paxdiablo

1

Несколько раз Я также использовал this (старый, но все еще работающий). Интерактивный отладчик от John Graham-Cumming.

5

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

I либо:

  1. Использование -р для печати базы данных, чтобы увидеть, что были созданы правила. Это удобно, если у вас есть другие правила расширения и вы создаете правила «на лету», особенно рекурсивные.
  2. Тяжелое использование функции $ (info).
  3. Используйте советы и трюк, описанные в этой статье DrDobbs Debugging 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 
0

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

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

Больше о моем сделать файлы здесь: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html

Смежные вопросы