Подтвердить что ты не робот

Подавлять и игнорировать вывод для Makefile?

Я знаю, что префикс @ подавляет вывод из команды оболочки в Makefiles, а также что префикс - будет игнорировать ошибки из команды оболочки. Есть ли способ объединить два, то есть префикс, который подавляет вывод и игнорирует ошибки? Я не думаю, что работает @- или [email protected].

4b9b3361

Ответ 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 (игнорируется)

Как вы можете видеть, команда не эхом, и ошибка игнорируется, как ожидалось.