Gnu make 在gnu make中打印未展开的递归变量

Gnu make 在gnu make中打印未展开的递归变量,gnu-make,Gnu Make,有没有办法打印递归变量的未展开定义?我有一个复杂的构建系统,用户可以设置一些值。我想将用户定义回显到另一个文件中,供以后使用 比如说, externals = $(HOME)/externals all: echo $(externals) 不起作用,因为它与当前的“家”定义相呼应。我想让它回音 文本字符串$(HOME)/externals不展开$(HOME)可能就是您在这里想要的 8.8价值函数 value函数为您提供了一种使用变量值的方法,而无需对其进行扩展。请注意,这不会撤消已

有没有办法打印递归变量的未展开定义?我有一个复杂的构建系统,用户可以设置一些值。我想将用户定义回显到另一个文件中,供以后使用

比如说,

externals = $(HOME)/externals

all:
    echo $(externals)
不起作用,因为它与当前的“家”定义相呼应。我想让它回音 文本字符串
$(HOME)/externals
不展开
$(HOME)

可能就是您在这里想要的

8.8价值函数

value函数为您提供了一种使用变量值的方法,而无需对其进行扩展。请注意,这不会撤消已经发生的扩展;例如,如果创建一个简单展开的变量,其值将在定义过程中展开;在这种情况下,value函数将返回与直接使用变量相同的结果

value函数的语法为:

    $(value variable)
请注意,variable是变量的名称,而不是对该变量的引用。因此,在编写时通常不会使用“$”或括号。(但是,如果希望名称不是常量,可以在名称中使用变量引用。)

此函数的结果是一个包含变量值的字符串,不进行任何扩展。例如,在此生成文件中:

    FOO = $PATH

    all:
            @echo $(FOO)
            @echo $(value FOO)
第一个输出行是ATH,因为“$p”将作为make变量展开,而第二个输出行是$PATH环境变量的当前值,因为value函数避免了展开

值函数通常与eval函数一起使用(参见eval函数)

尽管除此之外,您还需要在
echo
行上使用单引号,否则shell将在您身上展开内容

$ cat Makefile
externals = $(HOME)/externals

all:
        echo $(externals)

allv:
        echo $(value externals)

allvq:
        echo '$(value externals)'
$ make all
echo /home/user/externals
/home/user/externals
$ make allv
echo $(HOME)/externals
/bin/sh: HOME: command not found
/externals
$ make allvq
echo '$(HOME)/externals'
$(HOME)/externals

谢谢这看起来正是我想要的。不幸的是,我使用的是一个非常旧的版本(版本3.79.1),而且似乎不受支持;我想是在3.80里加的。我想我需要升级。。。