Makefile - 단일 단계에서 여러 변수 설정

Makefile - 단일 단계에서 여러 변수 설정

이 Makefile이 있는데 단순히 일부 변수를 설정하는 데 문제가 있습니다.

my_stage:   
    echo "FULL_NAME=$(FULL_NAME)"
    echo "MY_NAME=$(MY_NAME)"

    $(eval SOME_NAME=$(shell sh -c "echo ${FULL_NAME} | cut -d"-" -f 2"))
    echo "SOME_NAME=$(SOME_NAME)"

    $(eval NAME_ONLY=$(shell sh -c "echo ${SOME_NAME}-only))
    echo "NAME_ONLY=$(NAME_ONLY)"

    $(eval RIGHT_NAME=$(shell sh -c "echo ${SOME_NAME}-right))

    $(eval NAME_APPENDED=$(shell sh -c "echo ${RIGHT_NAME}.${MY_NAME}))
    echo "NAME_APPENDED=$(NAME_APPENDED)"

가장한 결과는 다음과 같습니다.

FULL_NAME=Shop-with-me
MY_NAME=Mariana
SOME_NAME=with
NAME_ONLY=with-only
NAME_APPENDED=with-right.Mariana

그러나 현재 결과는 다음과 같습니다.

FULL_NAME=Shop-with-me
MY_NAME=Mariana
SOME_NAME=with
NAME_ONLY=
NAME_APPENDED=

누군가 내가 무슨 일이 일어나고 있는지 알아내도록 도와줄 수 있나요? 내가 뭘 잘못했나요?

나는 또한 이것을 시도했지만 (성공하지 못했습니다):

my_stage:   
    echo "FULL_NAME=$(FULL_NAME)"
    echo "MY_NAME=$(MY_NAME)"

    $(eval SOME_NAME=$(shell sh -c "echo ${FULL_NAME} | cut -d"-" -f 2"))
    echo "SOME_NAME=$(SOME_NAME)"

    NAME_ONLY = ${SOME_NAME}-only
    echo "NAME_ONLY=$(NAME_ONLY)"

    RIGHT_NAME = ${SOME_NAME}-right

    NAME_APPENDED = ${RIGHT_NAME}.${MY_NAME}
    echo "NAME_APPENDED=$(NAME_APPENDED)"

답변1

${FOO}명령에 중괄호(예: )를 사용하면 aa를 참조하는 것입니다.껍데기호출 쉘에 정의된 변수 make.

$(fOO)예를 들어 명령에서 괄호를 사용하면 make의 변수를 참조하는 것입니다.

make의 변수만 설정하므로 동일한 이름의 쉘 변수를 참조하면 분명히 null 값이 발생합니다.

그래서 $(eval NAME_ONLY=$(shell sh -c "echo $(SOME_NAME)-only))작동해야합니다.

단순함은 $(eval NAME_ONLY = $(SOME_NAME)-only)규칙을 따라야 합니다. 이를 위해 쉘을 호출할 필요는 없습니다.

make 사용을 고려할 수도 있습니다.텍스트 기능, 좋다 subst.

답변2

어쩌면 .ONESHELL이 의도한 목적을 달성할 수도 있습니다.

gnu make는 기본적으로 각 레시피 라인에 대해 새 프로세스를 시작하므로 변수 설정은 다음 레시피에 전파되지 않습니다. .ONESHELL은 단일 셸 호출로 이 대상에 대한 모든 레시피를 실행하려고 시도합니다.

https://www.gnu.org/software/make/manual/make.html#One-Shell .ONESHELL:

관련 정보