config.h.in不用作模板

时间:2018-01-25 06:15:19

标签: autotools configure

我正在尝试向Autotools提供config.h.in4.8.1 Configuration Header Templates的Autoconf手册中介绍了该主题。 config.h.in看起来像这样:

/// \file config.h
/// \brief Library configuration file

#ifndef CRYPTOPP_CONFIG_H
#define CRYPTOPP_CONFIG_H

// define this if running on a big-endian CPU
#undef CRYPTOPP_BIG_ENDIAN

// define this if running on a little-endian CPU
#undef CRYPTOPP_LITTLE_ENDIAN

#endif  // CRYPTOPP_CONFIG_H

我们的configure.ac包含以下测试内容:

AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile] [libcryptopp.pc])
AC_CONFIG_SRCDIR([configure.ac])

AC_PROG_LIBTOOL
LT_INIT

AC_PROG_CXX
AC_LANG([C++])
AC_PROG_GREP

autoreconfconfigure运行后,有一个config.h。问题是,它不遵循模板config.h.in。它看起来像工具生成的新config.h

当我检查config.log时,我只看到一次提及config.h。我找不到有关正在发生的事情的其他信息:

config.status:1172: creating Makefile
config.status:1172: creating libcryptopp.pc
config.status:1172: creating config.h
config.status:1401: executing depfiles commands
config.status:1401: executing libtool commands

问题是什么,我该如何解决?

1 个答案:

答案 0 :(得分:4)

  

autoreconfconfigure运行后,有一个config.h。问题   是的,它不遵循模板config.h.in。它看起来像一个新的   config.h由工具生成。

此时请查看您的config.h.in。我想你会感到惊讶。

问题在于autoreconf为您运行的程序autoheader,其中构建 config.h.in基于它在{{1}中找到的内容(或configure.ac)。您的后续configure.in然后使用新模板,但在配置日志中没有记录任何具体内容,因为此时模板已经存在。

这种行为通常是一种受欢迎的方便,但如果您想提供自己的自定义configure模板,则必须避免在运行config.h时(或autoreconf时更换它)是直接运行)。一种方法是避免运行这些程序。您可以运行其他autotools程序,如果您决定避免使用autoheader,那么编写脚本可能是值得的。

另一方面,Autoconf附带了一些内置的macros to modulate autoheader's behavior。特别是,autoreconfAH_TOP可能对您将自定义内容添加到自动生成的内容非常有用。

第三方面,如果你想提供自己的模板,严格手工编写,并避免AH_BOTTOM弄乱它,那么知道autoheader仅适用于在您的autoheader中命名的第一个标题模板,您可以命名多个。因此,您可能会添加一个您的源未引用的虚拟配置标头,以便configure.ac可以使用它而不会弄乱任何内容:

autoheader

Autotools将为它创建虚拟配置标头和模板,但如果您的源从不引用它,那么这对构建没有影响。