有没有办法检查不需要 autoconf-archive 包的编译标志?

Is there a way to check for compile flags that doesn't require the autoconf-archive package?

AX_CHECK_COMPILE_FLAG 宏在 autoconf-archive 包中的大多数发行版中可用,但不幸的是,当缺少该包时,无法理解错误:

./configure: 5358: Syntax error: word unexpected (expecting ")")

这是导致错误的 configure.ac 行:

AX_CHECK_COMPILE_FLAG(-fcx-fortran-rules, CFLAGS="$CFLAGS -fcx-fortran-rules")

有没有一种方法可以在不使用 AX_ 检查的情况下检查编译标志是否有效?

我是否应该将此 AX_ 支票复制并粘贴到我的 configure.ac 中?这似乎有点 hack,但它会起作用...有更好的东西吗?

首先,当使用 autoconf 或 automake 没有附带的任何宏时,谨慎的做法是向 configure.ac 添加一行,这将检查生成的 configure 文件不包含宏的名称(仅是它的扩展,不应包含宏名称):

m4_pattern_forbid([AX_CHECK_COMPILE_FLAG])dnl

这将使 autoreconf 失败并产生一个半途而废的错误消息,而不是在无法找到 AX_CHECK_COMPILE_FLAG 宏定义时从 configure.ac 静默生成无效的 configure .

然后您可以将包含 AX_CHECK_COMPILE_FLAG 定义的 *.m4 文件复制到项目的源代码树中(例如,复制到 m4/ 子目录中),然后在顶部添加一行 -级别 Makefile.am 告诉 aclocal 在哪里寻找宏定义:

ACLOCAL_AMFLAGS = -I m4

除此之外,您需要将 m4/whatever-the-name-is.m4 文件添加到某些 Makefile.am 或 Makefile 包含文件中的 EXTRA_DIST,以便 运行 autoreconf 在解压缩的 dist tarball 上。

我个人更喜欢在configure.ac中使用AC_CONFIG_MACRO_DIR([auto-m4]),在顶层Makefile.am中使用ACLOCAL_AMFLAGS = -I auto-m4 -I project-m4,将不同来源的*.m4个文件分隔成不同的我的源代码树中的目录(auto-m4/ 用于在 autoreconf 运行 期间复制到那里的 *.m4 文件,project-m4/ 用于我拥有的 *.m4 文件我自己为这个项目写的。

请注意,虽然存在 AC_CONFIG_MACRO_DIRS([...]) 以帮助处理多个 m4 宏目录并避免了上述 ACLOCAL_AMFLAG 行的必要性,但 AC_CONFIG_MACRO_DIRS 仅适用于 autoconf 和 automake。一旦您的构建系统也使用 libtool/libtoolize 或 gettext/gettextize/autopoint,它们将在遇到 AC_CONFIG_MACRO_DIRS 时失败。所以留在 AC_CONFIG_MACRO_DIRACLOCAL_AMFLAGS.