# (C) Copyright IBM Corporation 2006
# All Rights Reserved.
#
# 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
# IBM AND/OR THEIR SUPPLIERS 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.
#

# Initialize Autoconf
AC_PREREQ([2.60])
AC_INIT([libpciaccess],[0.13.2],
        [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=libpciaccess],[libpciaccess])
AC_CONFIG_SRCDIR([Makefile.am])
AC_CONFIG_HEADERS([config.h])

# Initialize Automake
AM_INIT_AUTOMAKE([foreign dist-bzip2])
AC_USE_SYSTEM_EXTENSIONS

# Initialize libtool
AC_PROG_LIBTOOL

# Require X.Org macros 1.8 or later
m4_ifndef([XORG_MACROS_VERSION],
          [m4_fatal([must install xorg-macros 1.8 or later before running autoconf/autogen])])
XORG_MACROS_VERSION(1.8)
XORG_DEFAULT_OPTIONS

pciids_path=/usr/share/hwdata
AC_ARG_WITH(pciids-path, AS_HELP_STRING([--with-pciids-path=PCIIDS_PATH],
	[Path to pci.ids file]), [pciids_path="$withval"])
AX_DEFINE_DIR(PCIIDS_PATH, pciids_path, [Path to pci.ids])

AC_ARG_ENABLE(linux-rom-fallback, AS_HELP_STRING([--enable-linux-rom-fallback],
		[Enable support for falling back to /dev/mem for roms (default: disabled)]),
		[LINUX_ROM=$enableval],[LINUX_ROM=no])

if test "x$LINUX_ROM" = xyes; then
	AC_DEFINE(LINUX_ROM, 1, [Linux ROM read fallback])
fi

use_zlib=no
AC_ARG_WITH(zlib, AS_HELP_STRING([--with-zlib],
	[Enable zlib support to read gzip compressed pci.ids]),
	[use_zlib="$withval"])
if test "x$use_zlib" = xyes; then
	AC_CHECK_LIB(z, gzopen,
	[PCIACCESS_LIBS="$PCIACCESS_LIBS -lz"],
	[AC_MSG_ERROR(Check for zlib library failed)])
	AC_CHECK_HEADER([zlib.h],
	[AC_DEFINE(HAVE_ZLIB, 1, [Use zlib to read gzip compressed pci.ids])],
	[AC_MSG_ERROR(Check for zlib.h header file failed)])
fi

case $host_os in
	*freebsd* | *dragonfly*)
		freebsd=yes
		;;
	*linux*)
		linux=yes
		;;
	*netbsd*)
		case $host in
		*i[3-9]86*)
			PCIACCESS_LIBS="$PCIACCESS_LIBS -li386 -lpci"
			;;
		*x86_64*|*amd64*)
			PCIACCESS_LIBS="$PCIACCESS_LIBS -lx86_64 -lpci"
			;;
		esac
		netbsd=yes
		;;
	*openbsd*)
		openbsd=yes
		;;
	*solaris*)
		solaris=yes
		PCIACCESS_LIBS="$PCIACCESS_LIBS -ldevinfo"
		;;
	gnu*)
		gnu=yes
		;;
	*cygwin*)
		cygwin=yes
		PCIACCESS_LIBS="$PCIACCESS_LIBS"
		;;
esac

AM_CONDITIONAL(LINUX, [test "x$linux" = xyes])
AM_CONDITIONAL(FREEBSD, [test "x$freebsd" = xyes])
AM_CONDITIONAL(NETBSD, [test "x$netbsd" = xyes])
AM_CONDITIONAL(OPENBSD, [test "x$openbsd" = xyes])
AM_CONDITIONAL(SOLARIS, [test "x$solaris" = xyes])
AM_CONDITIONAL(GNU, [test "x$gnu" = xyes])
AM_CONDITIONAL(CYGWIN, [test "x$cygwin" = xyes])

AC_SYS_LARGEFILE

AC_CHECK_HEADERS([err.h])

if test "x$netbsd" = xyes; then
AC_CHECK_HEADERS([machine/sysarch.h])
AC_CHECK_HEADERS([machine/mtrr.h], [have_mtrr_h="yes"], [have_mtrr_h="no"],
[#ifdef HAVE_MACHINE_SYSARCH_H
#include <sys/types.h>
#include <machine/sysarch.h>
#endif
])
else
AC_CHECK_HEADER([asm/mtrr.h], [have_mtrr_h="yes"], [have_mtrr_h="no"])
fi

if test "x$have_mtrr_h" = xyes; then
    AC_DEFINE(HAVE_MTRR, 1, [Use MTRRs on mappings])
fi

# check for the pci_io.pi_sel.pc_domain
AC_CHECK_MEMBER([struct pci_io.pi_sel.pc_domain],
               [AC_DEFINE(HAVE_PCI_IO_PC_DOMAIN,1,[Have the pci_io.pi_sel.pc_domain member.])],
               [],
               [ #include <sys/types.h>
                 #include <sys/pciio.h>
               ])

AC_SUBST(PCIACCESS_CFLAGS)
AC_SUBST(PCIACCESS_LIBS)

AC_CONFIG_FILES([Makefile
		include/Makefile
		man/Makefile
		src/Makefile
		scanpci/Makefile
		pciaccess.pc])
AC_OUTPUT
