Как прервать makefile без сообщения об ошибке

Как я могу прервать makefile от продолжения других целей, если в текущей цели выполняется определенное условие.

Например:

Step01:
    @# Do something

Step02: Step01_Output
    @# Check that Step01_output meet certain condition, otherwise, abort

Step03: Step02
    @# Do somethings (of course if did not abort in Step02)

# And so on

Я пытался использовать «выход» со статусом 0 ==> Но это продолжается! Я попытался использовать «выход 1» или другой существующий статус ==> Он прерывается, но выдает сообщение об ошибке на выходе. Я хочу прервать, но все же не выдавать сообщение об ошибке при вызове оболочки make. Я также попытался установить переменную env из Step02 и окружить Step03, а затем внутри, если проверить следующим образом:

ifneq ($(ToAbort),1) 
Step03:
...
StepN

endif

К сожалению, похоже, make даже не посмотрел на условие или значение переменной не было передано между целями.

Любые идеи? Может быть, через добавление дополнительной цели или около того?


person Rubik's Cube    schedule 27.04.2016    source источник
comment
Пожалуйста, предоставьте пример из реальной жизни вместо псевдокода, есть вероятность, что это может быть проблема XY .   -  person user657267    schedule 28.04.2016


Ответы (2)


Я думаю, что make выходит только тогда, когда все цели созданы или возникает какая-либо ошибка. Кстати, команды запускаются в под-оболочках, поэтому использование «exit» не приведет к завершению работы make.

person Pan Ruochen    schedule 28.04.2016

Не уверен, что ваше мышление правильно по этому поводу. Оставьте отбраковку работы сделать.

Однако вы можете выразить то, что вы просили, с помощью небольшого количества shell и рекурсивного make (извините). Вы хотите сказать, что «если a завершается с ошибкой или без нее, то мы закончили, иначе продолжим с b».

Step01:
    command1
    command2
    command3 && ${MAKE} Step02
    command4

Step02:
    cmd5
    cmd6 && ${MAKE} Step03

⋮

Обратите внимание на эти амперсанд. if command3; then ${MAKE} Step02; fi не делает то, что вы хотите. Если make завершится ошибкой, вам не нужно продолжать работу с command4.

P.S. Не забудьте пометить эти шаги как ФАЛЬШИВЫЕ, если они не настоящие файлы.

person bobbogo    schedule 19.05.2016