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

时间:2014-12-23 13:13:00

标签: gnu-make

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

例如,

externals = $(HOME)/externals

all:
    echo $(externals)

不起作用,因为它使用HOME的当前定义回声。我希望能够回应 文字字符串$(HOME)/externals,不展开$(HOME)

1 个答案:

答案 0 :(得分:2)

value function可能就是你想要的。

  

8.8值Function

     

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

     

值函数的语法是:

    $(value variable)
     

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

     

此函数的结果是包含变量值的字符串,不会发生任何扩展。例如,在这个makefile中:

    FOO = $PATH

    all:
            @echo $(FOO)
            @echo $(value FOO)
     

第一个输出行是ATH,因为“$ P”将扩展为make变量,而第二个输出行将是$ PATH环境变量的当前值,因为值函数避免了扩展。

     

值函数通常与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