Programing

makefile에서 변수를 인쇄하는 방법

lottogame 2020. 4. 24. 08:01
반응형

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에 인쇄합니다 .

"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 대상과 연관되어야합니다. 그리고 그 대상 줄에는 콜론이 있어야합니다. 예제에서 :이후 를 추가 하고 다음 줄의 선행 공백을 탭으로 바꾸면 제대로 작동하지 않습니다.allmakefile

원본의 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

반응형