Налагодження GNU make


75

Чи існує спосіб командного рядка, makeщоб з’ясувати, яка з передумов цілі не оновлена?


хіба не існує подібного багатослівного режиму? І ви не можете просто ввести echoналагодження для кожної цілі, щоб це зрозуміти?
Earlz

Відповіді:


106
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 для інформації під час ремейків 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'.

7
Ще одна порада, що якщо ви хочете позбутися вбудованих неявних правил, ви можете використовувати -rпрапор поряд із простим -d.
П Швед

24

Шукаєте "сухого ходу" Макея? Він роздрукує, що робить марка, фактично не роблячи цього, дозволяючи побачити, що відбувається.

Прапор є -n, використовуйте його як make -n.


Це мій улюблений, -dзанадто багатослівний (навіть --debug=b). Особливо, якщо ви застрягли в рекурсивному складі (тьфу!).
Адам Ліндберг,


7

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

# Make оголосить, коли він робить цю ціль, і чому.
sometarget: preq1 preq2 preq3
    @echo заробляє $ @
    @echo Наступні попередні версії новіші за цільові: $?
    робити_ речі

Я збирався запропонувати $? також
просто хтось

Не зовсім рішення командного рядка, але тим не менш корисне. Можливо, ви можете зробити це за допомогою командного рядка, виконуючи лише відлуння, лише якщо встановлено env-var.
paxdiablo

7

Зазвичай я не використовую -d, як казали попередні відповіді.

Я або:

  1. Використовуйте -p для друку бази даних, щоб побачити, які правила були створені. Це зручно, якщо у вас є другі правила розширення і ви створюєте правила на льоту, особливо рекурсивне створення.
  2. Інтенсивне використання функції $ (інформація).
  3. Скористайтеся порадами та підказками, описаними в цій статті 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

1

Неодноразово я також використовував цей (старий, але все ще працюючий) інтерактивний налагоджувач створення Джон Грем-Каммінг


0

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

Детальніше про мої файли make тут: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.