makefile在目标的if语句中设置变量

问题描述 投票:2回答:4

我有一个包含以下内容的Makefile:

AVAR=""

all : 
    if [ -d ../old ]; then \
    (echo "$@ Ping!"; AVAR="../old"; echo $(AVAR)) \
    fi
    @echo $(AVAR)

这个想法是,取决于是否存在目录“ ../old”在AVAR中有信息(可在以后使用),但是,if评估为true,然后Ping!回显,但在if语句内部或外部均未分配任何内容给AVAR。

输出如下:

$ make all
if [ -d ../old ]; then \
        (echo "all Ping!"; AVAR="../old"; echo "") \
        fi
all Ping!

任何见解表示赞赏。

makefile build-process
4个回答
0
投票

尝试

(echo "$@ Ping!"; AVAR="../old"; echo $$AVAR) \

代替

(echo "$@ Ping!"; AVAR="../old"; echo $(AVAR)) \

0
投票

1] Makefile配方中的每个命令都在其自己的子Shell中运行。您在第一个命令(“ if”语句)中定义了AVAR,因此它对第二个命令(@echo $(AVAR))不可用。

2)在第一个命令中,您定义了AVAR,但是您没有正确地调用它。术语$(AVAR)是Make语法; Make会在执行命令之前[[before

对其进行扩展,并且由于Make对此类变量一无所知,因此它不会扩展为任何内容。您必须使用Shell来扩展它,并使用Shell语法:$AVAR。但是,如果尝试这样做,Make会将$A扩展为空,您将获得“ VAR”。因此,您用另一个$“转义了$all : if [ -d ../old ]; then \ (echo "$@ Ping!"; AVAR="../old"; echo $$AVAR) \ fi

0
投票
问题已解决,是否使用了非常糟糕的递归make选项来重新定义内容并重新解释。

0
投票
可能有点晚了,但是如果其他人有同样的问题。
© www.soinside.com 2019 - 2024. All rights reserved.