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

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

我想在不同的平台上给出不同的反馈,以反映提供标题的不同最直接的方式:
在Debian上,它应该会错误地显示消息Couldn't find or include log4c.h. Install log4c using 'sudo apt-get install liblog4c-dev'
在opensuse上,它应该会出现... Install log4c using 'sudo yum install log4c-devel'错误(没有研究包名,但是你明白我的意思)
在其他系统上(我懒得研究包名),应该会出现... Install log4c by fetching ftp://.../log4c.tar.gz and installing with './configure && make && make install' in the source root

检查了AM_CONDITIONAL宏,但我不知道如何在configure.ac中而不是在Makefile.am中使用它(如autoconf/automake: conditional compilation based on presence of library?中所述)
在stackoverflow.com/questions/4627900/m4-executing-a-shell-command中找到了运行esyscmd的提示,但是在运行esyscmd (/bin/echo abc)时将configure.ac添加到autoreconf --install --verbose --force不会打印任何内容。
这两个答案描述了条件宏的使用,没有提到的操作系统的shell命令和链接到预定义的宏(如AC_CHECK_HEADER_DEBIANAC_CHECK_HEADER_SUSE,等等)是赞赏的。
以下configure.ac不起作用:
AC_INIT([cndrvcups-common], [2.90], [[email protected]])
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和括号之间的空格。在m4脚本中,宏名和左括号之间不允许有空格。这是正确的语法:

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

如果您正在寻找检测不同发行版的方法,请查看configure.accgmanager
更新
我注意到你的configure.ac中还有一个问题。
AC_INCLUDES_DEFAULT宏扩展为一组默认的includes,不能在这里使用。也不需要。默认情况下,它将在AC_CHECK_HEADER宏中使用,因为您省略了最后一个参数。
这就是您提到的line 4427: #include: command not found错误的原因。
更新您的评论
首先,运行系统命令本身,比如lsb_release是不可移植的。您应该首先检查是否存在,例如使用AC_CHECK_PROG
关于语法,我将首先使用反勾号获得命令的输出:result=`lsb_release -cs`,然后测试结果输出:test "x$result" = "xvivid"。需要x以避免某些shell中出现空值问题。
最后,我怀疑configure脚本是否适合所有这些特定于发行版的消息。你可以考虑把它放到自述文件中。

关于linux - 如果AC_CHECK_HEADER在autoconf/configure.ac中失败,如何为不同的平台指定不同的反馈?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30080236/

10-15 10:15