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)
구분 기호가 없기 때문입니다. 파일의 이 시점에서 make
a가 있는 대상이 있을 것으로 예상되지만 해당 행에는 :
없습니다 . :
(물론 새로운 변수 할당 등과 같은 다른 가능성도 있습니다)
답변2
GNU make
정확히 이를 수행하는 기능이 있으며 이름은 입니다 $(info ....)
.
a 외부에 다음 줄을 배치하면 rule
GNU 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<<<