我正在尝试向Autotools提供config.h.in
。 4.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
在autoreconf
和configure
运行后,有一个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
问题是什么,我该如何解决?
答案 0 :(得分:4)
在
autoreconf
和configure
运行后,有一个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。特别是,autoreconf
和AH_TOP
可能对您将自定义内容添加到自动生成的内容非常有用。
第三方面,如果你想提供自己的模板,严格手工编写,并避免AH_BOTTOM
弄乱它,那么知道autoheader
仅适用于在您的autoheader
中命名的第一个标题模板,您可以命名多个。因此,您可能会添加一个您的源未引用的虚拟配置标头,以便configure.ac
可以使用它而不会弄乱任何内容:
autoheader
Autotools将为它创建虚拟配置标头和模板,但如果您的源从不引用它,那么这对构建没有影响。