有没有办法检查不需要 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_DIR
和 ACLOCAL_AMFLAGS
.
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_DIR
和 ACLOCAL_AMFLAGS
.