GNU Make 패턴 규칙에서 와일드카드 사용

GNU Make 패턴 규칙에서 와일드카드 사용

가정이 doc.pdf목표입니다.

다음 규칙은 doc.pdf업데이트될 때 재생성을 트리거하지만 doc.refer전혀 존재하지 않는 경우에도 만족합니다.doc.refer

doc.pdf: doc.mom $(wildcard doc.refer)
    pdfmom -e -k < $< > $@

그러나 다음 패턴 규칙은 동일한 작업을 수행하지 않습니다(PDF를 올바르게 생성하지만 변경 시 다시 작성을 트리거하지 않음 doc.refer).

%.pdf: %.mom Makefile $(wildcard %.refer)
    pdfmom -e -k < $< > $@

문자가 확장되기 전에 wildcard명령이 실행되는 것 같습니다 . %이 문제를 어떻게 해결할 수 있나요?

답변1

GNU Make 기능wildcard쉘 와일드카드 패턴을 가져와 패턴과 일치하는 파일로 확장합니다. 이 패턴에는 %.refer쉘 와일드카드 패턴이 포함되어 있지 않습니다.

당신은 다음과 같은 것을 원할 수도 있습니다

%.pdf: %.mom %.refer
        pdfmom -e -k < $< > $@

%.pdf: %.mom
        pdfmom -e -k < $< > $@

a가 있으면 첫 번째 대상이 호출되어 PDF 파일을 만듭니다..mom 그리고.refer문서의 기본 이름으로 사용할 수 있는 파일입니다. 사용 가능한 파일이 없으면 .refer두 번째 대상이 호출됩니다.

이러한 목표의 순서는 중요합니다.

답변2

당신은 사용할 수 있습니다두 번째 확장:

.SECONDEXPANSION:
%.pdf: %.mom Makefile $$(wildcard %.refer)
    pdfmom -e -k < $< > $@

답변3

GNU Make는 모든 함수를 평가하여 패턴 규칙의 내부 표현을 생성합니다.

따라서 $(wildcard %.refer)규칙은 빈 문자열로 평가됩니다.

목표를 달성하는 유일한 방법은 규칙 순서를 활용하는 것입니다. 선행은 이루기가 어렵다솔루션 제안 (info "(make)Pattern Match"):

10.5.4 How Patterns Match

   It is possible that more than one pattern rule will meet these
criteria.  In that case, 'make' will choose the rule with the shortest
stem (that is, the pattern that matches most specifically).  If more
than one pattern rule has the shortest stem, 'make' will choose the
first one found in the makefile.

관련 정보