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

관련 정보