Make는 변경 시 패턴 규칙의 전이 종속성을 다시 빌드하지 않습니다. 이유는 무엇입니까?

Make는 변경 시 패턴 규칙의 전이 종속성을 다시 빌드하지 않습니다. 이유는 무엇입니까?

대략 다음과 같은 Makefile이 있습니다.

.PRECIOUS: %.a %.b %.c

%.a:
        touch $@

%.b: %.a
        touch $@

%.c: %.b
        touch $@

를 사용하여 "test.c"를 생성하면 make test.c3개 파일( test.a, test.b, test.c)이 모두 올바르게 생성됩니다. 그러나 지금 삭제 test.a한 후 다시 생성하려고 하면 test.c아무 일도 일어나지 않습니다.

그 이유는 분명합니다. test.c에만 의존 test.b하고 test.b변경되지 않았으므로 다시 빌드할 필요가 없습니다. 다만, 없어진 test.b만큼 재구축해야 하고 test.a, 로 확산시켜야 한다 test.c. 나는 이 행동이 매우 직관적이지 않은 부작용이라고 생각합니다.

직관적인 방법으로 "전이적" 종속성을 처리하도록 make를 얻을 수 있나요? (즉, 삭제 후 test.a모든 대상을 다시 빌드해야 합니다.)

문제는 패턴 규칙에서만 발생합니다.

(Ps 저는 모든 중간 파일이 필요하기 때문에 PRECIOUS.GNU Make의 기본 동작은 중간 파일을 제거하는 것입니다.)

답변1

일반적으로 전통적으로 명명된 잘못된 대상을 사용합니다.전제 조건 %.a이므로 존재하지 않으면 항상 빌드됩니다. 추가적으로, gnu make에는 .NOTINTERMEDIATE 특별한 목표중간 파일은 삭제하지 않습니다(그러나 와 달리 오류 및 중단 시에는 삭제함 .PRECIOUS).

.NOTINTERMEDIATE: %.a %.b %.c
.PHONY: FORCE
%.a: FORCE
    touch $@
%.b: %.a
    touch $@
%.c: %.b
    touch $@

관련 정보