gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:58 24 4
gpt4 key购买 nike

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

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

我想在不同的平台上提供不同的反馈,以反射(reflect)提供 header 的最直接的不同方式:

  • 在 Debian 上它应该出错并显示消息 Couldn't find or include log4c.h。使用“sudo apt-get install liblog4c-dev”安装 log4c
  • 在 OpenSUSE 上它应该错误 ... 使用“sudo yum install log4c-devel”安装 log4c(没有研究包名,但你明白我的意思)
  • 在其他系统上(我懒得研究包名)它应该错误 ... 通过获取 ftp://.../log4c.tar.gz 安装 log4c 并使用 ' ./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 都会发生。

最佳答案

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com