Я знаю, что префикс @
подавляет вывод из команды оболочки в Makefiles, а также что префикс -
будет игнорировать ошибки из команды оболочки. Есть ли способ объединить два, то есть префикс, который подавляет вывод и игнорирует ошибки? Я не думаю, что работает @-
или [email protected]
.
Подавлять и игнорировать вывод для Makefile?
Ответ 1
На самом деле, @-
и [email protected]
работают, но печатают предупреждение make: [target] Error 1 (ignored)
.
Вместо этого вы можете использовать
@command || true
или, поскольку :
является сокращением для true
в оболочке,
@command ||:
Это часто бывает лучше, потому что это позволяет избежать недоразумений, предупреждая, что ошибка была проигнорирована в невидимой команде.
Рассмотрим два наиболее распространенных случая, когда вы можете игнорировать возвращаемое значение команды:
- Часть сборки разбита, и вы все равно хотите продолжить, и в этом случае вам нужно научиться. Сборка нарушена и должна быть исправлена, а не перевязана неподходящим образом.
- Команда возвращает ненулевой код выхода, даже если он сделал именно то, что вы хотели, и в этом случае вы действительно не хотите, чтобы Make выдавал предупреждение.
Во втором случае рассмотрим пример grepping для предупреждений в файле журнала, созданного командой. grep
вернет ошибку, если не найдет совпадение, которое вам не нужно:
.PHONY: all one two three
all: at-warning at-success or-success or-warning
at-%: %.log
@echo Making [email protected]
@-grep ^Warning $<
or-%: %.log
@echo Making [email protected]
@grep ^Warning $< ||:
success.log:
echo 'Success!' > [email protected]
warning.log:
echo 'Warning: foo' > [email protected]
clean::
rm -f {success,warning.log}
дает:
echo 'Warning: foo' > warning.log
Making at-warning
Warning: foo
Making at-success
make: [at-success] Error 1 (ignored)
Making or-success
Making or-warning
Warning: foo
Использование @-
вызывает бессмысленное игнорируемое предупреждение об ошибке, когда есть успех, а || true
обрабатывает оба предупреждения и отсутствие предупреждений без жалоб.
Теоретически использование || true
происходит медленнее, чем при использовании @-
, но эти накладные расходы вряд ли станут узким местом в хорошо продуманных и поддерживаемых системах сборки. Подавляющее большинство времени следует тратить на создание или проверку временных меток, когда нет ничего, что нужно построить, а не для запуска тысяч быстрых команд, значения возвращаемых значений которых проигнорированы, что было бы необходимо для того, чтобы это измерило влияние производительности.
Ответ 2
GNU make позволяет комбинировать как @
, так и -
:
all:
@-exit 1
Выполнение этого с помощью gmake 3.81 производит этот вывод:
gmake: [все] Ошибка 1 (игнорируется)
Как вы можете видеть, команда не эхом, и ошибка игнорируется, как ожидалось.