규칙이 실패하면 대상은 .DELETE_ON_ERROR
make에게 대상을 제거하라고 지시합니다. 그러나 종료 상태 값은 $?
파이프라인의 마지막 프로그램 값을 보유하므로 파이프라인에서는 작동하지 않습니다 . 예를 들어 다음 makefile은 새로 생성된 파일을 삭제하지 않습니다.부자.
.DELETE_ON_ERROR:
foo:
false | true > foo
파이프라인의 어떤 항목이라도 실패할 경우(예: 배열 요소에 0이 아닌 값이 있는 경우 $PIPESTATUS
) make가 규칙을 실패로 처리하도록 하는 방법이 있습니까?
답변1
Bash를 사용하는 경우 파이프라인 실패 옵션을 전역적으로 설정할 수도 있습니다. 파이프라인 중간에서도 오류를 포착하는 메이크파일 시작 부분에 하나가 있었습니다.
# Make sure any errors in the middle of a pipe cause the build to fail
SHELL=/bin/bash -e -o pipefail
(MadScientist의 의견에 따라 /bin/sh에서 /bin/bash로 변경되었습니다.)
답변2
makefile에 bash
쉘이 있을 것이라고 확신하는 경우에는 파이프라인실패 옵션을 설정해 볼 수 있습니다.
SHELL=bash
.DELETE_ON_ERROR:
foo:
set -o pipefail; false | true > foo
규칙의 각 줄은 별도의 셸 인스턴스에서 실행되므로 set -o pipefail
이 규칙을 적용하려는 각 줄에 이를 추가해야 합니다.
sh
POSIX뿐만 아니라 모든 POSIX에서 작동하도록 하려면 bash
대답이 더 복잡합니다.