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 world
stdout에 인쇄합니다 .
"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
위의 답변에서 'bobbogo'와 GNU Make 매뉴얼에 따라 info / warning / error를 사용하여 텍스트를 표시 할 수 있습니다.
$(error text…)
$(warning text…)
$(info text…)
변수를 인쇄하려면
$(error VAR is $(VAR))
$(warning VAR is $(VAR))
$(info VAR is $(VAR))
'error'를 사용하면 오류 문자열이 표시된 후 make 실행이 중지됩니다.
단순히 일부 출력을 원한다면 $(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
이 makefile
'실종 분리'오류 메시지를 생성합니다 :
all
@echo NDK_PROJECT_PATH=$(NDK_PROJECT_PATH)
done:
@echo "All done"
앞에는 탭이 @echo "All done"
있지만 ( done:
규칙과 동작은 대체로 불필요하지만) 앞에는 없습니다 @echo PATH=$(PATH)
.
문제는 줄 시작 all
에 콜론 :
이나 등호가 =
있어야 목표 줄이나 매크로 줄임 을 나타내며 구분 기호가 없어야합니다 .
변수 값을 반영하는 조치는 대상, 더미 또는 PHONEY 대상과 연관되어야합니다. 그리고 그 대상 줄에는 콜론이 있어야합니다. 예제에서 :
이후 를 추가 하고 다음 줄의 선행 공백을 탭으로 바꾸면 제대로 작동하지 않습니다.all
makefile
원본의 102 행 근처에 비슷한 문제가있을 수 있습니다 makefile
. 실패한 에코 조작 전에 비 공백 비 주석 라인을 5 개 표시 한 경우 진단을 완료 할 수 있습니다. 그러나 2013 년 5 월 makefile
에이 질문이 제기 된 이후 지금 은 고장난 제품 을 아직 사용할 수 없을 가능성 이 높으므로 (2014 년 8 월)이 답변을 공식적으로 확인할 수는 없습니다. 문제가 발생한 그럴듯한 방법을 설명하기 위해서만 사용할 수 있습니다.
문제는 echo가 실행 블록에서만 작동한다는 것입니다. 즉 "xx :"다음에 나오는 것
따라서 첫 번째 실행 블록 위의 것은 초기화이므로 실행 명령을 사용할 수 없습니다.
실행 blocl을 작성하십시오.
Makefile을 수정할 필요가 없습니다.
$ cat printvars.mak
print-%:
@echo '$*=$($*)'
$ cd /to/Makefile/dir
$ make -f ~/printvars.mak -f Makefile print-VARIABLE
변수 값을 인쇄하려면 다음을 사용할 수 있습니다.
rule:
<tab>@echo $(VAR_NAME)
규칙이 실행되면 변수가 인쇄됩니다.
이것은 일반적인 방법으로 수행 될 수 있으며 복잡한 makefile을 디버깅 할 때 매우 유용 할 수 있습니다. 다른 답변 에서 설명한 것과 동일한 기술을 사용 하면 다음을 모든 메이크 파일에 삽입 할 수 있습니다.
# if the first command line argument is "print"
ifeq ($(firstword $(MAKECMDGOALS)),print)
# take the rest of the arguments as variable names
VAR_NAMES := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
# turn them into do-nothing targets
$(eval $(VAR_NAMES):;@:))
# then print them
.PHONY: print
print:
@$(foreach var,$(VAR_NAMES),\
echo '$(var) = $($(var))';)
endif
그런 다음 "make print"를 수행하여 모든 변수의 값을 덤프 할 수 있습니다.
$ make print CXXFLAGS
CXXFLAGS = -g -Wall
Makefile 자체를 수정하지 않으려면 --eval
새 대상을 추가 한 다음 새 대상을 실행하는 데 사용할 수 있습니다 (예 :
make --eval='print-tests: @echo TESTS $(TESTS) ' print-tests
명령 줄에 필요한 TAB 문자를 삽입 할 수 있습니다. CTRL-V, TAB
위의 Makefile 예 :
all: do-something
TESTS=
TESTS+='a'
TESTS+='b'
TESTS+='c'
do-something:
@echo "doing something"
@echo "running tests $(TESTS)"
@exit 1
android make (mka) @echo $(NDK_PROJECT_PATH)
를 *** missing separator. Stop."
사용 하면 Android make에서 변수를 인쇄하려고하면 작동하지 않으며 오류가 발생 합니다.
NDK_PROJECT_PATH := some_value
$(warning $(NDK_PROJECT_PATH))
그것은 나를 위해 일했다
변수 값을보고 싶다면 일반적으로 오류가 발생합니다 (값을보고 싶을 때만 실행이 중지됩니다).
@echo $ (오류 NDK_PROJECT_PATH = $ (NDK_PROJECT_PATH))
참고 URL : https://stackoverflow.com/questions/16467718/how-to-print-out-a-variable-in-makefile
'Programing' 카테고리의 다른 글
미확인 개발자가 제공 한 앱을 열 수 없습니다. (0) | 2020.04.24 |
---|---|
바이트 단위의 파일 크기를 사람이 읽을 수있는 문자열로 변환 (0) | 2020.04.24 |
ASP.NET 웹 API에 대한 JWT 인증 (0) | 2020.04.24 |
SQL Server 2008 Express의 로컬 인스턴스에 연결하는 방법 (0) | 2020.04.24 |
왜 우리는 C 연합이 필요합니까? (0) | 2020.04.24 |