• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1dnl  Copyright 2005 Red Hat, Inc.
2dnl
3dnl  Permission to use, copy, modify, distribute, and sell this software and its
4dnl  documentation for any purpose is hereby granted without fee, provided that
5dnl  the above copyright notice appear in all copies and that both that
6dnl  copyright notice and this permission notice appear in supporting
7dnl  documentation, and that the name of Red Hat not be used in
8dnl  advertising or publicity pertaining to distribution of the software without
9dnl  specific, written prior permission.  Red Hat makes no
10dnl  representations about the suitability of this software for any purpose.  It
11dnl  is provided "as is" without express or implied warranty.
12dnl
13dnl  RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
14dnl  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
15dnl  EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
16dnl  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
17dnl  DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18dnl  TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19dnl  PERFORMANCE OF THIS SOFTWARE.
20dnl
21dnl Process this file with autoconf to create configure.
22
23AC_PREREQ([2.57])
24
25#   Pixman versioning scheme
26#
27#   - The version in git has an odd MICRO version number
28#
29#   - Released versions, both development and stable, have an
30#     even MICRO version number
31#
32#   - Released development versions have an odd MINOR number
33#
34#   - Released stable versions have an even MINOR number
35#
36#   - Versions that break ABI must have a new MAJOR number
37#
38#   - If you break the ABI, then at least this must be done:
39#
40#        - increment MAJOR
41#
42#        - In the first development release where you break ABI, find
43#          all instances of "pixman-n" and change them to pixman-(n+1)
44#
45#          This needs to be done at least in
46#                    configure.ac
47#                    all Makefile.am's
48#                    pixman-n.pc.in
49#
50#      This ensures that binary incompatible versions can be installed
51#      in parallel.  See http://www106.pair.com/rhp/parallel.html for
52#      more information
53#
54
55m4_define([pixman_major], 0)
56m4_define([pixman_minor], 40)
57m4_define([pixman_micro], 0)
58
59m4_define([pixman_version],[pixman_major.pixman_minor.pixman_micro])
60
61AC_INIT(pixman, pixman_version, [pixman@lists.freedesktop.org], pixman)
62AM_INIT_AUTOMAKE([foreign dist-xz])
63
64# Suppress verbose compile lines
65m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
66
67AC_CONFIG_HEADERS(config.h)
68
69AC_CANONICAL_HOST
70
71test_CFLAGS=${CFLAGS+set} # We may override autoconf default CFLAGS.
72
73AC_PROG_CC
74AM_PROG_AS
75AC_PROG_LIBTOOL
76AC_CHECK_FUNCS([getisax])
77AC_C_BIGENDIAN
78AC_C_INLINE
79
80dnl PIXMAN_LINK_WITH_ENV(env-setup, program, true-action, false-action)
81dnl
82dnl Compiles and links the given program in the environment setup by env-setup
83dnl and executes true-action on success and false-action on failure.
84AC_DEFUN([PIXMAN_LINK_WITH_ENV],[dnl
85	save_CFLAGS="$CFLAGS"
86	save_LDFLAGS="$LDFLAGS"
87	save_LIBS="$LIBS"
88	CFLAGS=""
89	LDFLAGS=""
90	LIBS=""
91	$1
92	CFLAGS="$save_CFLAGS $CFLAGS"
93	LDFLAGS="$save_LDFLAGS $LDFLAGS"
94	LIBS="$save_LIBS $LIBS"
95	AC_LINK_IFELSE(
96		[AC_LANG_SOURCE([$2])],
97		[pixman_cc_stderr=`test -f conftest.err && cat conftest.err`
98		 pixman_cc_flag=yes],
99		[pixman_cc_stderr=`test -f conftest.err && cat conftest.err`
100		 pixman_cc_flag=no])
101
102	if test "x$pixman_cc_stderr" != "x"; then
103		pixman_cc_flag=no
104	fi
105
106	if test "x$pixman_cc_flag" = "xyes"; then
107		ifelse([$3], , :, [$3])
108	else
109		ifelse([$4], , :, [$4])
110	fi
111	CFLAGS="$save_CFLAGS"
112	LDFLAGS="$save_LDFLAGS"
113	LIBS="$save_LIBS"
114])
115
116dnl Find a -Werror for catching warnings.
117WERROR=
118for w in -Werror -errwarn; do
119    if test "z$WERROR" = "z"; then
120        AC_MSG_CHECKING([whether the compiler supports $w])
121        PIXMAN_LINK_WITH_ENV(
122		[CFLAGS=$w],
123		[int main(int c, char **v) { (void)c; (void)v; return 0; }],
124		[WERROR=$w; yesno=yes], [yesno=no])
125	AC_MSG_RESULT($yesno)
126    fi
127done
128
129dnl PIXMAN_CHECK_CFLAG(flag, [program])
130dnl  Adds flag to CFLAGS if the given program links without warnings or errors.
131AC_DEFUN([PIXMAN_CHECK_CFLAG], [dnl
132	AC_MSG_CHECKING([whether the compiler supports $1])
133	PIXMAN_LINK_WITH_ENV(
134		[CFLAGS="$WERROR $1"],
135		[$2
136		 int main(int c, char **v) { (void)c; (void)v; return 0; }
137		],
138		[_yesno=yes],
139		[_yesno=no])
140	if test "x$_yesno" = xyes; then
141	   CFLAGS="$CFLAGS $1"
142	fi
143	AC_MSG_RESULT($_yesno)
144])
145
146AC_CHECK_SIZEOF(long)
147
148# Checks for Sun Studio compilers
149AC_CHECK_DECL([__SUNPRO_C], [SUNCC="yes"], [SUNCC="no"])
150AC_CHECK_DECL([__amd64], [AMD64_ABI="yes"], [AMD64_ABI="no"])
151
152# Default CFLAGS to -O -g rather than just the -g from AC_PROG_CC
153# if we're using Sun Studio and neither the user nor a config.site
154# has set CFLAGS.
155if test $SUNCC = yes &&			\
156   test "x$test_CFLAGS" = "x" &&	\
157   test "$CFLAGS" = "-g"
158then
159  CFLAGS="-O -g"
160fi
161
162#
163# We ignore pixman_major in the version here because the major version should
164# always be encoded in the actual library name. Ie., the soname is:
165#
166#      pixman-$(pixman_major).0.minor.micro
167#
168m4_define([lt_current], [pixman_minor])
169m4_define([lt_revision], [pixman_micro])
170m4_define([lt_age], [pixman_minor])
171
172LT_VERSION_INFO="lt_current:lt_revision:lt_age"
173
174PIXMAN_VERSION_MAJOR=pixman_major()
175AC_SUBST(PIXMAN_VERSION_MAJOR)
176PIXMAN_VERSION_MINOR=pixman_minor()
177AC_SUBST(PIXMAN_VERSION_MINOR)
178PIXMAN_VERSION_MICRO=pixman_micro()
179AC_SUBST(PIXMAN_VERSION_MICRO)
180
181AC_SUBST(LT_VERSION_INFO)
182
183# Check for dependencies
184
185PIXMAN_CHECK_CFLAG([-Wall])
186PIXMAN_CHECK_CFLAG([-Wdeclaration-after-statement])
187PIXMAN_CHECK_CFLAG([-Wno-unused-local-typedefs])
188PIXMAN_CHECK_CFLAG([-fno-strict-aliasing])
189
190dnl =========================================================================
191dnl OpenMP for the test suite?
192dnl
193
194# Check for OpenMP support only when autoconf support that (require autoconf >=2.62)
195OPENMP_CFLAGS=
196m4_ifdef([AC_OPENMP], [AC_OPENMP])
197
198if test "x$enable_openmp" = "xyes" && test "x$ac_cv_prog_c_openmp" = "xunsupported" ; then
199  AC_MSG_WARN([OpenMP support requested but found unsupported])
200fi
201
202dnl May not fail to link without -Wall -Werror added
203dnl So try to link only when openmp is supported
204dnl ac_cv_prog_c_openmp is not defined when --disable-openmp is used
205if test "x$ac_cv_prog_c_openmp" != "xunsupported" && test "x$ac_cv_prog_c_openmp" != "x"; then
206  m4_define([openmp_test_program],[dnl
207  #include <stdio.h>
208
209  extern unsigned int lcg_seed;
210  #pragma omp threadprivate(lcg_seed)
211  unsigned int lcg_seed;
212
213  unsigned function(unsigned a, unsigned b)
214  {
215	lcg_seed ^= b;
216	return ((a + b) ^ a ) + lcg_seed;
217  }
218
219  int main(int argc, char **argv)
220  {
221	int i;
222	int n1 = 0, n2 = argc;
223	unsigned checksum = 0;
224	int verbose = argv != NULL;
225	unsigned (*test_function)(unsigned, unsigned);
226	test_function = function;
227	#pragma omp parallel for reduction(+:checksum) default(none) \
228					shared(n1, n2, test_function, verbose)
229	for (i = n1; i < n2; i++)
230	{
231		unsigned crc = test_function (i, 0);
232		if (verbose)
233			printf ("%d: %08X\n", i, crc);
234		checksum += crc;
235	}
236	printf("%u\n", checksum);
237	return 0;
238  }
239  ])
240
241  PIXMAN_LINK_WITH_ENV(
242	[CFLAGS="$OPENMP_CFLAGS" LDFLAGS="$OPENMP_CFLAGS"],
243	[openmp_test_program],
244	[have_openmp=yes],
245	[have_openmp=no])
246  if test "x$have_openmp" = "xyes" ; then
247    AC_DEFINE(USE_OPENMP, 1, [use OpenMP in the test suite])
248  fi
249fi
250AC_SUBST(OPENMP_CFLAGS)
251
252dnl =========================================================================
253dnl -fvisibility stuff
254
255PIXMAN_CHECK_CFLAG([-fvisibility=hidden], [dnl
256#if defined(__GNUC__) && (__GNUC__ >= 4)
257#ifdef _WIN32
258#error Have -fvisibility but it is ignored and generates a warning
259#endif
260#else
261#error Need GCC 4.0 for visibility
262#endif
263])
264
265PIXMAN_CHECK_CFLAG([-xldscope=hidden], [dnl
266#if defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)
267#else
268#error Need Sun Studio 8 for visibility
269#endif
270])
271
272dnl ===========================================================================
273dnl Check for Loongson Multimedia Instructions
274
275if test "x$LS_CFLAGS" = "x" ; then
276    LS_CFLAGS="-mloongson-mmi"
277fi
278
279have_loongson_mmi=no
280AC_MSG_CHECKING(whether to use Loongson MMI assembler)
281
282xserver_save_CFLAGS=$CFLAGS
283CFLAGS=" $LS_CFLAGS $CFLAGS -I$srcdir"
284AC_LINK_IFELSE([AC_LANG_SOURCE([[
285#ifndef __mips_loongson_vector_rev
286#error "Loongson Multimedia Instructions are only available on Loongson"
287#endif
288#if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4))
289#error "Need GCC >= 4.4 for Loongson MMI compilation"
290#endif
291#include "pixman/loongson-mmintrin.h"
292int main () {
293    union {
294        __m64 v;
295        char c[8];
296    } a = { .c = {1, 2, 3, 4, 5, 6, 7, 8} };
297    int b = 4;
298    __m64 c = _mm_srli_pi16 (a.v, b);
299    return 0;
300}]])], have_loongson_mmi=yes)
301CFLAGS=$xserver_save_CFLAGS
302
303AC_ARG_ENABLE(loongson-mmi,
304   [AC_HELP_STRING([--disable-loongson-mmi],
305                   [disable Loongson MMI fast paths])],
306   [enable_loongson_mmi=$enableval], [enable_loongson_mmi=auto])
307
308if test $enable_loongson_mmi = no ; then
309   have_loongson_mmi=disabled
310fi
311
312if test $have_loongson_mmi = yes ; then
313   AC_DEFINE(USE_LOONGSON_MMI, 1, [use Loongson Multimedia Instructions])
314else
315   LS_CFLAGS=
316fi
317
318AC_MSG_RESULT($have_loongson_mmi)
319if test $enable_loongson_mmi = yes && test $have_loongson_mmi = no ; then
320   AC_MSG_ERROR([Loongson MMI not detected])
321fi
322
323AM_CONDITIONAL(USE_LOONGSON_MMI, test $have_loongson_mmi = yes)
324
325dnl ===========================================================================
326dnl Check for MMX
327
328if test "x$MMX_CFLAGS" = "x" ; then
329   if test "x$SUNCC" = "xyes"; then
330      # Sun Studio doesn't have an -xarch=mmx flag, so we have to use sse
331      # but if we're building 64-bit, mmx & sse support is on by default and
332      # -xarch=sse throws an error instead
333      if test "$AMD64_ABI" = "no" ; then
334         MMX_CFLAGS="-xarch=sse"
335      fi
336   else
337      MMX_CFLAGS="-mmmx -Winline"
338   fi
339fi
340
341have_mmx_intrinsics=no
342AC_MSG_CHECKING(whether to use MMX intrinsics)
343xserver_save_CFLAGS=$CFLAGS
344CFLAGS="$MMX_CFLAGS $CFLAGS"
345AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
346#if defined(__GNUC__) && (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4))
347#error "Need GCC >= 3.4 for MMX intrinsics"
348#endif
349#include <mmintrin.h>
350#include <stdint.h>
351
352/* Check support for block expressions */
353#define _mm_shuffle_pi16(A, N)						\
354    ({									\
355	__m64 ret;							\
356									\
357	/* Some versions of clang will choke on K */ 			\
358	asm ("pshufw %2, %1, %0\n\t"					\
359	     : "=y" (ret)						\
360	     : "y" (A), "K" ((const int8_t)N)				\
361	);								\
362									\
363	ret;								\
364    })
365
366int main () {
367    __m64 v = _mm_cvtsi32_si64 (1);
368    __m64 w;
369
370    w = _mm_shuffle_pi16(v, 5);
371
372    /* Some versions of clang will choke on this */
373    asm ("pmulhuw %1, %0\n\t"
374	: "+y" (w)
375	: "y" (v)
376    );
377
378    return _mm_cvtsi64_si32 (v);
379}]])], have_mmx_intrinsics=yes)
380CFLAGS=$xserver_save_CFLAGS
381
382AC_ARG_ENABLE(mmx,
383   [AC_HELP_STRING([--disable-mmx],
384                   [disable x86 MMX fast paths])],
385   [enable_mmx=$enableval], [enable_mmx=auto])
386
387if test $enable_mmx = no ; then
388   have_mmx_intrinsics=disabled
389fi
390
391if test $have_mmx_intrinsics = yes ; then
392   AC_DEFINE(USE_X86_MMX, 1, [use x86 MMX compiler intrinsics])
393else
394   MMX_CFLAGS=
395fi
396
397AC_MSG_RESULT($have_mmx_intrinsics)
398if test $enable_mmx = yes && test $have_mmx_intrinsics = no ; then
399   AC_MSG_ERROR([x86 MMX intrinsics not detected])
400fi
401
402AM_CONDITIONAL(USE_X86_MMX, test $have_mmx_intrinsics = yes)
403
404dnl ===========================================================================
405dnl Check for SSE2
406
407if test "x$SSE2_CFLAGS" = "x" ; then
408   if test "x$SUNCC" = "xyes"; then
409      # SSE2 is enabled by default in the Sun Studio 64-bit environment
410      if test "$AMD64_ABI" = "no" ; then
411         SSE2_CFLAGS="-xarch=sse2"
412      fi
413   else
414      SSE2_CFLAGS="-msse2 -Winline"
415   fi
416fi
417
418have_sse2_intrinsics=no
419AC_MSG_CHECKING(whether to use SSE2 intrinsics)
420xserver_save_CFLAGS=$CFLAGS
421CFLAGS="$SSE2_CFLAGS $CFLAGS"
422
423AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
424#if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2))
425#   if !defined(__amd64__) && !defined(__x86_64__)
426#      error "Need GCC >= 4.2 for SSE2 intrinsics on x86"
427#   endif
428#endif
429#include <mmintrin.h>
430#include <xmmintrin.h>
431#include <emmintrin.h>
432int param;
433int main () {
434    __m128i a = _mm_set1_epi32 (param), b = _mm_set1_epi32 (param + 1), c;
435	c = _mm_xor_si128 (a, b);
436    return _mm_cvtsi128_si32(c);
437}]])], have_sse2_intrinsics=yes)
438CFLAGS=$xserver_save_CFLAGS
439
440AC_ARG_ENABLE(sse2,
441   [AC_HELP_STRING([--disable-sse2],
442                   [disable SSE2 fast paths])],
443   [enable_sse2=$enableval], [enable_sse2=auto])
444
445if test $enable_sse2 = no ; then
446   have_sse2_intrinsics=disabled
447fi
448
449if test $have_sse2_intrinsics = yes ; then
450   AC_DEFINE(USE_SSE2, 1, [use SSE2 compiler intrinsics])
451fi
452
453AC_MSG_RESULT($have_sse2_intrinsics)
454if test $enable_sse2 = yes && test $have_sse2_intrinsics = no ; then
455   AC_MSG_ERROR([SSE2 intrinsics not detected])
456fi
457
458AM_CONDITIONAL(USE_SSE2, test $have_sse2_intrinsics = yes)
459
460dnl ===========================================================================
461dnl Check for SSSE3
462
463if test "x$SSSE3_CFLAGS" = "x" ; then
464    SSSE3_CFLAGS="-mssse3 -Winline"
465fi
466
467have_ssse3_intrinsics=no
468AC_MSG_CHECKING(whether to use SSSE3 intrinsics)
469xserver_save_CFLAGS=$CFLAGS
470CFLAGS="$SSSE3_CFLAGS $CFLAGS"
471
472AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
473#include <mmintrin.h>
474#include <xmmintrin.h>
475#include <emmintrin.h>
476#include <tmmintrin.h>
477int param;
478int main () {
479    __m128i a = _mm_set1_epi32 (param), b = _mm_set1_epi32 (param + 1), c;
480    c = _mm_maddubs_epi16 (a, b);
481    return _mm_cvtsi128_si32(c);
482}]])], have_ssse3_intrinsics=yes)
483CFLAGS=$xserver_save_CFLAGS
484
485AC_ARG_ENABLE(ssse3,
486   [AC_HELP_STRING([--disable-ssse3],
487                   [disable SSSE3 fast paths])],
488   [enable_ssse3=$enableval], [enable_ssse3=auto])
489
490if test $enable_ssse3 = no ; then
491   have_ssse3_intrinsics=disabled
492fi
493
494if test $have_ssse3_intrinsics = yes ; then
495   AC_DEFINE(USE_SSSE3, 1, [use SSSE3 compiler intrinsics])
496fi
497
498AC_MSG_RESULT($have_ssse3_intrinsics)
499if test $enable_ssse3 = yes && test $have_ssse3_intrinsics = no ; then
500   AC_MSG_ERROR([SSSE3 intrinsics not detected])
501fi
502
503AM_CONDITIONAL(USE_SSSE3, test $have_ssse3_intrinsics = yes)
504
505dnl ===========================================================================
506dnl Other special flags needed when building code using MMX or SSE instructions
507case $host_os in
508   solaris*)
509      # When building 32-bit binaries, apply a mapfile to ensure that the
510      # binaries aren't flagged as only able to run on MMX+SSE capable CPUs
511      # since they check at runtime before using those instructions.
512      # Not all linkers grok the mapfile format so we check for that first.
513      if test "$AMD64_ABI" = "no" ; then
514	 use_hwcap_mapfile=no
515	 AC_MSG_CHECKING(whether to use a hardware capability map file)
516	 hwcap_save_LDFLAGS="$LDFLAGS"
517	 HWCAP_LDFLAGS='-Wl,-M,$(srcdir)/solaris-hwcap.mapfile'
518	 LDFLAGS="$LDFLAGS -Wl,-M,pixman/solaris-hwcap.mapfile"
519	 AC_LINK_IFELSE([AC_LANG_SOURCE([[int main() { return 0; }]])],
520			use_hwcap_mapfile=yes,
521			HWCAP_LDFLAGS="")
522	 LDFLAGS="$hwcap_save_LDFLAGS"
523	 AC_MSG_RESULT($use_hwcap_mapfile)
524      fi
525      if test "x$MMX_LDFLAGS" = "x" ; then
526         MMX_LDFLAGS="$HWCAP_LDFLAGS"
527      fi
528      if test "x$SSE2_LDFLAGS" = "x" ; then
529	 SSE2_LDFLAGS="$HWCAP_LDFLAGS"
530      fi
531      ;;
532esac
533
534AC_SUBST(LS_CFLAGS)
535AC_SUBST(IWMMXT_CFLAGS)
536AC_SUBST(MMX_CFLAGS)
537AC_SUBST(MMX_LDFLAGS)
538AC_SUBST(SSE2_CFLAGS)
539AC_SUBST(SSE2_LDFLAGS)
540AC_SUBST(SSSE3_CFLAGS)
541
542dnl ===========================================================================
543dnl Check for VMX/Altivec
544if test -n "`$CC -v 2>&1 | grep version | grep Apple`"; then
545    VMX_CFLAGS="-faltivec"
546else
547    VMX_CFLAGS="-maltivec -mabi=altivec"
548fi
549
550have_vmx_intrinsics=no
551AC_MSG_CHECKING(whether to use VMX/Altivec intrinsics)
552xserver_save_CFLAGS=$CFLAGS
553CFLAGS="$VMX_CFLAGS $CFLAGS"
554AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
555#if defined(__GNUC__) && (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4))
556#error "Need GCC >= 3.4 for sane altivec support"
557#endif
558#include <altivec.h>
559int main () {
560    vector unsigned int v = vec_splat_u32 (1);
561    v = vec_sub (v, v);
562    return 0;
563}]])], have_vmx_intrinsics=yes)
564CFLAGS=$xserver_save_CFLAGS
565
566AC_ARG_ENABLE(vmx,
567   [AC_HELP_STRING([--disable-vmx],
568                   [disable VMX fast paths])],
569   [enable_vmx=$enableval], [enable_vmx=auto])
570
571if test $enable_vmx = no ; then
572   have_vmx_intrinsics=disabled
573fi
574
575if test $have_vmx_intrinsics = yes ; then
576   AC_DEFINE(USE_VMX, 1, [use VMX compiler intrinsics])
577else
578   VMX_CFLAGS=
579fi
580
581AC_MSG_RESULT($have_vmx_intrinsics)
582if test $enable_vmx = yes && test $have_vmx_intrinsics = no ; then
583   AC_MSG_ERROR([VMX intrinsics not detected])
584fi
585
586AC_SUBST(VMX_CFLAGS)
587
588AM_CONDITIONAL(USE_VMX, test $have_vmx_intrinsics = yes)
589
590dnl ==========================================================================
591dnl Check if assembler is gas compatible and supports ARM SIMD instructions
592have_arm_simd=no
593AC_MSG_CHECKING(whether to use ARM SIMD assembler)
594xserver_save_CFLAGS=$CFLAGS
595CFLAGS="-x assembler-with-cpp $CFLAGS"
596AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
597.text
598.arch armv6
599.object_arch armv4
600.arm
601.altmacro
602#ifndef __ARM_EABI__
603#error EABI is required (to be sure that calling conventions are compatible)
604#endif
605pld [r0]
606uqadd8 r0, r0, r0]])], have_arm_simd=yes)
607CFLAGS=$xserver_save_CFLAGS
608
609AC_ARG_ENABLE(arm-simd,
610   [AC_HELP_STRING([--disable-arm-simd],
611                   [disable ARM SIMD fast paths])],
612   [enable_arm_simd=$enableval], [enable_arm_simd=auto])
613
614if test $enable_arm_simd = no ; then
615   have_arm_simd=disabled
616fi
617
618if test $have_arm_simd = yes ; then
619   AC_DEFINE(USE_ARM_SIMD, 1, [use ARM SIMD assembly optimizations])
620fi
621
622AM_CONDITIONAL(USE_ARM_SIMD, test $have_arm_simd = yes)
623
624AC_MSG_RESULT($have_arm_simd)
625if test $enable_arm_simd = yes && test $have_arm_simd = no ; then
626   AC_MSG_ERROR([ARM SIMD intrinsics not detected])
627fi
628
629dnl ==========================================================================
630dnl Check if assembler is gas compatible and supports NEON instructions
631have_arm_neon=no
632AC_MSG_CHECKING(whether to use ARM NEON assembler)
633xserver_save_CFLAGS=$CFLAGS
634CFLAGS="-x assembler-with-cpp $CFLAGS"
635AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
636.text
637.fpu neon
638.arch armv7a
639.object_arch armv4
640.eabi_attribute 10, 0
641.arm
642.altmacro
643#ifndef __ARM_EABI__
644#error EABI is required (to be sure that calling conventions are compatible)
645#endif
646pld [r0]
647vmovn.u16 d0, q0]])], have_arm_neon=yes)
648CFLAGS=$xserver_save_CFLAGS
649
650AC_ARG_ENABLE(arm-neon,
651   [AC_HELP_STRING([--disable-arm-neon],
652                   [disable ARM NEON fast paths])],
653   [enable_arm_neon=$enableval], [enable_arm_neon=auto])
654
655if test $enable_arm_neon = no ; then
656   have_arm_neon=disabled
657fi
658
659if test $have_arm_neon = yes ; then
660   AC_DEFINE(USE_ARM_NEON, 1, [use ARM NEON assembly optimizations])
661fi
662
663AM_CONDITIONAL(USE_ARM_NEON, test $have_arm_neon = yes)
664
665AC_MSG_RESULT($have_arm_neon)
666if test $enable_arm_neon = yes && test $have_arm_neon = no ; then
667   AC_MSG_ERROR([ARM NEON intrinsics not detected])
668fi
669
670dnl ===========================================================================
671dnl Check for IWMMXT
672
673AC_ARG_ENABLE(arm-iwmmxt,
674   [AC_HELP_STRING([--disable-arm-iwmmxt],
675                   [disable ARM IWMMXT fast paths])],
676   [enable_iwmmxt=$enableval], [enable_iwmmxt=auto])
677
678AC_ARG_ENABLE(arm-iwmmxt2,
679   [AC_HELP_STRING([--disable-arm-iwmmxt2],
680                   [build ARM IWMMXT fast paths with -march=iwmmxt instead of -march=iwmmxt2])],
681   [enable_iwmmxt2=$enableval], [enable_iwmmxt2=auto])
682
683if test "x$IWMMXT_CFLAGS" = "x" ; then
684   IWMMXT_CFLAGS="-flax-vector-conversions -Winline -march=iwmmxt"
685   if test $enable_iwmmxt2 != no ; then
686      IWMMXT_CFLAGS="${IWMMXT_CFLAGS}2"
687   fi
688fi
689
690have_iwmmxt_intrinsics=no
691AC_MSG_CHECKING(whether to use ARM IWMMXT intrinsics)
692xserver_save_CFLAGS=$CFLAGS
693CFLAGS="$CFLAGS $IWMMXT_CFLAGS"
694AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
695#ifndef __arm__
696#error "IWMMXT is only available on ARM"
697#endif
698#ifndef __IWMMXT__
699#error "IWMMXT not enabled (with -march=iwmmxt)"
700#endif
701#if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8))
702#error "Need GCC >= 4.8 for IWMMXT intrinsics"
703#endif
704#include <mmintrin.h>
705int main () {
706	union {
707		__m64 v;
708		char c[8];
709	} a = { .c = {1, 2, 3, 4, 5, 6, 7, 8} };
710	int b = 4;
711	__m64 c = _mm_srli_si64 (a.v, b);
712}]])], have_iwmmxt_intrinsics=yes)
713CFLAGS=$xserver_save_CFLAGS
714
715if test $enable_iwmmxt = no ; then
716   have_iwmmxt_intrinsics=disabled
717fi
718
719if test $have_iwmmxt_intrinsics = yes ; then
720   AC_DEFINE(USE_ARM_IWMMXT, 1, [use ARM IWMMXT compiler intrinsics])
721else
722   IWMMXT_CFLAGS=
723fi
724
725AC_MSG_RESULT($have_iwmmxt_intrinsics)
726if test $enable_iwmmxt = yes && test $have_iwmmxt_intrinsics = no ; then
727   AC_MSG_ERROR([IWMMXT intrinsics not detected])
728fi
729
730AM_CONDITIONAL(USE_ARM_IWMMXT, test $have_iwmmxt_intrinsics = yes)
731
732dnl ==========================================================================
733dnl Check if assembler is gas compatible and supports MIPS DSPr2 instructions
734
735have_mips_dspr2=no
736AC_MSG_CHECKING(whether to use MIPS DSPr2 assembler)
737xserver_save_CFLAGS=$CFLAGS
738CFLAGS="-mdspr2 $CFLAGS"
739
740AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
741#if !(defined(__mips__) &&  __mips_isa_rev >= 2)
742#error MIPS DSPr2 is currently only available on MIPS32r2 platforms.
743#endif
744int
745main ()
746{
747    int c = 0, a = 0, b = 0;
748    __asm__ __volatile__ (
749        "precr.qb.ph %[c], %[a], %[b]          \n\t"
750        : [c] "=r" (c)
751        : [a] "r" (a), [b] "r" (b)
752    );
753    return c;
754}]])], have_mips_dspr2=yes)
755CFLAGS=$xserver_save_CFLAGS
756
757AC_ARG_ENABLE(mips-dspr2,
758   [AC_HELP_STRING([--disable-mips-dspr2],
759                   [disable MIPS DSPr2 fast paths])],
760   [enable_mips_dspr2=$enableval], [enable_mips_dspr2=auto])
761
762if test $enable_mips_dspr2 = no ; then
763   have_mips_dspr2=disabled
764fi
765
766if test $have_mips_dspr2 = yes ; then
767   AC_DEFINE(USE_MIPS_DSPR2, 1, [use MIPS DSPr2 assembly optimizations])
768fi
769
770AM_CONDITIONAL(USE_MIPS_DSPR2, test $have_mips_dspr2 = yes)
771
772AC_MSG_RESULT($have_mips_dspr2)
773if test $enable_mips_dspr2 = yes && test $have_mips_dspr2 = no ; then
774   AC_MSG_ERROR([MIPS DSPr2 instructions not detected])
775fi
776
777dnl =========================================================================================
778dnl Check for GNU-style inline assembly support
779
780have_gcc_inline_asm=no
781AC_MSG_CHECKING(whether to use GNU-style inline assembler)
782AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
783int main () {
784    /* Most modern architectures have a NOP instruction, so this is a fairly generic test. */
785	asm volatile ( "\tnop\n" : : : "cc", "memory" );
786    return 0;
787}]])], have_gcc_inline_asm=yes)
788
789AC_ARG_ENABLE(gcc-inline-asm,
790   [AC_HELP_STRING([--disable-gcc-inline-asm],
791                   [disable GNU-style inline assembler])],
792   [enable_gcc_inline_asm=$enableval], [enable_gcc_inline_asm=auto])
793
794if test $enable_gcc_inline_asm = no ; then
795   have_gcc_inline_asm=disabled
796fi
797
798if test $have_gcc_inline_asm = yes ; then
799   AC_DEFINE(USE_GCC_INLINE_ASM, 1, [use GNU-style inline assembler])
800fi
801
802AC_MSG_RESULT($have_gcc_inline_asm)
803if test $enable_gcc_inline_asm = yes && test $have_gcc_inline_asm = no ; then
804   AC_MSG_ERROR([GNU-style inline assembler not detected])
805fi
806
807AM_CONDITIONAL(USE_GCC_INLINE_ASM, test $have_gcc_inline_asm = yes)
808
809dnl ==============================================
810dnl Static test programs
811
812AC_ARG_ENABLE(static-testprogs,
813   [AC_HELP_STRING([--enable-static-testprogs],
814		   [build test programs as static binaries [default=no]])],
815   [enable_static_testprogs=$enableval], [enable_static_testprogs=no])
816
817TESTPROGS_EXTRA_LDFLAGS=
818if test "x$enable_static_testprogs" = "xyes" ; then
819   TESTPROGS_EXTRA_LDFLAGS="-all-static"
820fi
821AC_SUBST(TESTPROGS_EXTRA_LDFLAGS)
822
823dnl ==============================================
824dnl Timers
825
826AC_ARG_ENABLE(timers,
827   [AC_HELP_STRING([--enable-timers],
828		   [enable TIMER_BEGIN and TIMER_END macros [default=no]])],
829   [enable_timers=$enableval], [enable_timers=no])
830
831if test $enable_timers = yes ; then
832   AC_DEFINE(PIXMAN_TIMERS, 1, [enable TIMER_BEGIN/TIMER_END macros])
833fi
834AC_SUBST(PIXMAN_TIMERS)
835
836dnl ===================================
837dnl gnuplot
838
839AC_ARG_ENABLE(gnuplot,
840   [AC_HELP_STRING([--enable-gnuplot],
841                   [enable output of filters that can be piped to gnuplot [default=no]])],
842   [enable_gnuplot=$enableval], [enable_gnuplot=no])
843
844if test $enable_gnuplot = yes ; then
845   AC_DEFINE(PIXMAN_GNUPLOT, 1, [enable output that can be piped to gnuplot])
846fi
847AC_SUBST(PIXMAN_GNUPLOT)
848
849dnl ===================================
850dnl GTK+
851
852AC_ARG_ENABLE(gtk,
853   [AC_HELP_STRING([--enable-gtk],
854                   [enable tests using GTK+ [default=auto]])],
855   [enable_gtk=$enableval], [enable_gtk=auto])
856
857PKG_PROG_PKG_CONFIG
858
859if test $enable_gtk = yes ; then
860   AC_CHECK_LIB([pixman-1], [pixman_version_string])
861   PKG_CHECK_MODULES(GTK, [gtk+-2.0 >= 2.16 pixman-1])
862fi
863
864if test $enable_gtk = auto ; then
865   AC_CHECK_LIB([pixman-1], [pixman_version_string], [enable_gtk=auto], [enable_gtk=no])
866fi
867
868if test $enable_gtk = auto ; then
869   PKG_CHECK_MODULES(GTK, [gtk+-2.0 >= 2.16 pixman-1], [enable_gtk=yes], [enable_gtk=no])
870fi
871
872AM_CONDITIONAL(HAVE_GTK, [test "x$enable_gtk" = xyes])
873
874AC_SUBST(GTK_CFLAGS)
875AC_SUBST(GTK_LIBS)
876
877dnl =====================================
878dnl posix_memalign, sigaction, alarm, gettimeofday
879
880AC_CHECK_FUNC(posix_memalign, have_posix_memalign=yes, have_posix_memalign=no)
881if test x$have_posix_memalign = xyes; then
882   AC_DEFINE(HAVE_POSIX_MEMALIGN, 1, [Whether we have posix_memalign()])
883fi
884
885AC_CHECK_FUNC(sigaction, have_sigaction=yes, have_sigaction=no)
886if test x$have_sigaction = xyes; then
887   AC_DEFINE(HAVE_SIGACTION, 1, [Whether we have sigaction()])
888fi
889
890AC_CHECK_FUNC(alarm, have_alarm=yes, have_alarm=no)
891if test x$have_alarm = xyes; then
892   AC_DEFINE(HAVE_ALARM, 1, [Whether we have alarm()])
893fi
894
895AC_CHECK_HEADER([sys/mman.h],
896   [AC_DEFINE(HAVE_SYS_MMAN_H, [1], [Define to 1 if we have <sys/mman.h>])])
897
898AC_CHECK_FUNC(mmap, have_mmap=yes, have_mmap=no)
899if test x$have_mmap = xyes; then
900   AC_DEFINE(HAVE_MMAP, 1, [Whether we have mmap()])
901fi
902
903AC_CHECK_FUNC(mprotect, have_mprotect=yes, have_mprotect=no)
904if test x$have_mprotect = xyes; then
905   AC_DEFINE(HAVE_MPROTECT, 1, [Whether we have mprotect()])
906fi
907
908AC_CHECK_FUNC(getpagesize, have_getpagesize=yes, have_getpagesize=no)
909if test x$have_getpagesize = xyes; then
910   AC_DEFINE(HAVE_GETPAGESIZE, 1, [Whether we have getpagesize()])
911fi
912
913AC_CHECK_HEADER([fenv.h],
914   [AC_DEFINE(HAVE_FENV_H, [1], [Define to 1 if we have <fenv.h>])])
915
916AC_CHECK_LIB(m, feenableexcept, have_feenableexcept=yes, have_feenableexcept=no)
917if test x$have_feenableexcept = xyes; then
918   AC_DEFINE(HAVE_FEENABLEEXCEPT, 1, [Whether we have feenableexcept()])
919fi
920
921AC_CHECK_DECL([FE_DIVBYZERO],
922	[AC_DEFINE(HAVE_FEDIVBYZERO, 1, [Whether we have FE_DIVBYZERO])],
923	[],
924	[[#include <fenv.h>]])
925
926AC_CHECK_FUNC(gettimeofday, have_gettimeofday=yes, have_gettimeofday=no)
927AC_CHECK_HEADER(sys/time.h, have_sys_time_h=yes, have_sys_time_h=no)
928if test x$have_gettimeofday = xyes && test x$have_sys_time_h = xyes; then
929   AC_DEFINE(HAVE_GETTIMEOFDAY, 1, [Whether we have gettimeofday()])
930fi
931
932dnl =====================================
933dnl Check for missing sqrtf() as, e.g., for Solaris 9
934
935AC_SEARCH_LIBS([sqrtf], [m], [],
936               [AC_DEFINE([sqrtf], [sqrt],
937                          [Define to sqrt if you do not have the `sqrtf' function.])])
938
939dnl =====================================
940dnl Thread local storage
941
942AC_MSG_CHECKING(for thread local storage (TLS) support)
943AC_CACHE_VAL(ac_cv_tls, [
944    ac_cv_tls=none
945    keywords="__thread __declspec(thread)"
946    for kw in $keywords ; do
947        AC_TRY_COMPILE([
948#if defined(__MINGW32__) && !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))
949#error This MinGW version has broken __thread support
950#endif
951#ifdef __OpenBSD__
952#error OpenBSD has broken __thread support
953#endif
954
955int $kw test;], [], [ac_cv_tls=$kw; break])
956    done
957])
958AC_MSG_RESULT($ac_cv_tls)
959
960if test "$ac_cv_tls" != "none"; then
961    AC_DEFINE_UNQUOTED([TLS], $ac_cv_tls, [The compiler supported TLS storage class])
962fi
963
964dnl
965dnl posix tls
966dnl
967
968m4_define([pthread_test_program],AC_LANG_SOURCE([[dnl
969#include <stdlib.h>
970#include <pthread.h>
971
972static pthread_once_t once_control = PTHREAD_ONCE_INIT;
973static pthread_key_t key;
974
975static void
976make_key (void)
977{
978    pthread_key_create (&key, NULL);
979}
980
981int
982main ()
983{
984    void *value = NULL;
985
986    if (pthread_once (&once_control, make_key) != 0)
987    {
988	value = NULL;
989    }
990    else
991    {
992	value = pthread_getspecific (key);
993	if (!value)
994	{
995	    value = malloc (100);
996	    pthread_setspecific (key, value);
997	}
998    }
999    return 0;
1000}
1001]]))
1002
1003AC_DEFUN([PIXMAN_CHECK_PTHREAD],[dnl
1004    if test "z$support_for_pthreads" != "zyes"; then
1005	PIXMAN_LINK_WITH_ENV(
1006		[$1], [pthread_test_program],
1007		[PTHREAD_CFLAGS="$CFLAGS"
1008		 PTHREAD_LIBS="$LIBS"
1009		 PTHREAD_LDFLAGS="$LDFLAGS"
1010		 support_for_pthreads=yes])
1011    fi
1012])
1013
1014support_for_pthreads=no
1015
1016AC_MSG_CHECKING(for pthreads)
1017
1018PIXMAN_CHECK_PTHREAD([CFLAGS="-pthread"; LDFLAGS="-pthread"])
1019PIXMAN_CHECK_PTHREAD([CFLAGS="-D_REENTRANT"; LIBS="-lpthread"])
1020PIXMAN_CHECK_PTHREAD([CFLAGS="-D_REENTRANT"; LDFLAGS="-lroot"])
1021
1022if test $support_for_pthreads = yes; then
1023    AC_DEFINE([HAVE_PTHREADS], [], [Whether pthreads is supported])
1024    if test $ac_cv_tls = none ; then
1025        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
1026    fi
1027fi
1028
1029AC_MSG_RESULT($support_for_pthreads)
1030
1031AC_SUBST(TOOLCHAIN_SUPPORTS__THREAD)
1032AC_SUBST(HAVE_PTHREADS)
1033AC_SUBST(PTHREAD_LDFLAGS)
1034AC_SUBST(PTHREAD_LIBS)
1035AC_SUBST(PTHREAD_CFLAGS)
1036
1037dnl =====================================
1038dnl __attribute__((constructor))
1039
1040support_for_attribute_constructor=no
1041
1042AC_MSG_CHECKING(for __attribute__((constructor)))
1043AC_LINK_IFELSE([AC_LANG_SOURCE([[
1044#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7))
1045/* attribute 'constructor' is supported since gcc 2.7, but some compilers
1046 * may only pretend to be gcc, so let's try to actually use it
1047 */
1048static int x = 1;
1049static void __attribute__((constructor)) constructor_function () { x = 0; }
1050int main (void) { return x; }
1051#else
1052#error not gcc or gcc version is older than 2.7
1053#endif
1054]])], support_for_attribute_constructor=yes)
1055
1056if test x$support_for_attribute_constructor = xyes; then
1057   AC_DEFINE([TOOLCHAIN_SUPPORTS_ATTRIBUTE_CONSTRUCTOR],
1058             [],[Whether the tool chain supports __attribute__((constructor))])
1059fi
1060
1061AC_MSG_RESULT($support_for_attribute_constructor)
1062AC_SUBST(TOOLCHAIN_SUPPORTS_ATTRIBUTE_CONSTRUCTOR)
1063
1064dnl =====================================
1065dnl __float128
1066
1067support_for_float128=no
1068
1069AC_MSG_CHECKING(for __float128)
1070AC_LINK_IFELSE([AC_LANG_SOURCE([[
1071__float128 a = 1.0Q, b = 2.0Q; int main (void) { return a + b; }
1072]])], support_for_float128=yes)
1073
1074if test x$support_for_float128 = xyes; then
1075   AC_DEFINE([HAVE_FLOAT128], [], [Whether the tool chain supports __float128])
1076fi
1077
1078AC_MSG_RESULT($support_for_float128)
1079
1080dnl =====================================
1081dnl __builtin_clz
1082
1083support_for_builtin_clz=no
1084
1085AC_MSG_CHECKING(for __builtin_clz)
1086AC_LINK_IFELSE([AC_LANG_SOURCE([[
1087unsigned int x = 11; int main (void) { return __builtin_clz(x); }
1088]])], support_for_builtin_clz=yes)
1089
1090if test x$support_for_builtin_clz = xyes; then
1091   AC_DEFINE([HAVE_BUILTIN_CLZ], [], [Whether the compiler supports __builtin_clz])
1092fi
1093
1094AC_MSG_RESULT($support_for_builtin_clz)
1095
1096dnl =====================================
1097dnl GCC vector extensions
1098
1099support_for_gcc_vector_extensions=no
1100
1101AC_MSG_CHECKING(for GCC vector extensions)
1102AC_LINK_IFELSE([AC_LANG_SOURCE([[
1103unsigned int __attribute__ ((vector_size(16))) e, a, b;
1104int main (void) { e = a - ((b << 27) + (b >> (32 - 27))) + 1; return e[0]; }
1105]])], support_for_gcc_vector_extensions=yes)
1106
1107if test x$support_for_gcc_vector_extensions = xyes; then
1108   AC_DEFINE([HAVE_GCC_VECTOR_EXTENSIONS], [],
1109             [Whether the compiler supports GCC vector extensions])
1110fi
1111
1112AC_MSG_RESULT($support_for_gcc_vector_extensions)
1113
1114dnl ==================
1115dnl libpng
1116
1117AC_ARG_ENABLE(libpng, AS_HELP_STRING([--enable-libpng], [Build support for libpng (default: auto)]),
1118                      [have_libpng=$enableval], [have_libpng=auto])
1119
1120case x$have_libpng in
1121	xyes) PKG_CHECK_MODULES(PNG, [libpng]) ;;
1122	xno) ;;
1123	*) PKG_CHECK_MODULES(PNG, [libpng], have_libpng=yes, have_libpng=no) ;;
1124esac
1125
1126if test x$have_libpng = xyes; then
1127    AC_DEFINE([HAVE_LIBPNG], [1], [Whether we have libpng])
1128fi
1129
1130AC_SUBST(HAVE_LIBPNG)
1131
1132AC_OUTPUT([pixman-1.pc
1133           pixman-1-uninstalled.pc
1134           Makefile
1135	   pixman/Makefile
1136	   pixman/pixman-version.h
1137	   demos/Makefile
1138	   test/Makefile])
1139
1140m4_if(m4_eval(pixman_minor % 2), [1], [
1141   echo
1142   echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
1143   echo
1144   echo "      Thanks for testing this development snapshot of pixman. Please"
1145   echo "      report any problems you find, either by sending email to "
1146   echo
1147   echo "          pixman@lists.freedesktop.org"
1148   echo
1149   echo "      or by filing a bug at "
1150   echo
1151   echo "          https://bugs.freedesktop.org/enter_bug.cgi?product=pixman "
1152   echo
1153   echo "      If you are looking for a stable release of pixman, please note "
1154   echo "      that stable releases have _even_ minor version numbers. Ie., "
1155   echo "      pixman-0.]m4_eval(pixman_minor & ~1)[.x are stable releases, whereas pixman-$PIXMAN_VERSION_MAJOR.$PIXMAN_VERSION_MINOR.$PIXMAN_VERSION_MICRO is a "
1156   echo "      development snapshot that may contain bugs and experimental "
1157   echo "      features. "
1158   echo
1159   echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
1160   echo
1161])
1162