如果AC_CHECK_HEADER在autoconf/configure.ac中失败,如何为不同的平台指定不同的反馈?

How to specify different feedback for different platforms if AC_CHECK_HEADER fails in autoconf/configure.ac?

我检查了源根目录 configure.ac 中的 header 文件

AC_CHECK_HEADER(log4c.h,
    [],
    [AC_MSG_ERROR([Couldn't find or include log4c.h])])

我想在不同的平台上提供不同的反馈,以反映提供 header:

的最直接的不同方式

这两个答案都描述了没有 shell 命令的条件宏的用法,用于提到的 OS 和预定义宏的链接(如 AC_CHECK_HEADER_DEBIANAC_CHECK_HEADER_SUSE 等。 ) 表示赞赏。

以下 configure.ac 无效:

AC_INIT([cndrvcups-common], [2.90], [krichter722@aol.de])
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([foreign -Wall subdir-objects]) 
AC_PROG_CC
AM_PROG_AR
AM_PROG_CC_C_O

AC_MSG_NOTICE([Hello, world.])
AC_INCLUDES_DEFAULT
AC_CHECK_HEADER(check.h,
    [],
    [
        AS_IF (test "$(lsb_release -cs)" = "vivid", [echo aaaaaa], [echo bbbbbb])
    ])

LT_INIT # needs to be after AM_PROGS_AR
AC_CONFIG_HEADERS([config.h])

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

因为 ./configure 失败

checking check.h usability... no
checking check.h presence... no
checking for check.h... no
./configure: line 4433: syntax error near unexpected token `;'
./configure: line 4433: `        if ; then :'

还有 ./configure: line 4427: #include: command not found 无论是否指定 AC_CHECK_HEADER 都会发生。

你的 configure.ac 差不多好了。唯一的问题是 AS_IF 和括号之间的 space。在 m4 脚本中,宏名称和左括号之间不允许出现白色 space。这是正确的语法:

AC_CHECK_HEADER(check.h,
    [],
    [
        AS_IF(test "$(lsb_release -cs)" = "vivid", [echo aaaaaa], [echo bbbbbb])
    ])

如果您正在寻找检测不同发行版的方法,请查看 cgmanagerconfigure.ac

更新

我注意到您的 configure.ac 中还有一个问题。

AC_INCLUDES_DEFAULT macro expands to a set of default includes and can't be used here. It is not needed also. It will be used by default in your AC_CHECK_HEADER 宏,因为您省略了最后一个参数。

这就是您提到的 line 4427: #include: command not found 错误的原因。

更新您的评论

首先,运行一个系统命令本身,就像lsb_release一样是不可移植的。您应该首先检查它是否存在,例如 AC_CHECK_PROG

关于语法,我首先使用反引号获取命令的输出:result=`lsb_release -cs`,然后测试结果输出:test "x$result" = "xvivid"。需要 x 以避免某些 shell 中的空值问题。

最后,我怀疑配置脚本是否是所有这些特定于发行版的消息的合适位置。您可以考虑将其放在 README 文件中。

避免那些系统特定的消息。

打印一条消息,让人们了解要在各自系统上安装什么包,但要避免命名系统特定的包名称和系统特定的安装工具。

您永远无法为所有系统添加消息,因此最好只完成您知道的部分,让您的用户完成剩下的部分,因为他们比您更了解他们的系统.

正确的方法是在外部编写一个软件包,但从您的 configure 调用,给定头文件名、foo.pc 文件名、库名等,找出如何安装它在各自的系统上。然后让系统特定的维护者修复该包,如果安装了它,则从 configure 调用它,否则发出一般错误消息。

您的软件包本地的可移植 shell 脚本可能在某种程度上完成相同的工作。不过,您仍然必须为所有可能的系统维护所有系统特定部分。

嗯...现在我正在考虑这个问题,这个想法似乎没有那么糟糕。我可能会将这样的脚本添加到我维护的一些项目中,看看它在实际使用中的结果如何。

不过,我仍然会尝试将大部分逻辑保留在 configure 之外。