1#  Copyright 2005 Adam Jackson.
2#
3#  Permission is hereby granted, free of charge, to any person obtaining a
4#  copy of this software and associated documentation files (the "Software"),
5#  to deal in the Software without restriction, including without limitation
6#  on the rights to use, copy, modify, merge, publish, distribute, sub
7#  license, and/or sell copies of the Software, and to permit persons to whom
8#  the Software is furnished to do so, subject to the following conditions:
9#
10#  The above copyright notice and this permission notice (including the next
11#  paragraph) shall be included in all copies or substantial portions of the
12#  Software.
13#
14#  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15#  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16#  FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
17#  ADAM JACKSON BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
18#  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19#  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
21AC_PREREQ([2.63])
22AC_INIT([libdrm],
23        [2.4.58],
24        [https://bugs.freedesktop.org/enter_bug.cgi?product=DRI],
25        [libdrm])
26
27AC_CONFIG_HEADERS([config.h])
28AC_CONFIG_SRCDIR([Makefile.am])
29AC_CONFIG_MACRO_DIR([m4])
30AC_CONFIG_AUX_DIR([build-aux])
31
32AM_INIT_AUTOMAKE([1.10 foreign dist-bzip2])
33AM_MAINTAINER_MODE([enable])
34
35# Enable quiet compiles on automake 1.11.
36m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
37
38# Check for programs
39AC_PROG_CC
40
41AC_USE_SYSTEM_EXTENSIONS
42AC_SYS_LARGEFILE
43AC_FUNC_ALLOCA
44
45# Initialize libtool
46LT_PREREQ([2.2])
47LT_INIT([disable-static])
48
49
50PKG_CHECK_MODULES(PTHREADSTUBS, pthread-stubs)
51AC_SUBST(PTHREADSTUBS_CFLAGS)
52AC_SUBST(PTHREADSTUBS_LIBS)
53
54pkgconfigdir=${libdir}/pkgconfig
55AC_SUBST(pkgconfigdir)
56AC_ARG_ENABLE([udev],
57              [AS_HELP_STRING([--enable-udev],
58                              [Enable support for using udev instead of mknod (default: disabled)])],
59              [UDEV=$enableval], [UDEV=no])
60
61AC_ARG_ENABLE(libkms,
62	      AS_HELP_STRING([--disable-libkms],
63	      [Disable KMS mm abstraction library (default: auto)]),
64	      [LIBKMS=$enableval], [LIBKMS=auto])
65
66AC_ARG_ENABLE(intel,
67	      AS_HELP_STRING([--disable-intel],
68	      [Enable support for intel's KMS API (default: auto)]),
69	      [INTEL=$enableval], [INTEL=auto])
70
71AC_ARG_ENABLE(radeon,
72	      AS_HELP_STRING([--disable-radeon],
73	      [Enable support for radeon's KMS API (default: auto)]),
74	      [RADEON=$enableval], [RADEON=auto])
75
76AC_ARG_ENABLE(nouveau,
77	      AS_HELP_STRING([--disable-nouveau],
78	      [Enable support for nouveau's KMS API (default: auto)]),
79	      [NOUVEAU=$enableval], [NOUVEAU=auto])
80
81AC_ARG_ENABLE(vmwgfx,
82	      AS_HELP_STRING([--disable-vmwgfx],
83	      [Enable support for vmwgfx's KMS API (default: yes)]),
84	      [VMWGFX=$enableval], [VMWGFX=yes])
85
86AC_ARG_ENABLE(omap-experimental-api,
87	      AS_HELP_STRING([--enable-omap-experimental-api],
88	      [Enable support for OMAP's experimental API (default: disabled)]),
89	      [OMAP=$enableval], [OMAP=no])
90
91AC_ARG_ENABLE(exynos-experimental-api,
92	      AS_HELP_STRING([--enable-exynos-experimental-api],
93	      [Enable support for EXYNOS's experimental API (default: disabled)]),
94	      [EXYNOS=$enableval], [EXYNOS=no])
95
96AC_ARG_ENABLE(freedreno,
97	      AS_HELP_STRING([--disable-freedreno],
98	      [Enable support for freedreno's KMS API (default: enabled)]),
99	      [FREEDRENO=$enableval], [FREEDRENO=yes])
100
101AC_ARG_ENABLE(freedreno-kgsl,
102	      AS_HELP_STRING([--enable-freedreno-kgsl],
103	      [Enable support for freedreno's to use downstream android kernel API (default: disabled)]),
104	      [FREEDRENO_KGSL=$enableval], [FREEDRENO_KGSL=no])
105
106AC_ARG_ENABLE(tegra-experimental-api,
107	      AS_HELP_STRING([--enable-tegra-experimental-api],
108	      [Enable support for Tegra's experimental API (default: disabled)]),
109	      [TEGRA=$enableval], [TEGRA=no])
110
111AC_ARG_ENABLE(rockchip-experimental-api,
112	      AS_HELP_STRING([--enable-rockchip-experimental-api],
113	      [Enable support for rockchip's experimental API (default: disabled)]),
114	      [ROCKCHIP=$enableval], [ROCKCHIP=no])
115
116AC_ARG_ENABLE(install-test-programs,
117		  AS_HELP_STRING([--enable-install-test-programs],
118		  [Install test programs (default: no)]),
119		  [INSTALL_TESTS=$enableval], [INSTALL_TESTS=no])
120
121dnl ===========================================================================
122dnl check compiler flags
123AC_DEFUN([LIBDRM_CC_TRY_FLAG], [
124  AC_MSG_CHECKING([whether $CC supports $1])
125
126  libdrm_save_CFLAGS="$CFLAGS"
127  CFLAGS="$CFLAGS $1"
128
129  AC_COMPILE_IFELSE([AC_LANG_SOURCE([ ])], [libdrm_cc_flag=yes], [libdrm_cc_flag=no])
130  CFLAGS="$libdrm_save_CFLAGS"
131
132  if test "x$libdrm_cc_flag" = "xyes"; then
133    ifelse([$2], , :, [$2])
134  else
135    ifelse([$3], , :, [$3])
136  fi
137  AC_MSG_RESULT([$libdrm_cc_flag])
138])
139
140dnl We use clock_gettime to check for timeouts in drmWaitVBlank
141
142AC_CHECK_FUNCS([clock_gettime], [CLOCK_LIB=],
143               [AC_CHECK_LIB([rt], [clock_gettime], [CLOCK_LIB=-lrt],
144                             [AC_MSG_ERROR([Couldn't find clock_gettime])])])
145AC_SUBST([CLOCK_LIB])
146
147AC_CHECK_FUNCS([open_memstream], [HAVE_OPEN_MEMSTREAM=yes])
148
149dnl Use lots of warning flags with with gcc and compatible compilers
150
151dnl Note: if you change the following variable, the cache is automatically
152dnl skipped and all flags rechecked.  So there's no need to do anything
153dnl else.  If for any reason you need to force a recheck, just change
154dnl MAYBE_WARN in an ignorable way (like adding whitespace)
155
156MAYBE_WARN="-Wall -Wextra \
157-Wsign-compare -Werror-implicit-function-declaration \
158-Wpointer-arith -Wwrite-strings -Wstrict-prototypes \
159-Wmissing-prototypes -Wmissing-declarations -Wnested-externs \
160-Wpacked -Wswitch-enum -Wmissing-format-attribute \
161-Wstrict-aliasing=2 -Winit-self \
162-Wdeclaration-after-statement -Wold-style-definition \
163-Wno-missing-field-initializers -Wno-unused-parameter \
164-Wno-attributes -Wno-long-long -Winline"
165
166# invalidate cached value if MAYBE_WARN has changed
167if test "x$libdrm_cv_warn_maybe" != "x$MAYBE_WARN"; then
168	unset libdrm_cv_warn_cflags
169fi
170AC_CACHE_CHECK([for supported warning flags], libdrm_cv_warn_cflags, [
171	echo
172	WARN_CFLAGS=""
173
174	# Some warning options are not supported by all versions of
175	# gcc, so test all desired options against the current
176	# compiler.
177	#
178	# Note that there are some order dependencies
179	# here. Specifically, an option that disables a warning will
180	# have no net effect if a later option then enables that
181	# warnings, (perhaps implicitly). So we put some grouped
182	# options (-Wall and -Wextra) up front and the -Wno options
183	# last.
184
185	for W in $MAYBE_WARN; do
186		LIBDRM_CC_TRY_FLAG([$W], [WARN_CFLAGS="$WARN_CFLAGS $W"])
187	done
188
189	libdrm_cv_warn_cflags=$WARN_CFLAGS
190	libdrm_cv_warn_maybe=$MAYBE_WARN
191
192	AC_MSG_CHECKING([which warning flags were supported])])
193WARN_CFLAGS="$libdrm_cv_warn_cflags"
194
195# Check for atomic intrinsics
196AC_CACHE_CHECK([for native atomic primitives], drm_cv_atomic_primitives, [
197	drm_cv_atomic_primitives="none"
198
199	AC_LINK_IFELSE([AC_LANG_PROGRAM([[
200	int atomic_add(int i) { return __sync_fetch_and_add (&i, 1); }
201	int atomic_cmpxchg(int i, int j, int k) { return __sync_val_compare_and_swap (&i, j, k); }
202					  ]],[[]])], [drm_cv_atomic_primitives="Intel"],[])
203
204	if test "x$drm_cv_atomic_primitives" = "xnone"; then
205		AC_CHECK_HEADER([atomic_ops.h], drm_cv_atomic_primitives="libatomic-ops")
206	fi
207
208	# atomic functions defined in <atomic.h> & libc on Solaris
209	if test "x$drm_cv_atomic_primitives" = "xnone"; then
210		AC_CHECK_FUNC([atomic_cas_uint], drm_cv_atomic_primitives="Solaris")
211	fi
212])
213
214if test "x$drm_cv_atomic_primitives" = xIntel; then
215	AC_DEFINE(HAVE_LIBDRM_ATOMIC_PRIMITIVES, 1,
216		[Enable if your compiler supports the Intel __sync_* atomic primitives])
217fi
218if test "x$drm_cv_atomic_primitives" = "xlibatomic-ops"; then
219	AC_DEFINE(HAVE_LIB_ATOMIC_OPS, 1, [Enable if you have libatomic-ops-dev installed])
220fi
221
222if test "x$INTEL" != "xno" -o "x$RADEON" != "xno" -o "x$NOUVEAU" != "xno"; then
223	if test "x$drm_cv_atomic_primitives" = "xnone"; then
224		if test "x$INTEL" != "xauto"; then
225			if test "x$INTEL" != "xno"; then
226				AC_MSG_ERROR([libdrm_intel 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 Intel GPUs by passing --disable-intel to ./configure])
227			fi
228		else
229			AC_MSG_WARN([Disabling libdrm_intel. 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.])
230			INTEL=no
231		fi
232		if test "x$RADEON" != "xauto"; then
233			if test "x$RADEON" != "xno"; then
234				AC_MSG_ERROR([libdrm_radeon 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 Radeon GPUs by passing --disable-radeon to ./configure])
235			fi
236		else
237			AC_MSG_WARN([Disabling libdrm_radeon. 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.])
238			RADEON=no
239		fi
240		if test "x$NOUVEAU" != "xauto"; then
241			if test "x$NOUVEAU" != "xno"; then
242				AC_MSG_ERROR([libdrm_nouveau 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 NVIDIA GPUs by passing --disable-nouveau to ./configure])
243			fi
244		else
245			AC_MSG_WARN([Disabling libdrm_nouveau. 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.])
246			NOUVEAU=no
247		fi
248	else
249		if test "x$INTEL" != "xno"; then
250			case $host_cpu in
251				i?86|x86_64) INTEL=yes ;;
252				*) INTEL=no ;;
253			esac
254		fi
255		if test "x$RADEON" != "xno"; then
256			RADEON=yes
257		fi
258		if test "x$NOUVEAU" != "xno"; then
259			NOUVEAU=yes
260		fi
261	fi
262fi
263
264if test "x$INTEL" != "xno"; then
265	PKG_CHECK_MODULES(PCIACCESS, [pciaccess >= 0.10])
266fi
267AC_SUBST(PCIACCESS_CFLAGS)
268AC_SUBST(PCIACCESS_LIBS)
269
270if test "x$UDEV" = xyes; then
271	AC_DEFINE(UDEV, 1, [Have UDEV support])
272fi
273
274AC_CANONICAL_HOST
275if test "x$LIBKMS" = xauto ; then
276	case $host_os in
277		linux*)		LIBKMS="yes" ;;
278		freebsd* | kfreebsd*-gnu)
279				LIBKMS="yes" ;;
280		dragonfly*)	LIBKMS="yes" ;;
281		*)		LIBKMS="no" ;;
282	esac
283fi
284
285AM_CONDITIONAL(HAVE_LIBKMS, [test "x$LIBKMS" = xyes])
286
287AM_CONDITIONAL(HAVE_INTEL, [test "x$INTEL" = xyes])
288if test "x$INTEL" = xyes; then
289	AC_DEFINE(HAVE_INTEL, 1, [Have intel support])
290fi
291
292AM_CONDITIONAL(HAVE_VMWGFX, [test "x$VMWGFX" = xyes])
293if test "x$VMWGFX" = xyes; then
294	AC_DEFINE(HAVE_VMWGFX, 1, [Have vmwgfx kernel headers])
295fi
296
297AM_CONDITIONAL(HAVE_NOUVEAU, [test "x$NOUVEAU" = xyes])
298if test "x$NOUVEAU" = xyes; then
299	AC_DEFINE(HAVE_NOUVEAU, 1, [Have nouveau (nvidia) support])
300fi
301
302AM_CONDITIONAL(HAVE_OMAP, [test "x$OMAP" = xyes])
303if test "x$OMAP" = xyes; then
304	AC_DEFINE(HAVE_OMAP, 1, [Have OMAP support])
305fi
306
307AM_CONDITIONAL(HAVE_EXYNOS, [test "x$EXYNOS" = xyes])
308if test "x$EXYNOS" = xyes; then
309	AC_DEFINE(HAVE_EXYNOS, 1, [Have EXYNOS support])
310fi
311
312AM_CONDITIONAL(HAVE_FREEDRENO, [test "x$FREEDRENO" = xyes])
313if test "x$FREEDRENO" = xyes; then
314	AC_DEFINE(HAVE_FREEDRENO, 1, [Have freedreno support])
315fi
316
317AM_CONDITIONAL(HAVE_FREEDRENO_KGSL, [test "x$FREEDRENO_KGSL" = xyes])
318if test "x$FREEDRENO_KGSL" = xyes; then
319	AC_DEFINE(HAVE_FREEDRENO_KGSL, 1, [Have freedreno support for KGSL kernel interface])
320fi
321
322AM_CONDITIONAL(HAVE_RADEON, [test "x$RADEON" = xyes])
323if test "x$RADEON" = xyes; then
324	AC_DEFINE(HAVE_RADEON, 1, [Have radeon support])
325fi
326
327AM_CONDITIONAL(HAVE_TEGRA, [test "x$TEGRA" = xyes])
328if test "x$TEGRA" = xyes; then
329	AC_DEFINE(HAVE_TEGRA, 1, [Have Tegra support])
330fi
331
332AM_CONDITIONAL(HAVE_ROCKCHIP, [test "x$ROCKCHIP" = xyes])
333if test "x$ROCKCHIP" = xyes; then
334	AC_DEFINE(HAVE_ROCKCHIP, 1, [Have ROCKCHIP support])
335fi
336
337AM_CONDITIONAL(HAVE_INSTALL_TESTS, [test "x$INSTALL_TESTS" = xyes])
338if test "x$INSTALL_TESTS" = xyes; then
339	AC_DEFINE(HAVE_INSTALL_TESTS, 1, [Install test programs])
340fi
341
342AC_ARG_ENABLE([cairo-tests],
343              [AS_HELP_STRING([--enable-cairo-tests],
344                              [Enable support for Cairo rendering in tests (default: auto)])],
345              [CAIRO=$enableval], [CAIRO=auto])
346PKG_CHECK_MODULES(CAIRO, cairo, [HAVE_CAIRO=yes], [HAVE_CAIRO=no])
347AC_MSG_CHECKING([whether to enable Cairo tests])
348if test "x$CAIRO" = xauto; then
349	CAIRO="$HAVE_CAIRO"
350fi
351if test "x$CAIRO" = xyes; then
352	if ! test "x$HAVE_CAIRO" = xyes; then
353		AC_MSG_ERROR([Cairo support required but not present])
354	fi
355	AC_DEFINE(HAVE_CAIRO, 1, [Have Cairo support])
356fi
357AC_MSG_RESULT([$CAIRO])
358AM_CONDITIONAL(HAVE_CAIRO, [test "x$CAIRO" = xyes])
359
360# For enumerating devices in test case
361PKG_CHECK_MODULES(LIBUDEV, libudev, [HAVE_LIBUDEV=yes], [HAVE_LIBUDEV=no])
362if test "x$HAVE_LIBUDEV" = xyes; then
363   	AC_DEFINE(HAVE_LIBUDEV, 1, [Have libudev support])
364fi
365AM_CONDITIONAL(HAVE_LIBUDEV, [test "x$HAVE_LIBUDEV" = xyes])
366
367# xsltproc for docbook manpages
368AC_ARG_ENABLE([manpages],
369              AS_HELP_STRING([--disable-manpages], [disable manpages @<:@default=enabled@:>@]),
370              [MANS=$enableval], [MANS=auto])
371AC_PATH_PROG(XSLTPROC, xsltproc)
372AM_CONDITIONAL([BUILD_MANPAGES], [test "x$XSLTPROC" != "x" -a "x$MANS" != "xno"])
373
374# check for offline man-pages stylesheet
375AC_MSG_CHECKING([for docbook manpages stylesheet])
376MANPAGES_STYLESHEET="http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl"
377AC_PATH_PROGS_FEATURE_CHECK([XSLTPROC_TMP], [xsltproc],
378                            AS_IF([`"$ac_path_XSLTPROC_TMP" --nonet "$MANPAGES_STYLESHEET" > /dev/null 2>&1`],
379                                  [HAVE_MANPAGES_STYLESHEET=yes]))
380if test "x$HAVE_MANPAGES_STYLESHEET" = "xyes"; then
381        AC_SUBST(MANPAGES_STYLESHEET)
382        AC_MSG_RESULT([yes])
383else
384        AC_MSG_RESULT([no])
385fi
386AM_CONDITIONAL([HAVE_MANPAGES_STYLESHEET], [test "x$HAVE_MANPAGES_STYLESHEET" = "xyes"])
387
388PKG_CHECK_MODULES(VALGRIND, [valgrind], [have_valgrind=yes], [have_valgrind=no])
389if test "x$have_valgrind" = "xyes"; then
390	AC_DEFINE([HAVE_VALGRIND], 1, [Use valgrind intrinsics to suppress false warnings])
391fi
392
393AC_ARG_WITH([kernel-source],
394            [AS_HELP_STRING([--with-kernel-source],
395              [specify path to linux kernel source])],
396	    [kernel_source="$with_kernel_source"])
397AC_SUBST(kernel_source)
398
399dnl Add flags for gcc and g++
400if test "x$GCC" = xyes; then
401    # Enable -fvisibility=hidden if using a gcc that supports it
402    save_CFLAGS="$CFLAGS"
403    AC_MSG_CHECKING([whether $CC supports -fvisibility=hidden])
404    VISIBILITY_CFLAGS="-fvisibility=hidden"
405    CFLAGS="$CFLAGS $VISIBILITY_CFLAGS"
406    AC_LINK_IFELSE([AC_LANG_PROGRAM()], AC_MSG_RESULT([yes]),
407                   [VISIBILITY_CFLAGS=""; AC_MSG_RESULT([no])]);
408
409    # Restore CFLAGS; VISIBILITY_CFLAGS are added to it where needed.
410    CFLAGS=$save_CFLAGS
411
412    if test "x$VISIBILITY_CFLAGS" != x; then
413        AC_DEFINE(HAVE_VISIBILITY, 1, [Compiler has -fvisibility support])
414    fi
415
416    AC_SUBST([VISIBILITY_CFLAGS])
417fi
418
419AC_SUBST(WARN_CFLAGS)
420AC_CONFIG_FILES([
421	Makefile
422	libkms/Makefile
423	libkms/libkms.pc
424	intel/Makefile
425	intel/libdrm_intel.pc
426	radeon/Makefile
427	radeon/libdrm_radeon.pc
428	nouveau/Makefile
429	nouveau/libdrm_nouveau.pc
430	omap/Makefile
431	omap/libdrm_omap.pc
432	exynos/Makefile
433	exynos/libdrm_exynos.pc
434	freedreno/Makefile
435	freedreno/libdrm_freedreno.pc
436	tegra/Makefile
437	tegra/libdrm_tegra.pc
438	rockchip/Makefile
439	rockchip/libdrm_rockchip.pc
440	tests/Makefile
441	tests/modeprint/Makefile
442	tests/modetest/Makefile
443	tests/kmstest/Makefile
444	tests/proptest/Makefile
445	tests/radeon/Makefile
446	tests/vbltest/Makefile
447	tests/exynos/Makefile
448	tests/tegra/Makefile
449	tests/planetest/Makefile
450	man/Makefile
451	libdrm.pc])
452AC_OUTPUT
453
454echo ""
455echo "$PACKAGE_STRING will be compiled with:"
456echo ""
457echo "  libkms         $LIBKMS"
458echo "  Intel API      $INTEL"
459echo "  vmwgfx API     $VMWGFX"
460echo "  Radeon API     $RADEON"
461echo "  Nouveau API    $NOUVEAU"
462echo "  OMAP API       $OMAP"
463echo "  EXYNOS API     $EXYNOS"
464echo "  Freedreno API  $FREEDRENO (kgsl: $FREEDRENO_KGSL)"
465echo "  Tegra API      $TEGRA"
466echo "  Rockchip API   $ROCKCHIP"
467echo ""
468