有没有办法打印递归变量的未展开定义?我有一个复杂的构建系统,用户可以设置一些值。我想将用户定义回显给另一个文件,供以后使用。
例如,
externals = $(HOME)/externals
all:
echo $(externals)
不起作用,因为它使用HOME的当前定义回声。我希望能够回应
文字字符串$(HOME)/externals
,不展开$(HOME)
。
答案 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