#  Copyright 2005 Adam Jackson.
#
#  Permission is hereby granted, free of charge, to any person obtaining a
#  copy of this software and associated documentation files (the "Software"),
#  to deal in the Software without restriction, including without limitation
#  on the rights to use, copy, modify, merge, publish, distribute, sub
#  license, and/or sell copies of the Software, and to permit persons to whom
#  the Software is furnished to do so, subject to the following conditions:
#
#  The above copyright notice and this permission notice (including the next
#  paragraph) shall be included in all copies or substantial portions of the
#  Software.
#
#  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#  FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
#  ADAM JACKSON BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
#  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
#  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

AC_PREREQ([2.63])
AC_INIT([libdrm],
        [2.4.70],
        [https://bugs.freedesktop.org/enter_bug.cgi?product=DRI],
        [libdrm])

AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([Makefile.am])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_AUX_DIR([build-aux])

# Require xorg-macros minimum of 1.12 for XORG_WITH_XSLTPROC
m4_ifndef([XORG_MACROS_VERSION],
          [m4_fatal([must install xorg-macros 1.12 or later before running autoconf/autogen])])
XORG_MACROS_VERSION(1.12)
XORG_WITH_XSLTPROC
XORG_MANPAGE_SECTIONS

AM_INIT_AUTOMAKE([1.10 foreign dist-bzip2])

# Enable quiet compiles on automake 1.11.
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])

# Check for programs
AC_PROG_CC
AC_PROG_CC_C99

if test "x$ac_cv_prog_cc_c99" = xno; then
	AC_MSG_ERROR([Building libdrm requires C99 enabled compiler])
fi

AC_USE_SYSTEM_EXTENSIONS
AC_SYS_LARGEFILE
AC_FUNC_ALLOCA

AC_HEADER_MAJOR
AC_CHECK_HEADERS([sys/sysctl.h sys/select.h])

# Initialize libtool
LT_PREREQ([2.2])
LT_INIT([disable-static])


PKG_CHECK_MODULES(PTHREADSTUBS, pthread-stubs)
AC_SUBST(PTHREADSTUBS_CFLAGS)
AC_SUBST(PTHREADSTUBS_LIBS)

pkgconfigdir=${libdir}/pkgconfig
AC_SUBST(pkgconfigdir)
AC_ARG_ENABLE([udev],
              [AS_HELP_STRING([--enable-udev],
                              [Enable support for using udev instead of mknod (default: disabled)])],
              [UDEV=$enableval], [UDEV=no])

AC_ARG_ENABLE(libkms,
	      AS_HELP_STRING([--disable-libkms],
	      [Disable KMS mm abstraction library (default: auto, enabled on supported platforms)]),
	      [LIBKMS=$enableval], [LIBKMS=auto])

