Чи існує спосіб командного рядка, 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
налагодження для кожної цілі, щоб це зрозуміти?