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变量,如调用 的 shell 中所定义make

$(fOO)当您在命令中使用括号(例如)时,您引用的是 make 的变量。

由于您只设置 make 的变量,显然引用同名的 shell 变量将导致空值。

所以$(eval NAME_ONLY=$(shell sh -c "echo $(SOME_NAME)-only))应该有效。

简单$(eval NAME_ONLY = $(SOME_NAME)-only)应该遵循规则。您不需要为此调用 shell。

您还可以考虑使用 make文本函数, 喜欢subst

答案2

也许.ONESHELL 会实现预期目的。

由于 gnu make 默认为每个配方行启动一个新进程,因此变量设置不会传播到下面的配方。 .ONESHELL 尝试在单个 shell 调用中运行该目标的所有配方

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

相关内容