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<<<