我正在为X编写一个视频设备驱动程序,它需要XFIXES扩展提供的一些功能。现在,我很确定我的X Server的所有目标版本都将至少安装XFIXES的版本2,但我真的想在我的config.ac文件中测试一下,以警告用户,如果他们试图为一个非常旧的服务器版本或(出于某种原因)没有包含XFIXES版本编译我的驱动程序。现在我正在做这个:
# Essentially this is just supposed to check if the server currently supports
# V2 or better of the XFIXES protocol, and to define XFIXES if it does.
AC_CHECK_HEADER(X11/extensions/Xfixes.h,
HAVE_XFIXES="yes";
AC_DEFINE([HAVE_XFIXES],[1],[XFixes Proto Found]),,
[#include <X11/Xlib.h>])
# should have a better test for this
if test "x${HAVE_XFIXES}" = "xyes"; then
AC_DEFINE([XFIXES],[1],[XFixes >= 2.0])
fi
您可以使用AC_CHECK_FUNC
检查库中是否存在特定函数。您必须以前在该库上运行过AC_CHECK_LIB
才能正常工作。
类似这样的东西:
AC_CACHE_CHECK([for Xfixes >= 2.0], [foo_have_xfixes_2],
[AC_LINK_IFELSE([AC_LANG_PROGRAM(
[[#include <X11/Xlib.h>
#include <X11/extensions/Xfixes.h>]],
[[#if !(XFIXES_MAJOR >= 2)
#error XFIXES_LT_2
#endif]])],
[foo_have_xfixes_2=yes], [foo_have_xfixes_2=no])])
if test "x${foo_have_xfixes_2}" = "xyes"; then
AC_DEFINE([XFIXES],[1],[XFixes >= 2.0])
else
AC_MSG_WARN("XFixes >= 2.0 not present")
fi
编辑-我现在有点明白问题了。我们将在此基础上构建初始解决方案。既然我知道我们不能使用XFIXES_MAJOR(或类似的东西),那么就将您关心的结构的结构定义用作测试。对于这个例子,我假设结构是XFixesCursorImage,因为当XFIXES_MAJOR>=2时,它有一些新组件(例如,名称)。希望定义相同结构的有效服务器头也会有这些新组件:
AC_CACHE_CHECK([for Xfixes >= 2.0], [foo_have_xfixes_2],
[AC_LINK_IFELSE([AC_LANG_PROGRAM(
[[#include <???>
XFixesCursorImage bar;]],
[[bar.name = "bar";]])],
[foo_have_xfixes_2=yes], [foo_have_xfixes_2=no])])
if test "x${foo_have_xfixes_2}" = "xyes"; then
AC_DEFINE([XFIXES],[1],[XFixes >= 2.0])
else
AC_MSG_WARN("XFixes >= 2.0 not present")
fi
include标头现在应该是标头的服务器版本。其思想是,XFIXES_MAJOR<2将不具有该组件,并且编译它将失败。如果违反了这个假设,这种方法也不会起作用。