В make файлах строка с префиксом символа отключает печать выходного файла. У меня есть make файл, где каждая строка имеет префикс с, но для отладки мне нужно посмотреть, что происходит. Есть ли способ сказать, чтобы игнорировать и выводить строку? отладка чрезмерна, а опция -n печатает их, но ничего не делает (это для сухого хода)
Игнорирование символа (@) в make файлах
Ответ 1
Сделайте переменную, которая имеет значение по умолчанию @
:
AT := @
И затем используйте это в своем Makefile
:
foo:
$(AT)fooc -o [email protected]
Затем запустите make
как make AT=
. Если вам нравится:
V := 0
AT_0 := @
AT_1 :=
AT = $(AT_$(V))
Это сделает команды тихими, если V
не установлен на 1
(например, make V=1
). Это использует не-POSIX, но является общей функцией рекурсивного расширения переменных.
Ответ 2
Вы можете заставить кого-то еще распечатать команды по мере их выполнения, что почти то же самое:
make SHELL='/bin/sh -x' ...your make arguments...
Однако это не будет работать так хорошо, если ваш make файл содержит фрагменты оболочки script как рецепты, а не последовательности отдельных простых команд, так как вы увидите отдельные команды оболочки, как они встречаются, а не целые фрагменты как они вызывают.
В качестве альтернативы вы могли бы воспользоваться преимуществами бесплатного программного обеспечения GNU Make и взломать собственную версию, которая игнорирует знаки @
. Grepping the GNU. Исходный код для COMMANDS_SILENT
скоро покажет вам, что достаточно добавить 1 ||
в условие ?:
в аргументах вызова message()
в start_job_command()
в job.c. Задание выполнено!
Ответ 3
В GNU Make это невозможно из коробки. Наличие Makefile
, который не является полностью настраиваемым, является просто плохой практикой. Удаление знаков @
и запуск с помощью -s
- это самый простой способ получить тихую сборку (за исключением возможных команд echo
).
Ответ 4
Выньте все @и добавьте эту строку в Makefile:
. СИЛЬНЫЙ:
Если вы хотите отлаживать, закомментируйте строку .SILENT.
Ответ 5
Отключение @перед make script полезно, однако иногда слишком шумно, когда make script очень длинный. Другой метод отладки заключается в том, чтобы включить функцию оболочки, которая перекликается с командами перед их выполнением. Это устраняет необходимость манипулировать @или .SILENT. Рассмотрим пример Makefile:
test: @blah; \ : ... lots of script commands ... ; \ : Start debugging here ; \ set -x; \ : ... script segment to debug ... ; \ set +x; \ : Stop debugging here ; \ : ... lots of script commands ... ;
Это, скорее всего, не переносится, поскольку зависит от функций, присутствующих в оболочке, которая выполняет script, но переносимость на самом деле не так важна для отладки (если она работает для вас).
Ответ 6
Чтобы сделать еще более настраиваемым, позвольте make make включить многословие. Он по умолчанию нормальный для бесшумного режима. Только с режимом -e VERBOSE = 1, конечно, будет многословно:
##
# Verbose ENABLE/DISABLE
# invoke make -e VERBOSE=1
##
[email protected]
ifeq ($(VERBOSE),1)
V=
endif
all:
$(V)echo test
echo test
Спасибо за эту тему, это очень помогло моей работе.