Есть ли способ командной строки в make
, чтобы узнать, какая из предварительных условий для цели не обновляется?
Отладка GNU
Ответ 1
make -d
должен предоставить вам более чем достаточно информации для отладки вашего файла makefile.
Будьте осторожны: для анализа вывода потребуется некоторое время и усилия, но загрузка результатов в ваш любимый редактор и выполнение поисковых запросов помогут значительно.
Вы можете значительно уменьшить объем вывода отладки, если задаете конкретную цель, в которой вы заинтересованы. Поэтому, если вас интересует только цель 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
- лучший вариант для того, что вам нужно, как показано в следующем расшифровке:
[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'.
Ответ 2
Вы ищете Make "dry run"? Он будет распечатывать, что делает, делает это, фактически не делая этого, позволяя вам видеть, что происходит.
Флаг -n
, используйте его как make -n
.
Ответ 3
Там также GNU делает с отладчиком и лучший вывод трассировки/ошибки: Remake
screencast: http://showmedo.com/videotutorials/video?name=linuxBernsteinMakeDebug1&fromSeriesID=40
Ответ 4
Ваш вопрос немного неясен. Если вы хотите увидеть, какие предварительные файлы не были изменены недавно, используйте ls -l, чтобы просмотреть время их модификации. Если вы хотите увидеть, что делает make, попробуйте следующее:
# 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
Ответ 5
То, что я обычно делаю, не использует -d, как говорили предыдущие ответчики.
I:
- Используйте -p для печати базы данных, чтобы узнать, какие правила были созданы. Это удобно, если у вас есть другие правила расширения и создаете правила "на лету", особенно рекурсивные.
- Тяжелое использование функции $(info).
- Используйте советы и трюки, описанные в этой статье 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
Ответ 6
Несколько раз я также использовал этот (старый, но все еще работающий) интерактивный make отладчик Джона Грэма-Камминга
Ответ 7
Я использую make gnu make templates для определения правил make для каждой цели;
Шаблоны похожи на макросы, которые пишут правила, здесь они объясняются https://www.gnu.org/software/make/manual/html_node/Eval-Function.html
эта функция полезна, когда у вас есть система make, которая включает основной файл 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
- $(call...) вызывает шаблон
- $(info...) выводит результат замены шаблона; (eval вызывал бы синтаксический анализ вывода и добавление к текущему файлу make)
Подробнее о моих файлах здесь: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html
Ответ 8
Если вы просто хотите видеть команды, которые выполняет make
, как и настоящая команда gcc
, используйте параметр VERBOSE=1
, например:
$ make VERBOSE=1