如果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:
的最直接的不同方式
- 在 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? 中所述)
- 在 Whosebug 中找到 运行
esyscmd
的提示。com/questions/4627900/m4-executing-a-shell-command,但是当我 运行 autoreconf --install --verbose --force
.
这两个答案都描述了没有 shell 命令的条件宏的用法,用于提到的 OS 和预定义宏的链接(如 AC_CHECK_HEADER_DEBIAN
、AC_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])
])
如果您正在寻找检测不同发行版的方法,请查看 cgmanager
的 configure.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
之外。
我检查了源根目录 configure.ac
中的 header 文件
AC_CHECK_HEADER(log4c.h,
[],
[AC_MSG_ERROR([Couldn't find or include log4c.h])])
我想在不同的平台上提供不同的反馈,以反映提供 header:
的最直接的不同方式- 在 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? 中所述) - 在 Whosebug 中找到 运行
esyscmd
的提示。com/questions/4627900/m4-executing-a-shell-command,但是当我 运行autoreconf --install --verbose --force
.
这两个答案都描述了没有 shell 命令的条件宏的用法,用于提到的 OS 和预定义宏的链接(如 AC_CHECK_HEADER_DEBIAN
、AC_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])
])
如果您正在寻找检测不同发行版的方法,请查看 cgmanager
的 configure.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
之外。