여러 줄로 된 문자열 (예 : 이메일 릴리스 공지의 본문) 인 makefile 변수를 만들고 싶습니다. 뭔가
ANNOUNCE_BODY="
Version $(VERSION) of $(PACKAGE_NAME) has been released
It can be downloaded from $(DOWNLOAD_URL)
etc, etc"
그러나 나는 이것을 할 방법을 찾지 못하는 것 같습니다. 가능할까요?
답변
예, 다음과 같이 define 키워드를 사용하여 여러 줄 변수를 선언 할 수 있습니다.
define ANNOUNCE_BODY
Version $(VERSION) of $(PACKAGE_NAME) has been released.
It can be downloaded from $(DOWNLOAD_URL).
etc, etc.
endef
까다로운 부분은 여러 줄 변수를 makefile에서 다시 가져 오는 것입니다. “echo $ (ANNOUNCE_BODY)”를 사용하는 명백한 작업을 수행하면 다른 사람들이 여기에 게시 한 결과를 볼 수 있습니다. 쉘은 변수의 두 번째 및 후속 줄을 명령 자체로 처리하려고합니다.
그러나 변수 값을있는 그대로 셸에 환경 변수로 내 보낸 다음 셸에서 환경 변수 (make 변수 아님)로 참조 할 수 있습니다. 예를 들면 :
export ANNOUNCE_BODY
all:
@echo "$$ANNOUNCE_BODY"
일반 make 변수 참조가 $$ANNOUNCE_BODY
아닌 셸 환경 변수 참조를 나타내는 의 사용에 유의하십시오 $(ANNOUNCE_BODY)
. 또한 변수 참조 주위에 따옴표를 사용하여 개행 문자가 쉘 자체에서 해석되지 않도록하십시오.
물론,이 특별한 트릭은 플랫폼과 쉘에 민감 할 수 있습니다. GNU bash 3.2.13을 사용하여 Ubuntu Linux에서 테스트했습니다. YMMV.
답변
‘메이크 파일에서 여러 줄 변수를 다시 가져 오는 방법'(Eric Melski가 ‘까다로운 부분’으로 언급)에 대한 또 다른 접근 방식은 subst
함수를 사용 define
하여 여러 줄 문자열에 도입 된 줄 바꿈 을 \n
. 그런 다음 -e와 함께 사용 echo
하여 해석하십시오. 이를 수행하는 에코를 얻으려면 .SHELL = bash를 설정해야 할 수도 있습니다.
이 접근 방식의 장점은 다른 이스케이프 문자를 텍스트에 넣고 존중한다는 것입니다.
이런 종류의 방법은 지금까지 언급 한 모든 접근 방식을 종합합니다.
당신은 다음과 같이 끝납니다.
define newline
endef
define ANNOUNCE_BODY=
As of $(shell date), version $(VERSION) of $(PACKAGE_NAME) has been released.
It can be downloaded from $(DOWNLOAD_URL).
endef
someTarget:
echo -e '$(subst $(newline),\n,${ANNOUNCE_BODY})'
최종 에코의 작은 따옴표가 중요합니다.
답변
표준 출력에 변수의 내용 만 인쇄한다고 가정하면 다른 해결책이 있습니다.
do-echo:
$(info $(YOUR_MULTILINE_VAR))
답변
예. 다음과 같이 줄 바꿈을 이스케이프합니다 \
.
VARIABLE="\
THIS IS A VERY LONG\
TEXT STRING IN A MAKE VARIABLE"
최신 정보
아, 개행을 원하십니까? 그렇다면 바닐라 메이크에는 방법이 없다고 생각합니다. 그러나 명령 부분에서 항상 here-document를 사용할 수 있습니다.
[작동하지 않습니다. MadScientist의 의견 참조]
foo:
echo <<EOF
Here is a multiple line text
with embedded newlines.
EOF
답변
Eric Melski의 답변에 대한 포스트 스크립트 일뿐입니다. 텍스트에 명령 출력을 포함 할 수 있지만 쉘 구문 “$ (foo)”대신 Makefile 구문 “$ (shell foo)”를 사용해야합니다. 예를 들면 :
define ANNOUNCE_BODY
As of $(shell date), version $(VERSION) of $(PACKAGE_NAME) has been released.
It can be downloaded from $(DOWNLOAD_URL).
endef
답변
이것은 here 문서를 제공하지 않지만 파이프에 적합한 방식으로 여러 줄 메시지를 표시합니다.
=====
MSG = this is a\\n\
multi-line\\n\
message
method1:
@$(SHELL) -c "echo '$(MSG)'" | sed -e 's/^ //'
=====
Gnu의 호출 가능 매크로를 사용할 수도 있습니다.
=====
MSG = this is a\\n\
multi-line\\n\
message
method1:
@echo "Method 1:"
@$(SHELL) -c "echo '$(MSG)'" | sed -e 's/^ //'
@echo "---"
SHOW = $(SHELL) -c "echo '$1'" | sed -e 's/^ //'
method2:
@echo "Method 2:"
@$(call SHOW,$(MSG))
@echo "---"
=====
출력은 다음과 같습니다.
=====
$ make method1 method2
Method 1:
this is a
multi-line
message
---
Method 2:
this is a
multi-line
message
---
$
=====
답변
줄 끝을 정의하기 위해 문자열의 \ n 문자를 사용하지 않는 이유는 무엇입니까? 또한 백 슬래시를 추가하여 여러 줄에 추가합니다.
ANNOUNCE_BODY=" \n\
Version $(VERSION) of $(PACKAGE_NAME) has been released \n\
\n\
It can be downloaded from $(DOWNLOAD_URL) \n\
\n\
etc, etc"
