1

我检查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? 中所述)
  • esyscmd在 stackoverflow.com/questions/4627900/m4-executing-a-shell-command 中找到了要运行的提示,但是当我运行时添加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指定,都会发生这种情况。

4

2 回答 2

2

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

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

如果您正在寻找一种检测不同发行版的方法,请查看configure.ac of cgmanager

更新

我注意到您的configure.ac.

AC_INCLUDES_DEFAULT宏扩展为一组默认包含,不能在此处使用。它也不需要。默认情况下,它将在您的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 文件中。

于 2015-05-06T17:02:38.833 回答
0

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

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

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

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

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

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

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

于 2017-09-12T19:02:32.323 回答