#  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.

include Makefile.sources

ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}

AM_DISTCHECK_CONFIGURE_FLAGS = \
	--enable-udev \
	--enable-libkms \
	--enable-intel \
	--enable-radeon \
	--enable-amdgpu \
	--enable-nouveau \
	--enable-vmwgfx \
	--enable-omap-experimental-api \
	--enable-exynos-experimental-api \
	--enable-freedreno \
	--enable-freedreno-kgsl\
	--enable-tegra-experimental-api \
	--enable-install-test-programs \
	--enable-cairo-tests \
	--enable-manpages \
	--enable-valgrind

pkgconfigdir = @pkgconfigdir@
pkgconfig_DATA = libdrm.pc

if HAVE_LIBKMS
LIBKMS_SUBDIR = libkms
endif

if HAVE_INTEL
INTEL_SUBDIR = intel
endif

if HAVE_NOUVEAU
NOUVEAU_SUBDIR = nouveau
endif

if HAVE_RADEON
RADEON_SUBDIR = radeon
endif

if HAVE_AMDGPU
AMDGPU_SUBDIR = amdgpu
endif

if HAVE_OMAP
OMAP_SUBDIR = omap
endif

if HAVE_EXYNOS
EXYNOS_SUBDIR = exynos
endif

if HAVE_FREEDRENO
FREEDRENO_SUBDIR = freedreno
endif

if HAVE_TEGRA
TEGRA_SUBDIR = tegra
endif

if BUILD_MANPAGES
if HAVE_MANPAGES_STYLESHEET
MAN_SUBDIR = man
endif
endif

if HAVE_ROCKCHIP
ROCKCHIP_SUBDIR = rockchip
endif

SUBDIRS = \
	. \
	$(LIBKMS_SUBDIR) \
	$(INTEL_SUBDIR) \
	$(NOUVEAU_SUBDIR) \
	$(RADEON_SUBDIR) \
	$(AMDGPU_SUBDIR) \
	$(OMAP_SUBDIR) \
	$(EXYNOS_SUBDIR) \
	$(FREEDRENO_SUBDIR) \
	$(TEGRA_SUBDIR) \
	tests \
	$(MAN_SUBDIR) \
	$(ROCKCHIP_SUBDIR)

libdrm_la_LTLIBRARIES = libdrm.la
libdrm_ladir = $(libdir)
libdrm_la_LDFLAGS = -version-number 2:4:0 -no-undefined
libdrm_la_LIBADD = @CLOCK_LIB@ -lm

libdrm_la_CPPFLAGS = -I$(top_srcdir)/include/drm
AM_CFLAGS = \
	$(WARN_CFLAGS) \
	$(VALGRIND_CFLAGS)

libdrm_la_SOURCES = $(LIBDRM_FILES)

libdrmincludedir = ${includedir}
libdrminclude_HEADERS = $(LIBDRM_H_FILES)

EXTRA_DIST = Android.mk

klibdrmincludedir = ${includedir}/libdrm
klibdrminclude_HEADERS = $(LIBDRM_INCLUDE_H_FILES)

if HAVE_VMWGFX
klibdrminclude_HEADERS += $(LIBDRM_INCLUDE_VMWGFX_H_FILES)
endif


copy-headers :
	cp -r $(kernel_source)/include/uapi/drm/*.h $(top_srcdir)/include/drm/

commit-headers : copy-headers
	git add include/drm/*.h
	git commit -am "Copy headers from kernel $$(GIT_DIR=$(kernel_source)/.git git describe)"
