Как сделать так, чтобы GNU явно проверял на неудачу? - PullRequest
62 голосов
/ 03 февраля 2010

После многих лет неиспользования make я снова нуждаюсь в нем, версия gnu. Я почти уверен, что смогу делать то, что хочу, но не понял, как, или нашел ответ в Google и т. Д.

Я пытаюсь создать тестовую цель, которая будет выполнять мою программу несколько раз, сохраняя результаты в файле журнала. Некоторые тесты должны привести к прерыванию моей программы. К сожалению, мой make-файл прерывается при первом тестировании, что приводит к ошибке. У меня есть что-то вроде:

# Makefile
# 
test:
        myProg -h > test.log              # Display help
        myProg good_input >> test.log     # should run fine
        myProg bad_input1 >> test.log      # Error 1
        myProg bad_input2 >> test.log      # Error 2

С учетом вышесказанного сделайте выход после запуска bad_input1, никогда не переходя на запуск bad_input2.

Ответы [ 3 ]

120 голосов
/ 03 февраля 2010

Поставьте - перед командой, например:

-myProg bad_input >> test.log

GNU make будет игнорировать код завершения процесса.

30 голосов
/ 03 февраля 2010

Попробуйте запустить как

make -i

или

make --ignore-errors

, который игнорирует все ошибки в всех правилах.

Я бы также предложил запустить его как

make -i 2>&1 | tee results

чтобы вы получили все ошибки и вывод, чтобы увидеть, что произошло.

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

Кстати, я бы очень рекомендовал бы получить копию книги О'Рейли по марке . Первое издание имеет превосходный обзор основной природы марки, в частности, ее обратного цепного поведения. Более поздние издания все еще хороши, но первое издание. до сих пор имеет четкое объяснение того, что на самом деле происходит. Фактически, моя собственная копия - это первое, что я передаю людям, которые приходят ко мне, чтобы задать «WTF? Вопросы» о make! (-:

16 голосов
/ 21 февраля 2014

Правильное решение, если вы хотите, чтобы цель потерпела неудачу, состоит в том, чтобы отменить ее код выхода.

# Makefile
# 
test:
    myProg -h > test.log              # Display help
    myProg good_input >> test.log     # should run fine
    ! myProg bad_input1 >> test.log      # Error 1
    ! myProg bad_input2 >> test.log      # Error 2

Теперь ошибка в этих двух случаях.

...