如何在Autoconf

时间:2019-05-17 20:32:20

标签: autotools autoconf

Autoconf允许AC_CONFIG_HEADERS中的多个配置文件。来自Autoconf manual

  

-宏:AC_CONFIG_HEADERS(标头...,[cmds],[init-cmds])

     

此宏是实例化宏之一;见配置   动作。使AC_OUTPUT在目录中创建文件   包含C预处理程序的空白或换行符分隔的列表头   #define语句,并将生成文件中的“ @ DEFS @”替换为-DHAVE_CONFIG_H而不是DEFS的值。标头的常用名称是config.h。

     

...

我们使用两个配置头。第一个称为config_asm.h,包括ISA可用性的定义,如SSE2,SSSE3,SSE4.1,AES,CLMUL,SHA等。第二个称为config_cxx.h,包括定义C ++功能,例如原子,alignof,alignas,同步等。用户包括顶层config.h,其中包括从属配置文件,例如config_asm.hconfig_cxx.h

我需要根据正在运行的测试在配置文件之间切换。该手册没有讨论如何使用多个配置文件,也没有提供使用多个配置文件的示例。

使用Autoconf时如何在配置文件之间切换?


这是我到目前为止所拥有的。我相信我需要更改为AC_CONFIG_HEADERS([config_asm.h config_cxx.h])之类的东西。但是我不清楚如何告诉Autoconf将结果写入特定的配置文件。

AC_INIT([Crypto++], [8.3], [http://cryptopp.com/bugs], [cryptopp], [http://cryptopp.com/])
AM_INIT_AUTOMAKE

AC_PROG_CXX
AC_LANG([C++])

AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_HEADERS([config_asm.h])
AC_CONFIG_FILES([Makefile] [libray.pc])
AC_CONFIG_SRCDIR([configure.ac])

当我告诉Autoconf时,还有另一个配置文件会导致错误。我怀疑我缺少简单的东西,但是由于手册中没有讨论,所以我不确定它是什么。

AC_CONFIG_HEADERS([config_asm.h config_cxx.h])导致:

autoreconf -f -i
...

configure.ac:105: installing './compile'
configure.ac:95: installing './missing'
configure.ac:101: error: required file 'config_cxx.h.in' not found
Makefile.am: installing './depcomp'

1 个答案:

答案 0 :(得分:1)

需要花点时间阅读一下,才能理解Autoconf文档告诉您的所有内容,并且需要对Autoconf进行广泛的了解,才能认识到文档中还有其他要说的地方。特别是

  

使AC_OUTPUT在用空格或换行符分隔的列表header中创建文件

取决于您的理解,AC_OUTPUT生成标头所做的工作非常类似于生成通过AC_CONFIG_FILES指定的文件所做的工作:它是从模板生成文件的。对于标头,它期望使用不同形式的模板,并根据不同的符号定义集(来自AC_DEFINE的符号定义(与来自AC_SUBST的符号定义相反)填充模板,但仍然只是模板处理。稍后在AC_CONFIG_HEADERS描述中,还有一个关于此的提示

  

通常,输入文件名为header.in;但是,您可以覆盖输入文件名[...]

重要的是,生成的configure或生成的config.status均未写入或修改模板。那么,基本的答案是您可以通过控制模板来控制每个符号定义在哪个或哪些标题中

当然,这就是窍门。在一个典型的单配置头项目中,通常需要在autoheader的控制下运行autoreconf来(重新)生成配置头模板,这是正常的。并且您仍然可以这样做,但是autoheader始终将其输出 all 发出到AC_CONFIG_HEADERS调用中定义的第一个标头中。 (它甚至没有为任何其他标头创建空模板,这就是为什么您收到有关找不到config_cxx.h.in的错误的原因。)

如果不能仅使用一个标头,则必须维护所有标头模板,而只能维护一个(半)。由于autoreconf会导致第一个标头被更新,因此我建议,如果必须要有两个标头都没有包含所有定义的标头,则选择“以上都不是”作为第一个标头。而是定义另一个标头,该标头在实践中不使用,但首先列出。从自动管理的部分中为两个实际的配置头构建模板。

理想情况下,您将自动将主模板拆分为实际所需的两个模板。如果可以编写脚本,则可以通过configure启动脚本,使脚本在AC_CONFIG_COMMANDS_PRE生效时自动运行,以产生适当的效果。可能看起来像这样:

AC_CONFIG_COMMANDS_PRE([pushd "$srcdir" && { ./generate_header_templates; popd; }])

但是,在运行autoreconf时,仍然需要至少每个空白模板文件的空白版本。

从正面看,这还意味着您不必为每个符号选择一个标题。如果两个标题中都包含任何内容,则只需要适当地编写两个模板即可。