1

我正在为 X 编写一个视频设备驱动程序,它需要 XFIXES 扩展提供的一些功能。现在,我很确定我所有的 X 服务器目标版本都至少安装了 XFIXES 版本 2,但我真的很想在我的 configure.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
4

2 回答 2

1

您可以使用它AC_CHECK_FUNC来检查库中是否存在特定函数。您必须以前AC_CHECK_LIB在该库上运行过才能使其正常工作。

于 2011-06-26T08:16:06.240 回答
0

像这样的东西:

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 时它有一些新组件(例如, name )。希望定义相同结构的有效服务器标头也将具有这些新组件:

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

包含标头现在应该是标头的服务器版本。这个想法是 XFIXES_MAJOR < 2 的服务器标头将没有该组件并且编译它将失败。如果违反该假设,则此方法也将不起作用。

于 2011-07-14T05:02:19.520 回答