Как мне проверить версию XFIXES в моем файле configure.ac при компиляции моего драйвера X? - PullRequest
1 голос
/ 24 июня 2011

Я пишу драйвер видеоустройства для X, и ему нужны некоторые функции, предоставляемые расширением XFIXES.Теперь я уверен, что на всех моих целевых версиях X Server будет установлена ​​хотя бы версия 2 XFIXES, но я бы очень хотел проверить это в моем файле 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

Ответы [ 2 ]

1 голос
/ 26 июня 2011

Вы можете использовать AC_CHECK_FUNC, чтобы проверить наличие определенных функций в библиотеке. Вы должны предварительно запустить AC_CHECK_LIB в этой библиотеке, чтобы это работало.

0 голосов
/ 14 июля 2011

Примерно так:

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, поскольку в нем есть несколько новых компонентов (например, name ), когда 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

Теперь заголовок включения должен быть server версия заголовка.Идея заключается в том, что в заголовке сервера, где XFIXES_MAJOR <2 будет <em>, а не , будет этот компонент, и его компиляция завершится неудачно.Если это предположение нарушается, этот подход также не будет работать.

...