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

时间:2015-05-06 14:50:19

标签: linux autotools autoconf m4

我检查了源根目录

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], [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

2 个答案:

答案 0 :(得分:2)

你的configure.ac几乎可以。唯一的问题是AS_IF和括号之间的空格。宏名称和m4脚本中的左括号之间不允许有空格。这是正确的语法:

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

如果您正在寻找一种方法来检测不同的发行版,请查看cgmanager configure.ac的{​​{3}}。

<强>更新

我注意到line 4427: #include: command not found还有一个问题。

configure.ac宏扩展为一组默认包含,无法在此处使用。它也不需要。它将默认用在AC_INCLUDES_DEFAULT宏中,因为您省略了最后一个参数。

这是您提及lsb_release错误的原因。

更新您的评论

首先,运行系统命令本身,如AC_CHECK_PROG是不可移植的。您应首先检查,例如result=`lsb_release -cs`,以确定其存在。

关于语法,我首先使用反引号获取命令的输出:test "x$result" = "xvivid",然后测试结果输出:x。需要>>> hex(ord('\t')) '0x9' 来避免某些shell中的空值问题。

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

答案 1 :(得分:0)

避免使用这些特定于系统的消息。

打印一条消息,允许人们确定要在各自系统上安装的软件包,但避免命名系统特定的软件包名称和系统特定的安装工具。

您将永远无法为所有系统添加消息,因此最好采用您所知道的方式,并让您的用户完全放弃,因为他们比您更了解他们的系统。< / p>

正确的方法是在外面编写一个软件包,但是从你的configure调用,给定一个头文件名,foo.pc文件名,库名等,并指出如何安装它。各自的系统。然后让特定于系统的维护人员修复该程序包,如果已安装,则从configure调用它,否则发出一般错误消息。

软件包本地的可移植shell脚本可能在某种程度上执行相同的工作。但是,您仍然需要维护所有可能系统的所有系统特定部件。

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

尽管如此,我仍会尝试将大部分逻辑保留在configure之外。