Игнорирование символа (@) в make файлах

В make файлах строка с префиксом символа отключает печать выходного файла. У меня есть make файл, где каждая строка имеет префикс с, но для отладки мне нужно посмотреть, что происходит. Есть ли способ сказать, чтобы игнорировать и выводить строку? отладка чрезмерна, а опция -n печатает их, но ничего не делает (это для сухого хода)

Ответ 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

Спасибо за эту тему, это очень помогло моей работе.