GNU Make를 사용하여 규칙 외부에 변수를 표시하는 것이 가능합니까?

GNU Make를 사용하여 규칙 외부에 변수를 표시하는 것이 가능합니까?

GNU Make를 사용하여 규칙 외부에 변수를 표시하는 것이 가능합니까?

다음 Makefile을 고려하십시오.

x = foo bar baz

ifdef x
    @echo $(x)
endif

이로 인해Makefile:4: *** commands commence before first target. Stop.

그러나 규칙을 추가하면 작동합니다.

x = foo bar baz

ifdef x
t:
    @echo $(x)
endif

디버깅 등을 위한 변수 출력 규칙을 꼭 추가해야 합니까?

보너스:

을 제거하면 ifdef결과 가 나타나는 이유는 무엇입니까 Makefile:3: *** missing separator. Stop.?

x = foo bar baz

@echo $(x)

답변1

음, 가능하지만 쓸모가 없습니다.

Makefile은 쉘 스크립트와 다르다는 점을 이해해야 합니다. Makefile은 대상과 해당 대상을 만들기 위해 수행해야 할 작업을 지정합니다. 이를 염두에 둔다면 Makefile에서 가짜 명령을 실행하는 것은 개념적인 문제가 됩니다. 해당 명령은 언제 실행되나요? 해당 명령을 실행하는 대상이 없습니다.

다음을 수행할 수 있습니다.

MY_VAR := $(shell ls)

all:
    @echo MY_VAR IS $(MY_VAR)

저는 GNU 로 가정했습니다 make. 이것은 당신을 위해 실행되고 ls출력을 MY_VAR. 하지만 이는 피해야 할 해킹입니다.

추가 타겟을 시도해 볼 수도 있습니다.

extra: 
     @echo $(x)

다른 모든 대상에 대한 사전 요구 사항으로 추가합니다.

보너스는 줄에 @echo $(x)구분 기호가 없기 때문입니다. 파일의 이 시점에서 makea가 있는 대상이 있을 것으로 예상되지만 해당 행에는 :없습니다 . :(물론 새로운 변수 할당 등과 같은 다른 가능성도 있습니다)

답변2

GNU make정확히 이를 수행하는 기능이 있으며 이름은 입니다 $(info ....).

a 외부에 다음 줄을 배치하면 ruleGNU make가 이를 실행합니다:

$(info variable x = $x))

그리고 이런 종류의 작업을 반복적으로 수행하는 경우에는 이를 추상화하여 macro필요할 때마다 호출할 수 있습니다.

make -f - <<\eof

dumpvar = $(info variable `$1' value is >>>$($1)<<<)

ssl_enable = NO
$(call dumpvar,ssl_enable)

.PHONY: all
all:;@:
eof

stout에는 다음이 표시됩니다.

variable `ssl_enable' value is >>>NO<<<

관련 정보