AC_ARG_ENABLE(intel,
	      AS_HELP_STRING([--disable-intel],
	      [Enable support for intel's KMS API (default: auto, enabled on x86)]),
	      [INTEL=$enableval], [INTEL=auto])

AC_ARG_ENABLE(radeon,
	      AS_HELP_STRING([--disable-radeon],
	      [Enable support for radeon's KMS API (default: auto)]),
	      [RADEON=$enableval], [RADEON=auto])

AC_ARG_ENABLE(amdgpu,
	      AS_HELP_STRING([--disable-amdgpu],
	      [Enable support for amdgpu's KMS API (default: auto)]),
	      [AMDGPU=$enableval], [AMDGPU=auto])

AC_ARG_ENABLE(nouveau,
	      AS_HELP_STRING([--disable-nouveau],
	      [Enable support for nouveau's KMS API (default: auto)]),
	      [NOUVEAU=$enableval], [NOUVEAU=auto])

AC_ARG_ENABLE(vmwgfx,
	      AS_HELP_STRING([--disable-vmwgfx],
	      [Enable support for vmwgfx's KMS API (default: yes)]),
	      [VMWGFX=$enableval], [VMWGFX=yes])

AC_ARG_ENABLE(omap-experimental-api,
	      AS_HELP_STRING([--enable-omap-experimental-api],
	      [Enable support for OMAP's experimental API (default: disabled)]),
	      [OMAP=$enableval], [OMAP=no])

AC_ARG_ENABLE(exynos-experimental-api,
	      AS_HELP_STRING([--enable-exynos-experimental-api],
	      [Enable support for EXYNOS's experimental API (default: disabled)]),
	      [EXYNOS=$enableval], [EXYNOS=no])

AC_ARG_ENABLE(freedreno,
	      AS_HELP_STRING([--disable-freedreno],
	      [Enable support for freedreno's KMS API (default: auto, enabled on arm)]),
	      [FREEDRENO=$enableval], [FREEDRENO=auto])

AC_ARG_ENABLE(freedreno-kgsl,
	      AS_HELP_STRING([--enable-freedreno-kgsl],
	      [Enable support for freedreno's to use downstream android kernel API (default: disabled)]),
	      [FREEDRENO_KGSL=$enableval], [FREEDRENO_KGSL=no])

AC_ARG_ENABLE(tegra-experimental-api,
	      AS_HELP_STRING([--enable-tegra-experimental-api],
	      [Enable support for Tegra's experimental API (default: disabled)]),
	      [TEGRA=$enableval], [TEGRA=no])

AC_ARG_ENABLE(vc4,
	      AS_HELP_STRING([--disable-vc4],
	      [Enable support for vc4's API (default: auto, enabled on arm)]),
	      [VC4=$enableval], [VC4=auto])

AC_ARG_ENABLE(install-test-programs,
		  AS_HELP_STRING([--enable-install-test-programs],
		  [Install test programs (default: no)]),
		  [INSTALL_TESTS=$enableval], [INSTALL_TESTS=no])

dnl ===========================================================================
dnl check compiler flags
AC_DEFUN([LIBDRM_CC_TRY_FLAG], [
  AC_MSG_CHECKING([whether $CC supports $1])

  libdrm_save_CFLAGS="$CFLAGS"
  CFLAGS="$CFLAGS $1"

  AC_COMPILE_IFELSE([AC_LANG_SOURCE([ ])], [libdrm_cc_flag=yes], [libdrm_cc_flag=no])
  CFLAGS="$libdrm_save_CFLAGS"

  if test "x$libdrm_cc_flag" = "xyes"; then
    ifelse([$2], , :, [$2])
  else
    ifelse([$3], , :, [$3])
  fi
  AC_MSG_RESULT([$libdrm_cc_flag])
])

dnl We use clock_gettime to check for timeouts in drmWaitVBlank

AC_CHECK_FUNCS([clock_gettime], [CLOCK_LIB=],
               [AC_CHECK_LIB([rt], [clock_gettime], [CLOCK_LIB=-lrt],
                             [AC_MSG_ERROR([Couldn't find clock_gettime])])])
AC_SUBST([CLOCK_LIB])

AC_CHECK_FUNCS([open_memstream], [HAVE_OPEN_MEMSTREAM=yes])

dnl Use lots of warning flags with with gcc and compatible compilers

dnl Note: if you change the following variable, the cache is automatically
dnl skipped and all flags rechecked.  So there's no need to do anything
dnl else.  If for any reason you need to force a recheck, just change
dnl MAYBE_WARN in an ignorable way (like adding whitespace)

MAYBE_WARN="-Wall -Wextra \
-Wsign-compare -Werror-implicit-function-declaration \
-Wpointer-arith -Wwrite-strings -Wstrict-prototypes \
-Wmissing-prototypes -Wmissing-declarations -Wnested-externs \
-Wpacked -Wswitch-enum -Wmissing-format-attribute \
-Wstrict-aliasing=2 -Winit-self \
-Wdeclaration-after-statement -Wold-style-definition \
-Wno-unused-parameter \
-Wno-attributes -Wno-long-long -Winline -Wshadow \
-Wno-missing-field-initializers"

# invalidate cached value if MAYBE_WARN has changed
if test "x$libdrm_cv_warn_maybe" != "x$MAYBE_WARN"; then
	unset libdrm_cv_warn_cflags
fi
AC_CACHE_CHECK([for supported warning flags], libdrm_cv_warn_cflags, [
	echo
	WARN_CFLAGS=""

	# Some warning options are not supported by all versions of
	# gcc, so test all desired options against the current
	# compiler.
	#
	# Note that there are some order dependencies
	# here. Specifically, an option that disables a warning will
	# have no net effect if a later option then enables that
	# warnings, (perhaps implicitly). So we put some grouped
	# options (-Wall and -Wextra) up front and the -Wno options
	# last.

	for W in $MAYBE_WARN; do
		LIBDRM_CC_TRY_FLAG([$W], [WARN_CFLAGS="$WARN_CFLAGS $W"])
	done

	libdrm_cv_warn_cflags=$WARN_CFLAGS
	libdrm_cv_warn_maybe=$MAYBE_WARN

	AC_MSG_CHECKING([which warning flags were supported])])
WARN_CFLAGS="$libdrm_cv_warn_cflags"

# Check for atomic intrinsics
AC_CACHE_CHECK([for native atomic primitives], drm_cv_atomic_primitives, [
	drm_cv_atomic_primitives="none"

	AC_LINK_IFELSE([AC_LANG_PROGRAM([[
	int atomic_add(int *i) { return __sync_add_and_fetch (i, 1); }
	int atomic_cmpxchg(int *i, int j, int k) { return __sync_val_compare_and_swap (i, j, k); }
					  ]],[[]])], [drm_cv_atomic_primitives="Intel"],[])

	if test "x$drm_cv_atomic_primitives" = "xnone"; then
		AC_CHECK_HEADER([atomic_ops.h], drm_cv_atomic_primitives="libatomic-ops")
	fi

	# atomic functions defined in <atomic.h> & libc on Solaris
	if test "x$drm_cv_atomic_primitives" = "xnone"; then
		AC_CHECK_FUNC([atomic_cas_uint], drm_cv_atomic_primitives="Solaris")
	fi
])

if test "x$drm_cv_atomic_primitives" = xIntel; then
	AC_DEFINE(HAVE_LIBDRM_ATOMIC_PRIMITIVES, 1,
		[Enable if your compiler supports the Intel __sync_* atomic primitives])
fi
if test "x$drm_cv_atomic_primitives" = "xlibatomic-ops"; then
	AC_DEFINE(HAVE_LIB_ATOMIC_OPS, 1, [Enable if you have libatomic-ops-dev installed])
fi

dnl Print out the approapriate message considering the value set be the
dnl respective in $1.
dnl $1 - value to be evaluated. Eg. $INTEL, $NOUVEAU, ...
dnl $2 - libdrm shortname. Eg. intel, freedreno, ...
dnl $3 - GPU name/brand. Eg. Intel, NVIDIA Tegra, ...
dnl $4 - Configure switch. Eg. intel, omap-experimental-api, ...
AC_DEFUN([LIBDRM_ATOMICS_NOT_FOUND_MSG], [
	case "x$1" in
		xyes)	AC_MSG_ERROR([libdrm_$2 depends upon atomic operations, which were not found for your compiler/cpu. Try compiling with -march=native, or install the libatomics-op-dev package, or, failing both of those, disable support for $3 GPUs by passing --disable-$4 to ./configure]) ;;
		xauto)	AC_MSG_WARN([Disabling $2. It depends on atomic operations, which were not found for your compiler/cpu. Try compiling with -march=native, or install the libatomics-op-dev package.]) ;;
		*)	;;
	esac
])

if test "x$drm_cv_atomic_primitives" = "xnone"; then
	LIBDRM_ATOMICS_NOT_FOUND_MSG($INTEL, intel, Intel, intel)
	INTEL=no

	LIBDRM_ATOMICS_NOT_FOUND_MSG($RADEON, radeon, Radeon, radeon)
	RADEON=no

	LIBDRM_ATOMICS_NOT_FOUND_MSG($AMDGPU, amdgpu, AMD, amdgpu)
	AMDGPU=no

	LIBDRM_ATOMICS_NOT_FOUND_MSG($NOUVEAU, nouveau, NVIDIA, nouveau)
	NOUVEAU=no

	LIBDRM_ATOMICS_NOT_FOUND_MSG($OMAP, omap, OMAP, omap-experimental-api)
	OMAP=no

	LIBDRM_ATOMICS_NOT_FOUND_MSG($FREEDRENO, freedreno, Qualcomm Adreno, freedreno)
	FREEDRENO=no

	LIBDRM_ATOMICS_NOT_FOUND_MSG($TEGRA, tegra, NVIDIA Tegra, tegra-experimental-api)
	TEGRA=no
else
	if test "x$INTEL" = xauto; then
		case $host_cpu in
			i?86|x86_64)	INTEL=yes ;;
			*)		INTEL=no ;;
		esac
	fi
	if test "x$RADEON" = xauto; then
		RADEON=yes
	fi
	if test "x$AMDGPU" = xauto; then
		AMDGPU=yes
	fi
	if test "x$NOUVEAU" = xauto; then
		NOUVEAU=yes
	fi
	if test "x$FREEDRENO" = xauto; then
		case $host_cpu in
			arm*|aarch64)	FREEDRENO=yes ;;
			*)		FREEDRENO=no ;;
		esac
	fi
	if test "x$VC4" = xauto; then
		case $host_cpu in
			arm*|aarch64)	VC4=yes ;;
			*)		VC4=no ;;
		esac
	fi
fi

if test "x$INTEL" != "xno"; then
	PKG_CHECK_MODULES(PCIACCESS, [pciaccess >= 0.10])
fi
AC_SUBST(PCIACCESS_CFLAGS)
AC_SUBST(PCIACCESS_LIBS)

if test "x$UDEV" = xyes; then
	AC_DEFINE(UDEV, 1, [Have UDEV support])
fi

AC_CANONICAL_HOST
if test "x$LIBKMS" = xauto ; then
	case $host_os in
		linux*)		LIBKMS="yes" ;;
		freebsd* | kfreebsd*-gnu)
				LIBKMS="yes" ;;
		dragonfly*)	LIBKMS="yes" ;;
		*)		LIBKMS="no" ;;
	esac
fi

AM_CONDITIONAL(HAVE_LIBKMS, [test "x$LIBKMS" = xyes])

AM_CONDITIONAL(HAVE_INTEL, [test "x$INTEL" = xyes])
if test "x$INTEL" = xyes; then
	AC_DEFINE(HAVE_INTEL, 1, [Have intel support])
fi

AM_CONDITIONAL(HAVE_VMWGFX, [test "x$VMWGFX" = xyes])
if test "x$VMWGFX" = xyes; then
	AC_DEFINE(HAVE_VMWGFX, 1, [Have vmwgfx kernel headers])
fi

AM_CONDITIONAL(HAVE_NOUVEAU, [test "x$NOUVEAU" = xyes])
if test "x$NOUVEAU" = xyes; then
	AC_DEFINE(HAVE_NOUVEAU, 1, [Have nouveau (nvidia) support])
fi

AM_CONDITIONAL(HAVE_OMAP, [test "x$OMAP" = xyes])
if test "x$OMAP" = xyes; then
	AC_DEFINE(HAVE_OMAP, 1, [Have OMAP support])
fi

AM_CONDITIONAL(HAVE_EXYNOS, [test "x$EXYNOS" = xyes])
if test "x$EXYNOS" = xyes; then
	AC_DEFINE(HAVE_EXYNOS, 1, [Have EXYNOS support])
fi

AM_CONDITIONAL(HAVE_FREEDRENO, [test "x$FREEDRENO" = xyes])
if test "x$FREEDRENO" = xyes; then
	AC_DEFINE(HAVE_FREEDRENO, 1, [Have freedreno support])
fi

if test "x$FREEDRENO_KGSL" = xyes; then
	if test "x$FREEDRENO" != xyes; then
		AC_MSG_ERROR([Cannot enable freedreno KGSL interface if freedreno is disabled])
	fi
fi
AM_CONDITIONAL(HAVE_FREEDRENO_KGSL, [test "x$FREEDRENO_KGSL" = xyes])
if test "x$FREEDRENO_KGSL" = xyes; then
	AC_DEFINE(HAVE_FREEDRENO_KGSL, 1, [Have freedreno support for KGSL kernel interface])
fi

AM_CONDITIONAL(HAVE_RADEON, [test "x$RADEON" = xyes])
if test "x$RADEON" = xyes; then
	AC_DEFINE(HAVE_RADEON, 1, [Have radeon support])
fi

if test "x$AMDGPU" != xno; then
	# Detect cunit library
	PKG_CHECK_MODULES([CUNIT], [cunit >= 2.1], [have_cunit=yes], [have_cunit=no])
	# If pkg-config does not find cunit, check it using AC_CHECK_LIB.  We
	# do this because Debian (Ubuntu) lacks pkg-config file for cunit.
	# fixed in 2.1-2.dfsg-3: http://anonscm.debian.org/cgit/collab-maint/cunit.git/commit/?h=debian
	if test "x${have_cunit}" = "xno"; then
		AC_CHECK_LIB([cunit], [CU_initialize_registry], [have_cunit=yes], [have_cunit=no])
		if test "x${have_cunit}" = "xyes"; then
			CUNIT_LIBS="-lcunit"
			CUNIT_CFLAGS=""
			AC_SUBST([CUNIT_LIBS])
			AC_SUBST([CUNIT_CFLAGS])
		fi
	fi
else
	have_cunit=no
fi
AM_CONDITIONAL(HAVE_CUNIT, [test "x$have_cunit" != "xno"])

AM_CONDITIONAL(HAVE_AMDGPU, [test "x$AMDGPU" = xyes])
if test "x$AMDGPU" = xyes; then
	AC_DEFINE(HAVE_AMDGPU, 1, [Have amdgpu support])

	AC_DEFINE(HAVE_CUNIT, [test "x$have_cunit" != "xno"], [Enable CUNIT Have amdgpu support])

	if test "x$have_cunit" = "xno"; then
		AC_MSG_WARN([Could not find cunit library. Disabling amdgpu tests])
	fi
fi

AM_CONDITIONAL(HAVE_TEGRA, [test "x$TEGRA" = xyes])
if test "x$TEGRA" = xyes; then
	AC_DEFINE(HAVE_TEGRA, 1, [Have Tegra support])
fi

AM_CONDITIONAL(HAVE_VC4, [test "x$VC4" = xyes])
if test "x$VC4" = xyes; then
	AC_DEFINE(HAVE_VC4, 1, [Have VC4 support])
fi

AM_CONDITIONAL(HAVE_INSTALL_TESTS, [test "x$INSTALL_TESTS" = xyes])
if test "x$INSTALL_TESTS" = xyes; then
	AC_DEFINE(HAVE_INSTALL_TESTS, 1, [Install test programs])
fi

AC_ARG_ENABLE([cairo-tests],
              [AS_HELP_STRING([--enable-cairo-tests],
                              [Enable support for Cairo rendering in tests (default: auto)])],
              [CAIRO=$enableval], [CAIRO=auto])
if test "x$CAIRO" != xno; then
	PKG_CHECK_MODULES(CAIRO, cairo, [HAVE_CAIRO=yes], [HAVE_CAIRO=no])
fi
AC_MSG_CHECKING([whether to enable Cairo tests])
if test "x$CAIRO" = xauto; then
	CAIRO="$HAVE_CAIRO"
fi
if test "x$CAIRO" = xyes; then
	if ! test "x$HAVE_CAIRO" = xyes; then
		AC_MSG_ERROR([Cairo support required but not present])
	fi
	AC_DEFINE(HAVE_CAIRO, 1, [Have Cairo support])
fi
AC_MSG_RESULT([$CAIRO])
AM_CONDITIONAL(HAVE_CAIRO, [test "x$CAIRO" = xyes])

# For enumerating devices in test case
PKG_CHECK_MODULES(LIBUDEV, libudev, [HAVE_LIBUDEV=yes], [HAVE_LIBUDEV=no])
if test "x$HAVE_LIBUDEV" = xyes; then
   	AC_DEFINE(HAVE_LIBUDEV, 1, [Have libudev support])
fi
AM_CONDITIONAL(HAVE_LIBUDEV, [test "x$HAVE_LIBUDEV" = xyes])

# xsltproc for docbook manpages
AC_ARG_ENABLE([manpages],
              AS_HELP_STRING([--enable-manpages], [enable manpages @<:@default=auto@:>@]),
              [MANS=$enableval], [MANS=auto])
AM_CONDITIONAL([BUILD_MANPAGES], [test "x$XSLTPROC" != "x" -a "x$MANS" != "xno"])

# check for offline man-pages stylesheet
AC_MSG_CHECKING([for docbook manpages stylesheet])
MANPAGES_STYLESHEET="http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl"
AC_PATH_PROGS_FEATURE_CHECK([XSLTPROC_TMP], [xsltproc],
                            AS_IF([`"$ac_path_XSLTPROC_TMP" --nonet "$MANPAGES_STYLESHEET" > /dev/null 2>&1`],
                                  [HAVE_MANPAGES_STYLESHEET=yes]))
if test "x$HAVE_MANPAGES_STYLESHEET" = "xyes"; then
        AC_SUBST(MANPAGES_STYLESHEET)
        AC_MSG_RESULT([yes])
else
        AC_MSG_RESULT([no])
fi
AM_CONDITIONAL([HAVE_MANPAGES_STYLESHEET], [test "x$HAVE_MANPAGES_STYLESHEET" = "xyes"])

AC_ARG_ENABLE(valgrind,
              [AS_HELP_STRING([--enable-valgrind],
                             [Build libdrm with  valgrind support (default: auto)])],
                             [VALGRIND=$enableval], [VALGRIND=auto])
if test "x$VALGRIND" != xno; then
	PKG_CHECK_MODULES(VALGRIND, [valgrind], [have_valgrind=yes], [have_valgrind=no])
fi
AC_MSG_CHECKING([whether to enable Valgrind support])
if test "x$VALGRIND" = xauto; then
	VALGRIND="$have_valgrind"
fi

if test "x$VALGRIND" = "xyes"; then
	if ! test "x$have_valgrind" = xyes; then
		AC_MSG_ERROR([Valgrind support required but not present])
	fi
	AC_DEFINE([HAVE_VALGRIND], 1, [Use valgrind intrinsics to suppress false warnings])
fi

AC_MSG_RESULT([$VALGRIND])

AC_ARG_WITH([kernel-source],
            [AS_HELP_STRING([--with-kernel-source],
              [specify path to linux kernel source])],
	    [kernel_source="$with_kernel_source"])
AC_SUBST(kernel_source)

AC_MSG_CHECKING([whether $CC supports __attribute__(("hidden"))])
AC_LINK_IFELSE([AC_LANG_PROGRAM([
    int foo_hidden( void ) __attribute__((visibility("hidden")));
])], HAVE_ATTRIBUTE_VISIBILITY="yes"; AC_MSG_RESULT([yes]), AC_MSG_RESULT([no]));

if test "x$HAVE_ATTRIBUTE_VISIBILITY" = xyes; then
    AC_DEFINE(HAVE_VISIBILITY, 1, [Compiler supports __attribute__(("hidden"))])
fi

AC_SUBST(WARN_CFLAGS)
AC_CONFIG_FILES([
	Makefile
	libkms/Makefile
	libkms/libkms.pc
	intel/Makefile
	intel/libdrm_intel.pc
	radeon/Makefile
	radeon/libdrm_radeon.pc
	amdgpu/Makefile
	amdgpu/libdrm_amdgpu.pc
	nouveau/Makefile
	nouveau/libdrm_nouveau.pc
	omap/Makefile
	omap/libdrm_omap.pc
	exynos/Makefile
	exynos/libdrm_exynos.pc
	freedreno/Makefile
	freedreno/libdrm_freedreno.pc
	tegra/Makefile
	tegra/libdrm_tegra.pc
	vc4/Makefile
	vc4/libdrm_vc4.pc
	tests/Makefile
	tests/modeprint/Makefile
	tests/modetest/Makefile
	tests/kms/Makefile
	tests/kmstest/Makefile
	tests/proptest/Makefile
	tests/radeon/Makefile
	tests/amdgpu/Makefile
	tests/vbltest/Makefile
	tests/exynos/Makefile
	tests/tegra/Makefile
	tests/nouveau/Makefile
	tests/util/Makefile
	man/Makefile
	libdrm.pc])
AC_OUTPUT

echo ""
echo "$PACKAGE_STRING will be compiled with:"
echo ""
echo "  libkms         $LIBKMS"
echo "  Intel API      $INTEL"
echo "  vmwgfx API     $VMWGFX"
echo "  Radeon API     $RADEON"
echo "  AMDGPU API     $AMDGPU"
echo "  Nouveau API    $NOUVEAU"
echo "  OMAP API       $OMAP"
echo "  EXYNOS API     $EXYNOS"
echo "  Freedreno API  $FREEDRENO (kgsl: $FREEDRENO_KGSL)"
echo "  Tegra API      $TEGRA"
echo "  VC4 API        $VC4"
echo ""
