首页 > 解决方案 > Autotools:$VAR、$(VAR) 和 ${VAR} 和 ${CC-cc} 与 ${CC} 的区别

问题描述

我看到 $CFLAGS 和 ${CFLAGS} 都在使用,configure.ac 使用 $CFLAGS,acinclude.m4 使用 ${CFLAGS}。因此变量的访问方式不同:$VAR、$(VAR) 和/或 ${VAR}。

我相信 $(VAR) 和 ${VAR} 是相同的东西,这真的取决于偏好。但是 $VAR 与 $(VAR)/${VAR} 相比,使用括号有什么区别?

同样使用这段代码:${CC-cc},当我显示变量的内容时,我得到“gcc”。如果我取出“-cc”并只显示 ${CC} 的内容,我仍然会得到“gcc”。

那么连字符在这里实际上做了什么?

标签: autotools

解决方案


我看到 $CFLAGS 和 ${CFLAGS} 都在使用,configure.ac 使用 $CFLAGS,acinclude.m4 使用 ${CFLAGS}。因此变量的访问方式不同:$VAR、$(VAR) 和/或 ${VAR}。

是和不是。

configure.ac, acinclude.m4, 和其他用于构建configure脚本的 M4 源包含 shell 代码和 Autoconf 宏的混合,其中包含一些 M4 语法。shell 和 M4 都使用该$字符来引入变量引用,但你是什么看到的可能主要是shell变量引用。对于 shell,$VAR作为一个完整的句法单元,与 ; 的含义相同${VAR}。两者都执行“参数扩展”。大括号可用于从其上下文中设置变量名称,例如 in ${VAR}foo,以指示变量名称是VAR,而不是VARfoo。此外,当使用某些特殊的参数扩展功能时,需要使用大括号。

我相信 $(VAR) 和 ${VAR} 是相同的东西,这真的取决于偏好。但是 $VAR 与 $(VAR)/${VAR} 相比,使用括号有什么区别?

这取决于上下文。 $(VAR)意味着与 shell 完全不同的东西${VAR}:它扩展为通过运行 (literal) command 获得的输出(如果有)VAR。您不会${VAR}在 Autoconf 代码中看到它与它互换使用。但您可能会在Makefiles 和 AutomakeMakefile.am文件中看到它。这是因为make使用与 shell不同的变量扩展规则。对它来说,$(VAR)并且${VAR}确实意味着同样的事情——它们扩展到变量的值VAR——但$VAR意味着完全不同的东西(并且可能是一个错误)。带括号的形式更为传统,但带花括号的形式现在也被广泛使用。

同样使用这段代码:${CC-cc},当我显示变量的内容时,我得到“gcc”。如果我取出“-cc”并只显示 ${CC} 的内容,我仍然会得到“gcc”。

那么连字符在这里实际上做了什么?

这是shell参数扩展语法的特殊功能之一(因此它适用于Autoconf代码,但不适用于Automake代码):${CC-cc}扩展为变量的值,与设置CC相同${CC},但如果未设置则扩展为文字文本。CCCC${CC-cc}cc


推荐阅读