제가 해결하려는 패치 문제의 축소된 버전입니다. 각각 크기가 1바이트인 두 개의 파일입니다.
- 파일
a
(포함'a'
) - 파일
b
( 포함'b'
) 및
'b'
의 값을 로 변경하는 패치를 만들어 적용하는 것이 목표입니다 'a'
. Makefile의 내용은 다음과 같습니다.
patch:
diff -u b a > b2a.patch
patch -o b.corrected b < b2a.patch
diff a b.corrected
clean:
rm -f b2a.patch b.corrected
위의 내용을 고려하면 make
다음 출력으로 실패합니다.
$ make
diff -u b a > b2a.patch
make: *** [patch] Error 1
하지만 bash 쉘에서 Makefile에 있는 명령을 하나씩 실행해 보면 전혀 문제가 없습니다.
답변1
Make는 종료 코드 0이 성공을 나타내고 다른 값은 실패를 나타낸다고 가정합니다. 이는 거의 모든 명령줄 도구에서 사용되는 표준 규칙입니다.
불행히도 diff
그 중 하나는 아닙니다. GNU 차이점 정보 페이지를 확인하고단일 Unix 사양 "diff" 항목, 0은 차이가 발견되지 않았음을 의미하고, 1은 차이가 발견되었음을 의미하며, ≥2는 오류가 있음을 의미합니다.
주석에서 했던 것처럼 명령 앞에 하이픈을 붙여서 종료 상태를 완전히 무시하도록 Make에게 지시할 수 있습니다. 그러나 이렇게 하면 실제 오류가 무시됩니다. 아마도 원하는 것이 아닐 수도 있습니다. 대신 다음을 수행할 수 있습니다.
patch:
diff -u b a > b2a.patch; [ $$? -eq 1 ]
patch -o b.corrected b < b2a.patch
diff a b.corrected; [ $$? -eq 1 ]
; [ $$? -eq 1 ]
두 개의 diff 줄 끝에 내가 추가한 비트를 확인하세요 . ; test $$? -eq 1
물론 그것도 사용할 수 있습니다. 쉘 $?
변수는 $$?
일반적인 Makefile 이스케이프 규칙으로 인해 발생합니다. 이는 아마도 여러분이 원하는 종료 상태 0(차이 없음)도 거부한다는 점에 유의하세요.
그런데: 실제로 이렇게 되어야 할 것 같습니다.
patch: b.corrected
diff …
b.corrected: b2a.patch
patch …
b2a.patch: a b
diff …
a와 b를 수정하고 파일을 올바르게 재생성할 수 있습니다.