为了正确地工作,有些Autoconf宏要求在调用它们之前调用其它的宏。Autoconf提供了一种方式以确保在需要时, 某个宏已经被调用过了,以及一种在宏可能导致不正确的操作时给出警告的方式。

首要的宏
你编写的宏可能需要使用从前有其它宏计算出来的结果。例如,AC_DECL_YYTEXT要检验flex或 lex的输出,所以它要求首先调用AC_PROG_LEX以设置shell变量LEX。

比强制宏的用户跟踪宏以前的依赖性更好的是,你可以使用宏AC_REQUIRE以自动地完成这一任务。 AC_REQUIRE可以确保只在需要的时候调用宏,并且只被调用一次。

宏: AC_REQUIRE (macro-name)
如果还没有调用m4宏macro-name,就调用它(不带任何参数)。确保macro-name 用方括号引起来了。macro-name必须已经用AC_DEFUN定义了,或者包含一个对AC_PROVIDE 的调用以指明它已经被调用了。

一个替代AC_DEFUN的方法是使用define并且调用AC_PROVIDE。 因为这个技术并不防止出现嵌套的消息,它已经是过时的了。

宏: AC_PROVIDE (this-macro-name)
记录this-macro-name已经被调用了的事实。this-macro-name应该是调用AC_PROVIDE的宏的名字。 一个获取它的简单方式是从m4内置变量$0中获得,就像:

AC_PROVIDE([$0])
建议的顺序
有些宏在都被调用的时候,一个宏就需要在另一个宏之前运行,但是它们并不要求调用另一个宏。例如,应该在任何运行C编译器的宏 之前调用修改了C编译器行为的宏。在文档中给出了许多这样的依赖性。

configure.in'文件中的宏违背了这类依赖性,Autoconf就提供宏AC_BEFORE以警告用户。 警告出现在从configure.in’创建configure的时候,而不是在运行configure的时候。 例如,AC_PROG_CPP检查C编译器是否可以在给出`-E’的情况下运行C预处理器。因而应该在任何 改变将要使用的C编译器的宏之后调用它 。所以AC_PROG_CC包含:

AC_BEFORE([$0], [AC_PROG_CPP])dnl
如果在调用AC_PROG_CC时,已经调用了AC_PROG_CPP,它就警告用户。

宏: AC_BEFORE (this-macro-name, called-macro-name)
如果已经调用了called-macro-name,就让m4在标准错误输出上打印一条警告消息。 this-macro-name应该是调用AC_BEFORE的宏的名字。macro-name必须已经用 AC_DEFUN定义了,或者包含一个对AC_PROVIDE的调用以指明它已经被调用了。

过时的宏
配置和移植技术已经演化了好些年了。对于特定的问题,通常已经提出了更好的解决办法,或者同类的方法(ad-hoc approaches) 已经被系统化了。结果就是有些宏现在已经被认为是过时了;它们仍然能工作,但不再被认为是最佳选择。 Autoconf提供了宏AC_OBSOLETE,当用户使用过时的宏时,就在生成configure脚本的时候 对用户提出警告,以鼓励他们跟上潮流。一个调用实例是:

AC_OBSOLETE([$0], [; use AC_CHECK_HEADERS(unistd.h) instead])dnl

宏: AC_OBSOLETE (this-macro-name [, suggestion])
让m4在标准错误输出上打印一条消息以警告this-macro-name是过时的,并且给出调用 过时的宏的文件名和行号。this-macro-name应该是调用AC_OBSOLETE的宏的名字。 如果给出了suggestion,就在警告消息的末尾打印它;例如,它可以建议用某个宏来代替 this-macro-name。