我看到同时使用$ CFLAGS和$ {CFLAGS},configure.ac使用$ CFLAGS,而acinclude.m4使用$ {CFLAGS}。因此,变量的访问方式不同:$ VAR,$(VAR)和/或$ {VAR}。
我相信$(VAR)和$ {VAR}是相同的东西,这实际上取决于首选项。但是$ VAR与$(VAR)/ $ {VAR}的关系如何,是否使用方括号有什么区别?
还有这段代码:$ {CC-cc},当我显示变量的内容时,我得到“ gcc”。如果我取出“ -cc”并仅显示$ {CC}的内容,我仍然会得到“ gcc”。
那么连字符实际上在做什么?
答案 0 :(得分:2)
我看到同时使用了$ CFLAGS和$ {CFLAGS},configure.ac使用了 $ CFLAGS和acinclude.m4使用$ {CFLAGS}。这样就可以访问变量 不同的是:$ VAR,$(VAR)和/或$ {VAR}。
是,不是。
configure.ac
,acinclude.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>