내 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 world
stdout에 인쇄합니다 .
답변
당으로 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