自动工具:$ VAR,$(VAR)和$ {VAR}和$ {CC-cc}与$ {CC}的差异

时间:2019-01-22 15:34:11

标签: autotools

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

我相信$(VAR)和$ {VAR}是相同的东西,这实际上取决于首选项。但是$ VAR与$(VAR)/ $ {VAR}的关系如何,是否使用方括号有什么区别?

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

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

1 个答案:

答案 0 :(得分:2)

  

我看到同时使用了$ CFLAGS和$ {CFLAGS},configure.ac使用了   $ CFLAGS和acinclude.m4使用$ {CFLAGS}。这样就可以访问变量   不同的是:$ VAR,$(VAR)和/或$ {VAR}。

是,不是。

configure.acacinclude.m4和其他用于构建configure脚本的M4源包含外壳程序代码和Autoconf宏的混合,并散布了一些M4语法。 Shell和M4都使用$字符来引入变量引用,但是您所看到的可能主要是Shell变量引用。对于外壳,$VAR作为完整的语法单元意味着与${VAR}相同;都执行“ parameter expansion”。括号对于从变量名(例如,${VAR}foo)的上下文中突出来很有用,以表明变量名是VAR,而不是VARfoo。另外,使用某些特殊的参数扩展功能时,需要使用花括号。

  

我相信$ {VAR)和$ {VAR}是相同的东西,这确实   取决于偏好。但是$ VAR与$(VAR)/ $ {VAR}的关系如何?   是否使用括号之间的区别?

这取决于上下文。 $(VAR)的含义与shell完全不同,${VAR}的含义是:它扩展到通过运行(文字)命令VAR获得的输出(如果有)。您不会在Autoconf代码中看到它与${VAR}互换使用。但是您可能会在Makefile和Automake Makefile.am文件中看到它。这是因为make比外壳程序使用different variable expansion rules。对此,$(VAR)${VAR}的意思是相同的-它们扩展为变量VAR的值-但是$VAR的含义完全不同(可能是错误)。带有括号的形式更传统,但现​​在也广泛使用带有花括号的形式。

  

还有这段代码:$ {CC-cc},当我显示以下内容时   变量,我得到“ gcc”。如果我拿出“ -cc”并只显示   $ {CC}的内容,我仍然得到“ gcc”。

     

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

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