Есть ли способ командной строки в make
, чтобы узнать, какая из предпосылок цели не обновляется?Отладка GNU make
ответ
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'.
Другое предложение, что если вы хотите избавиться от встроенных неявных правил, вы можете использовать флаг '-r' рядом с простым' -d'. –
Вы ищете «всухую» сделать в? Он будет распечатывать, что делает делает, фактически не делая этого, позволяя вам видеть, что происходит.
Флаг -n
, используйте его как make -n
.
Это мой любимый, '-d' слишком многословный (даже' --debug = b'). Особенно, если вы застряли с рекурсивным make (тьфу!). –
Ваш вопрос немного неясен. Если вы хотите увидеть, какие предварительные файлы не были изменены недавно, используйте 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
Я собирался предложить $? –
На самом деле это не решение командной строки, но, тем не менее, полезно. Вы могли бы сделать его командной строкой, основываясь только на выполнении эха, только если установлен env-var. – paxdiablo
Там также GNU сделать с отладчиком и лучше след/ошибки выхода: Remake
скринкаст:
http://showmedo.com/videotutorials/video?name=linuxBernsteinMakeDebug1&fromSeriesID=40
Несколько раз Я также использовал this (старый, но все еще работающий). Интерактивный отладчик от John Graham-Cumming.
Обычно я не использую -d, как говорили предыдущие ответчики.
I либо:
- Использование -р для печати базы данных, чтобы увидеть, что были созданы правила. Это удобно, если у вас есть другие правила расширения и вы создаете правила «на лету», особенно рекурсивные.
- Тяжелое использование функции $ (info).
- Используйте советы и трюк, описанные в этой статье 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
я использую сделать гну сделать шаблоны для определения создавать правила для каждой цели;
шаблоны, как макросы, которые пишут правила, они описаны здесь 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
- 1. создание версии GNU GNU make
- 2. GNU Make: запрошенный target
- 3. GNU make цитирует
- 4. Mutex в GNU Make?
- 5. gnu make игнорировать .INCLUDE_DIRS?
- 6. GNU Make Соответствующие списки
- 7. GNU make wildcard альтернатива?
- 8. `make зависит от магии в gnu make?
- 9. GNU make и список объектов
- 10. Всесторонний gnu make/gcc tutorial
- 11. Многострочное определение в GNU make
- 12. GNU Make игнорирует Неявные правила
- 13. Parallelizing ant like GNU Make?
- 14. Использование GNU Make с подкаталогами
- 15. Как работает «файл» GNU make?
- 16. GNU make auto dependency generation
- 17. GNU make: инвертирует успех подпроцесса?
- 18. Записывать имена в GNU make
- 19. Minimal GNU Make система сборки
- 20. GNU MAKE: функции в зависимостях
- 21. Распределенный GNU Make for Win32
- 22. GNU make variables в Makefile
- 23. Понять объявление make-файла gnu
- 24. GNU make wildcard variable target
- 25. Зависимость проблемы с gnu make
- 26. (GNU make) installcheck a library
- 27. GNU Make, построение ненужных зависимостей
- 28. Boost bjam против GNU make
- 29. Gnu Make: как обрабатывать подпроекты
- 30. Обновление GNU make на macOS
не существует как многословной режим? И не можете ли вы просто ввести некоторую «отголоску» отладки для каждой цели, чтобы понять это? – Earlz