[variables] Makefile에서 여러 줄 문자열 변수를 만들 수 있습니까?

여러 줄로 된 문자열 (예 : 이메일 릴리스 공지의 본문) 인 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"