如何计算Makefile变量?

时间:2016-10-06 08:16:57

标签: makefile escaping

我刚才使用Makefiles&我很困惑......

我在Makefile中有以下内容......

USER_ID := $(id -u)
USER_ID_ESC := $$(id -u)

MAKEFILE := $(realpath $(lastword $(MAKEFILE_LIST)))
ROOT_DIR := $(dir $(MAKEFILE))


x:
    echo $${USER_ID}
    echo ${USER_ID}
    echo $(USER_ID)
    echo $${USER_ID_ESC}
    echo ${USER_ID_ESC}
    echo $(USER_ID_ESC)
    echo $${ROOT_DIR}
    echo ${ROOT_DIR}
    echo $(ROOT_DIR)
    exit 0

哪个给出输出......

echo ${USER_ID}

echo

echo

echo ${USER_ID_ESC}

echo $(id -u)
502
echo $(id -u)
502
echo ${ROOT_DIR}

echo /Users/toby/src/bitbucket.org/limtool/commissioning-tool-api/
/Users/toby/src/bitbucket.org/limtool/commissioning-tool-api/
echo /Users/toby/src/bitbucket.org/limtool/commissioning-tool-api/
/Users/toby/src/bitbucket.org/limtool/commissioning-tool-api/
exit 0

我理解使用双$来逃避$的使用,但我不明白为什么使用单$realpath& ; dir命令有效,但将id命令用于BIPUSH 10命令。

有人可以帮助我理解吗?

由于

1 个答案:

答案 0 :(得分:2)

realpathdirGNU make个函数,id不是。如果要在Makefile中使用shell函数,请使用$(shell id -u)realpathdir未被转义,GNU make正确解释了它们。

请参阅GNU make file name functions以及GNU make shell function手册页。

当您在Makefile中编写$(id -u)时,make会尝试查看它是函数还是变量,因为它们都不会扩展为任何东西,因此空echo 1}}秒。

现在,当你逃脱美元符号时,你的ID被正确写入的原因是神秘的,可能是由于你的shell。由于make已转义,因此$没有尝试展开它,因此echo $(id -u)已发送到系统。您可以直接在shell中试用它,您应该获得相同的结果。