Spec-Zone.ru › GNU Make

Ошибки в рецептах

После каждого вызова оболочки, make проверяет её код возврата. Если оболочка завершилась успешно (код возврата равен нулю), следующая строка рецепта выполняется в новой оболочке; после завершения последней строки правило завершается.

Если произошла ошибка (код возврата отличен от нуля), make отказывается от текущего правила, а возможно, и от всех правил.

Иногда неудача определённой строки рецепта не указывает на проблему. Например, вы можете использовать команду mkdir для проверки существования директории. Если директория уже существует, mkdir сообщит об ошибке, но вы, вероятно, захотите, чтобы make продолжил выполнение независимо от этого.

Чтобы пропустить ошибки в строке рецепта, напишите ‘-’ в начале текста строки (после начальной табуляции). ‘-’ будет отброшен перед передачей строки оболочке для выполнения.

Например,

clean:
        -rm -f *.o

Это заставляет make продолжить даже если rm не сможет удалить файл.

Когда вы запускаете make с флагом ‘-i’ или ‘--ignore-errors’, ошибки игнорируются во всех рецептах всех правил. Правило в файле make для специальной цели .IGNORE имеет тот же эффект, если нет предшественников. Это менее гибко, но иногда полезно.

Когда ошибки нужно игнорировать, как из-за ‘-’, так и из-за флага ‘-i’, make обрабатывает ошибку возврата так же, как и успешное завершение, за исключением того, что выводит сообщение, которое указывает код возврата оболочки и говорит, что ошибка была проигнорирована.

Когда происходит ошибка, которую make не было сказано игнорировать, это подразумевает, что текущая цель не может быть правильно пересобрана, а также ни одна другая, которая зависит от неё непосредственно или косвенно. Дальнейшие рецепты для этих целей не будут выполнены, так как их предпосылки не выполнены.

Обычно make сразу же отказывается в этой ситуации, возвращая ненулевой код. Однако, если указан флаг ‘-k’ или ‘--keep-going’, make продолжает рассматривать другие предшественники ожидаемых целей, пересобирая их при необходимости, прежде чем отказаться и вернуть ненулевой код. Например, после ошибки при компиляции одного объектного файла, ‘make -k’ продолжит компиляцию других объектных файлов, даже если уже известно, что их связывание будет невозможно. См. Сводку опций.

Стандартное поведение предполагает, что ваша цель — привести указанные цели в актуальное состояние; как только make узнает, что это невозможно, это может сообщить об ошибке сразу же. Опция ‘-k’ говорит о том, что реальная цель — протестировать как можно больше изменений, внесённых в программу, возможно, чтобы найти несколько независимых проблем, которые можно исправить перед следующей попыткой компиляции. Вот почему команда Emacs’ compile по умолчанию передаёт флаг ‘-k’.

Обычно, когда строка рецепта терпит неудачу, если она вообще изменила целевой файл, файл повреждён и не может быть использован — или по крайней мере не полностью обновлён. Тем не менее, метка времени файла говорит о том, что он сейчас актуален, поэтому при следующем запуске make не будет пытаться обновить этот файл. Ситуация такая же, как когда оболочка убивается сигналом; см. Прерывания. Поэтому обычно правильным действием является удаление целевого файла, если рецепт терпит неудачу после начала изменения файла. make сделает это, если .DELETE_ON_ERROR появляется как целевой файл. Это почти всегда то, что вы хотите make сделать, но это не историческая практика; поэтому для совместимости вы должны явно её запросить.

Copyright © 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/make/manual/html_node/Errors.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API