Makefile의 "재귀 확장 변수 할당"과 "단순 확장 변수 할당"의 차이점은 무엇입니까?

Makefile의 "재귀 확장 변수 할당"과 "단순 확장 변수 할당"의 차이점은 무엇입니까?

나는 그들 사이의 차이점에 대해 혼란스러워합니다.

GNU 문서를 읽었지만 여전히 혼란스럽습니다.

지정한 값은 그대로 설치됩니다. 다른 변수에 대한 참조가 포함되어 있으면 해당 변수가 대체될 때마다(다른 문자열을 확장하는 과정에서) 이러한 참조가 확장됩니다. 이런 일이 발생하는 경우를 재귀 확장이라고 합니다.

변수가 정의되면 단순 확장된 변수의 값이 한 번 스캔되어 다른 변수 및 함수에 대한 참조가 확장됩니다. 확장이 완료되면 변수 값은 더 이상 확장되지 않습니다. 변수를 사용하면 값이 확장으로 그대로 복사됩니다. 변수에 대한 값 참조가 포함된 경우 확장 결과에는 변수가 정의된 당시의 값이 포함됩니다.

누구든지 그들의 차이점을 명확하게 설명할 수 있습니까?

감사합니다.

답변1

설명하려는 모든 문서는 (를 사용할 때 중첩된 확장을 처리하는 것의 차이점입니다.재귀 할당, =) 및 할당 시 (간단한 숙제, :=).


간단한 예를 들어보세요:

이것

foo = abc
bar = $(foo)
foo = xyz

all:
    echo $(bar)

$(foo)사용 시 확장되는 "xyz"를 인쇄합니다 .$(bar)

하지만 이것은:

foo := abc
bar := $(foo)
foo := xyz

all:
    echo $(bar)

$(foo)설정 후 확장되는 "abc"를 인쇄합니다 .bar


마찬가지로, 이

xyzzy = $(shell date >&2)

foo:
    : $(xyzzy)
    : $(xyzzy)

사용될 때 date두 번 실행(및 stderr로 인쇄)됩니다 .$(xyzzy)

비록 이것이:

xyzzy := $(shell date >&2)

foo:
    : $(xyzzy)
    : $(xyzzy)

set 때 date한 번 실행하고 stderr에 인쇄합니다 . xyzzy이 경우 대상이 처리되지 않더라도 date대상이 실행됩니다.foo

관련 정보