gpt4 book ai didi

autotools - 如何切换到 Autoconf 中的下一个配置头

转载 作者:行者123 更新时间:2023-12-03 23:12:10 24 4
gpt4 key购买 nike

Autoconf 允许在 AC_CONFIG_HEADERS 中使用多个配置文件.来自 Autoconf manual :

— Macro: AC_CONFIG_HEADERS (header ..., [cmds], [init-cmds])

This macro is one of the instantiating macros; see Configuration Actions. Make AC_OUTPUT create the file(s) in the blank-or-newline-separated list header containing C preprocessor #define statements, and replace ‘@DEFS@’ in generated files with -DHAVE_CONFIG_H instead of the value of DEFS. The usual name for header is config.h.

...



我们使用两个配置 header 。第一个叫做 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'

最佳答案

要理解 Autoconf 文档告诉您的所有内容,需要稍微阅读字里行间的内容,并且需要对 Autoconf 有广泛的了解才能识别文档还有哪些相关内容要说。特别是,

Make AC_OUTPUT create the file(s) in the blank-or-newline-separated list header



取决于你明白什么 AC_OUTPUT生成头文件的作用非常类似于生成通过 AC_CONFIG_FILES 指定的文件的作用。 :它从模板生成它们。在标题的情况下,它需要不同形式的模板,并根据一组不同的符号定义(来自 AC_DEFINE 的符号定义,而不是来自 AC_SUBST 的符号定义)填充它,但它仍然只是模板处理。稍后在 AC_CONFIG_HEADERS 中还有一条关于此的额外线索。描述,它说的地方

Usually the input file is named header.in; however, you can override the input file name [...]



重要的是,生成的 configure 都没有也不是其生成的 config.status编写或修改模板。那么,基本的答案是 您可以通过控制模板来控制每个符号定义在哪个或多个标题中 .

当然,这就是诀窍。在典型的 one-config-header 项目中,通过运行 autoheader 来(重新)生成需要的配置头模板是正常的。 ,通常由 autoreconf 控制.你仍然可以这样做,但是 autoheader总是将其所有输出发送到 AC_CONFIG_HEADERS 中定义的第一个 header 。称呼。 (它甚至不会为任何其他标题创建空模板,这就是为什么您会收到关于 config_cxx.h.in 未找到的错误。)

如果您不能只使用一个标题,那么您必须维护所有标题模板,但一个(半)手动。自 autoreconf将导致第一个被更新,我建议如果有两个标题都没有包含所有定义,那么选择“以上都不是”作为第一个标题。而是定义另一个在实践中未使用但首先列出的 header 。从自动管理的部分构建两个真实配置头的模板。

理想情况下,您可以自动执行将主模板拆分为您实际需要的两个模板的过程。如果您可以编写脚本,那么您可以在 configure 时使脚本自动运行。通过 AC_CONFIG_COMMANDS_PRE 启动脚本,及时产生适当的效果。 .这可能看起来像这样:
AC_CONFIG_COMMANDS_PRE([pushd "$srcdir" && { ./generate_header_templates; popd; }])

当您运行 autoreconf 时,您仍然需要至少存在每个想要的模板文件的空版本。 , 尽管。

从好的方面来说,这也意味着您不必为每个符号只选择一个标题。如果您希望在两个标题中都有任何内容,那么您只需要适本地编写两个模板即可。

关于autotools - 如何切换到 Autoconf 中的下一个配置头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56193203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com