在编译X驱动程序时,如何在config.ac中测试XFIXES版本



我正在为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将具有该组件,并且编译它将失败。如果违反了这个假设,这种方法也不会起作用。

相关内容

  • 没有找到相关文章

最新更新