Как мне проверить статус завершения вызова оболочки Makefile?

#makefile

#makefile

Вопрос:

У меня есть Makefile, который запускает программу, которая при успешном выполнении возвращает ненулевое значение, а при сбое возвращает другое ненулевое значение. Я знаю, что могу игнорировать статус завершения, добавляя к команде префикс — , но это не работает, потому что мне нужно знать, выполнена ли команда успешно.

Комментарии:

1. Первый шаг — отправить сопровождающему программы отчет об ошибке, который возвращает ненулевое значение при успешном выполнении.

2. Ну, программа от коммерческого поставщика, поэтому я сомневаюсь, что они изменят поведение программы.

3. @trondd GNU make разработан проектом GNU, который не является коммерческим. Все наоборот: это свободное программное обеспечение.

4. Программа, выполняемая из Makefile, является собственностью, а не GNU Make.

Ответ №1:

Вы можете проверить возвращаемое значение второй командой в той же строке Makefile, используя $? переменную оболочки, которая содержит последнее возвращенное значение.

Например, с помощью false команды, которая, очевидно, остановила бы компиляцию:

 test:
    /bin/false ; /usr/bin/test "$$?" -eq 1     # <-- make does not stop here
    /bin/echo "Continues ..."
    /bin/false                                 # <-- make stops here
  

Ответ №2:

Использовать

 command || [ $$? -eq v ]
  

в качестве вашей команды замените command на command, а v на значение, возвращаемое при успешном выполнении.

(Это просто более компактная версия ответа Дидье Троссе.)

Комментарии:

1. Это не будет работать как есть в makefile, потому что $? будет интерпретироваться в соответствии с определениями переменных make. Вместо этого вам нужно использовать $$? .

2. По сравнению с ответом Дидье Троссе, этот ответ также пройдет, когда команда вернется со статусом 0 (в моем случае это не то, что я хотел)!

3. @Vitaly Polonetsky: Я предполагал, что tertium не является datur . Вы можете настроить его так, как вам нравится.

Ответ №3:

В зависимости от того, как инструмент ведет себя при сбое, вы могли бы просто проверить наличие выходного файла. что-то вроде:

 @if test ! -f $(FILE); then exit 2; fi