Makefile에서 Heredoc을 사용하세요. 가능합니까?

Makefile에서 Heredoc을 사용하세요. 가능합니까?

내가 사용하는 기본 단계 Makefile는 다른 옵션에 대한 도움말 문서를 인쇄하는 것입니다. EOF여러 섹션 대신 섹션을 하나만 추가할 수 있으면 좋을 것 같습니다 echo. bash 스크립트처럼 사용할 수 있습니까 EOF?Makefile

답변1

GNU make를 사용하는 경우 다음 define구문을 사용할 수 있습니다.여러 줄 변수:

define message =
You can also include make macros like
    $$@ = $@
in a multi-line variable
endef

help:; @ $(info $(message)) :

놀면서value함수합export.ONESHELL지시문을 사용하면 Makefile에 전체 스크립트를 포함할 수도 있습니다. 그러면 전역적으로 열지 않고도 여러 줄 명령을 사용할 수 있습니다 .

define _script
echo SHELL is $SHELL, PID is $$
cat <<'EOF'
literally $SHELL and $$
EOF
endef
export script = $(value _script)

run:; @ eval "$$script"

줄게

SHELL is /bin/sh, PID is 12434
literally $SHELL and $$

답변2

간단한 대답은 "기본적으로는 아닙니다"입니다. 하지만 GNU make를 구성하여 다음을 사용할 수 있도록 할 수 있습니다..ONESHELL:

일반적으로 레시피의 각 라인은 자체 쉘에서 실행됩니다. 더 나쁜 것은, make에서 여러 줄의 명령을 만드는 방법이 있다는 것입니다. \줄의 끝 부분에 를 사용하여 계속하는 것입니다. 불행히도 이것은 \쉘에도 전달됩니다.이것은 다른 명령에서는 큰 문제가 아니지만 heredoc에서는 구문이 실제로 엉망이 됩니다.

그러나 .ONESHELL:이 논리를 활성화하면 명령이 단일 셸에서 실행되어 작동할 수 있습니다.

.ONESHELL:

all:
    cat << EOF
    aaa
    bbb
    EOF

이는 Make의 기능에 추가적인 영향을 미친다는 점에 유의하십시오. 특히 Make는 다른 빌드 라인이 다음에 오는 경우 빌드 라인이 실패하는지 알아차리지 못할 수 있습니다. 보통은 각 라인의 결과를 확인하지만, .ONESHELL:make를 사용하면 모든 라인의 결과만 볼 수 있습니다.

관련 정보