Чи існує спосіб командного рядка, makeщоб з’ясувати, яка з передумов цілі не оновлена?
Відповіді:
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'.
-rпрапор поряд із простим -d.
Шукаєте "сухого ходу" Макея? Він роздрукує, що робить марка, фактично не роблячи цього, дозволяючи побачити, що відбувається.
Прапор є -n, використовуйте його як make -n.
-dзанадто багатослівний (навіть --debug=b). Особливо, якщо ви застрягли в рекурсивному складі (тьфу!).
Є також GNU make з налагоджувачем та кращим результатом трасування / помилки: Remake
Обидва вони, хоча й досі актуальні, трохи старі.
Ваше питання трохи незрозуміле. Якщо ви хочете побачити, які необхідні файли нещодавно не змінювались, використовуйте ls -l, щоб переглянути час їх модифікації. Якщо ви хочете побачити, що робить марка, спробуйте наступне:
# Make оголосить, коли він робить цю ціль, і чому.
sometarget: preq1 preq2 preq3
@echo заробляє $ @
@echo Наступні попередні версії новіші за цільові: $?
робити_ речі
Зазвичай я не використовую -d, як казали попередні відповіді.
Я або:
Нижче наведено код, який я використовую для роздрукування значень:
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 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
Детальніше про мої файли make тут: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html
echoналагодження для кожної цілі, щоб це зрозуміти?