[makefile] makefile에서 변수를 출력하는 방법

내 makefile에 변수 ‘NDK_PROJECT_PATH’가 있는데, 내 질문은 컴파일 할 때 어떻게 인쇄 할 수 있습니까?

“$ PATH”문자열을 표시하는 파일 에코 작성을 읽고 다음을 시도했습니다.

@echo $(NDK_PROJECT_PATH)
@echo $(value NDK_PROJECT_PATH)

둘 다 나에게 준다

"build-local.mk:102: *** missing separator.  Stop."

왜 그것이 나를 위해 작동하지 않는지 알고 있습니까?



답변

이 메소드를 사용하여 “var”라는 변수를 사용하여 makefile을 읽을 때 (이 질문에 적절하게 태그를 붙인대로 GNU make라고 가정) 변수를 인쇄 할 수 있습니다.

$(info $$var is [${var}])

이 구성을 레시피에 추가하여 make가 쉘에 전달할 내용을 확인할 수 있습니다.

.PHONY: all
all: ; $(info $$var is [${var}])echo Hello world

이제 여기에서 일어나는 일은 전체 레시피 ( $(info $$var is [${var}])echo Hello world)를 재귀 적으로 확장 된 단일 변수로 저장하는 것 입니다. make가 레시피를 실행하기로 결정하면 (예를 들어 build 명령을 할 때 all) 변수를 확장 한 다음 각 결과 행을 개별적으로 쉘에 전달합니다.

따라서 고통스러운 세부 사항 :

  • 확대 $(info $$var is [${var}])echo Hello world
  • 이를 위해 먼저 확장 $(info $$var is [${var}])
    • $$ 리터럴이된다 $
    • ${var}된다 :-)(말)
    • 부작용은 $var is [:-)]표준 출력에 나타납니다
    • $(info...)비록 의 확장 은 비어 있습니다
  • 확인하다 echo Hello world
    • echo Hello world쉘에 무엇을 할 것인지 알려면 stdout에 먼저 인쇄하십시오 .
  • 쉘은 Hello worldstdout에 인쇄합니다 .

답변

당으로 GNU 것은 설명서를 확인 하고 또한 답변을 아래에 ‘bobbogo’에 의해 지적, 당신이 사용할 수있는 정보 / 경고 / 오류를 표시 텍스트로.

$(error   text…)
$(warning text…)
$(info    text…)

변수를 인쇄하려면

$(error   VAR is $(VAR))
$(warning VAR is $(VAR))
$(info    VAR is $(VAR))

‘error’는 오류 문자열을 표시 한 후 make 실행을 중지 합니다.


답변

“Mr. Make post”에서
https://www.cmcrossroads.com/article/printing-value-makefile-variable

Makefile에 다음 규칙을 추가하십시오.

print-%  : ; @echo $* = $($*)

그런 다음 makefile 변수의 값을 찾으려면 다음을 수행하십시오.

make print-VARIABLE

그리고 그것은 반환됩니다 :

VARIABLE = the_value_of_the_variable


답변

단순히 일부 출력을 원한다면 $(info)자체적 으로 사용하고 싶습니다 . Makefile의 어느 곳에서나 할 수 있으며 해당 라인이 평가되면 표시됩니다.

$(info VAR="$(VAR)")

VAR="<value of VAR>"프로세스가 해당 라인을 만들 때마다 출력 됩니다. 이 동작은 위치에 따라 달라 지므로 $(info)수정할 수있는 모든 항목 $(VAR)이 이미 발생한 후에 확장 이 수행되도록해야합니다 !

보다 일반적인 옵션은 변수 값을 인쇄하기위한 특수 규칙을 작성하는 것입니다. 일반적으로 변수가 지정된 후에 규칙이 실행되므로 실제로 사용중인 값이 표시됩니다. ( 규칙에서 변수를 변경할 수 있습니다 .) 올바른 형식을 지정하면 변수가 무엇으로 설정되어 있는지 명확하게하는 데 도움이되고 $(flavor)함수는 변수의 종류를 알려줍니다. 따라서이 규칙에서 :

print-% : ; $(info $* is a $(flavor $*) variable set to [$($*)]) @true
  • $*% 패턴 이 규칙에서 일치 하는 줄기로 확장됩니다 .
  • $($*)로 이름이 지정된 변수의 값으로 확장됩니다 $*.
  • [하고 ]명확 변수 확장을 묘사. 당신은 또한 사용할 수 ""또는 유사한.
  • $(flavor $*)어떤 종류의 변수인지 알려줍니다. 참고 : 확장이 아닌 $(flavor)
    변수 이름을 사용 합니다. 그래서 당신이 말하면 make print-LDFLAGS, 당신은 $(flavor LDFLAGS)원하는 것입니다.
  • $(info text)출력을 제공합니다.
    확인 인쇄 text확장의 부작용으로는 표준 출력에. $(info)그래도 확장 은 비어 있습니다. 당신은 그것을 생각할 수 @echo있지만 중요한 것은 쉘을 사용하지 않기 때문에 쉘 인용 규칙에 대해 걱정할 필요가 없습니다.
  • @true규칙에 대한 명령을 제공하기 만합니까? 그렇지 않으면
    make 도 출력 print-blah is up to date합니다. 나는 @true그것이 no-op라는 것을 더 분명하게 느낀다 .

그것을 실행하면

$ make print-LDFLAGS
LDFLAGS is a recursive variable set to [-L/Users/...]


답변

@echo $ (NDK_PROJECT_PATH)가 좋은 방법입니다. 나는 오류가 거기에서 온다고 생각하지 않습니다. 일반적 으로이 오류는 의도를 잘못 입력했을 때 나타납니다. 탭이 있어야 할 공간이 있다고 생각합니다.


답변

모든 버전의 make명령 줄에는 줄의 첫 문자로 TAB (공백 아님)이 들여 쓰기되어야합니다. 문제의 두 줄 대신 전체 규칙을 보여 주면 더 명확한 답변을 줄 수 있지만 다음과 같이되어야합니다.

myTarget: myDependencies
        @echo hi

여기서 두 번째 줄의 첫 번째 문자는 TAB이어야합니다.


답변

실행 make -n; 변수의 값을 보여줍니다.

메이크 파일 …

all:
        @echo $(NDK_PROJECT_PATH)

명령:

export NDK_PROJECT_PATH=/opt/ndk/project
make -n

산출:

echo /opt/ndk/project