.make 및 파이프에 대한 DELETE_ON_ERROR 동작

.make 및 파이프에 대한 DELETE_ON_ERROR 동작

규칙이 실패하면 대상은 .DELETE_ON_ERRORmake에게 대상을 제거하라고 지시합니다. 그러나 종료 상태 값은 $?파이프라인의 마지막 프로그램 값을 보유하므로 파이프라인에서는 작동하지 않습니다 . 예를 들어 다음 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이 규칙을 적용하려는 각 줄에 이를 추가해야 합니다.

shPOSIX뿐만 ​​아니라 모든 POSIX에서 작동하도록 하려면 bash대답이 더 복잡합니다.

관련 정보