Autoconf:dnl与#的区别

49

Autoconfig手册中指出,注释行可以以dnl#开头。

它们之间有什么区别吗?在任何情况下使用其中之一有任何理由吗?还是纯粹是个人口味的问题?

3个回答

64
在configure.ac中,以'#'注释的行会出现在生成的configure脚本中,而以dnl开头的注释则不会。dnl的一个作用是丢弃不需要的换行符,以使configure脚本更易读。此外,在记录m4宏时,适当使用dnl注释;这些注释在configure脚本中没有意义,因为m4宏不会出现在那里,只有它的展开形式。
在Makefile.am中的注释则有所不同。Makefile.am不会被m4处理,而是由automake处理,其惯例是丢弃以空格为前导的##开头的行。(尽管###注释可传递到Makefile.in) 由于Makefile.am不由m4处理,因此'dnl'不会引入注释。

65
DNL是“Discard to Next Line”的缩写,如果你和我一样想必须知道这个意思。 - JeffCharter
6
我们这些不善于缩写的人向你致敬! - Mike Finch
1
@JeffCharter 我谷歌搜索了一下,找到了这个问题,并点赞了你的评论,因为这正是我想知道的! - Geno Chen
手册 https://www.gnu.org/software/m4/manual/m4-1.4.18/html_node/Dnl.html - Darren Ng
https://www.gnu.org/software/m4/manual/html_node/Dnl.html(由于上一个链接失效,文档现在不再是特定版本,更新为最新的链接) - chickity china chinese chicken

16

dnl 是 m4 宏语言中的一种宏,它会忽略同一行(包括换行符)后面的所有输入内容。在 m4 中,# 没有任何意义,因此它出现在目标文件(例如 Makefile)中时起到了注释的作用。

因此,关键区别���于 dnl 在原始源代码中是注释,而在生成的文件中 # 成为了注释。


嗯...经过一些测试,我觉得不完全正确。1)我指的是configure.in(以及它的目标configure)。2)configure.in中的'#'注释不会出现在configure中。3)Makefile.am中的'#'注释出现在Makefile中。4)Makefile.am中的'dnl'行出现在Makefile中。5)另一方面,Makefile.am中的'##'注释不会出现在Makefile中。 - DevSolar
7
这是一个很好的例子,说明为什么“configure.in”这个名称已经被弃用,取而代之的是“configure.ac”。autoconf对待configure.ac与典型的*.in输入文件不同。configure.ac由m4解析,但Makefile.am不是,configure使用的输入文件也不是生成目标的。因此,在configure.ac中或在aclocal.m4、acinclude.m4或其他地方定义的m4宏中,dnl只是一个注释。 - William Pursell

0
如其他人所指出的:在configure.ac中,对于所有“注释”,请使用{{link1:dnl}},而对于您打算放入生成的configure脚本中的所有内容,请使用#。 这里有一件重要的事情:dnl防止所有解析(唯一的例外是dnl(,可以在以下示例中看到:
# CHECKME: possibly drop AM_PROG_AR + build_aux/ar-lib
AM_PROG_AR
LT_INIT([dlopen win32-dll])

通过 autoconf 处理导致

可能未定义的宏:AM_PROG_AR 如果这个标记和其他标记是合法的,请使用 m4_pattern_allow。 请参阅 Autoconf 文档。

但是

dnl CHECKME: possibly drop AM_PROG_AR + build_aux/ar-lib
AM_PROG_AR
LT_INIT([dlopen win32-dll])

运行正常...
教训:在 # 之后永远不要使用宏(在任何情况下都不会对最终配置脚本的用户有意义),并且在 configure.ac 中 大多数情况下 使用 dnl。 还请参见 m4输入中的注释


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接