Revert "Disable MMX when Clang is being used."
[profile/ivi/pixman.git] / configure.ac
1 dnl  Copyright 2005 Red Hat, Inc.
2 dnl 
3 dnl  Permission to use, copy, modify, distribute, and sell this software and its
4 dnl  documentation for any purpose is hereby granted without fee, provided that
5 dnl  the above copyright notice appear in all copies and that both that
6 dnl  copyright notice and this permission notice appear in supporting
7 dnl  documentation, and that the name of Red Hat not be used in
8 dnl  advertising or publicity pertaining to distribution of the software without
9 dnl  specific, written prior permission.  Red Hat makes no
10 dnl  representations about the suitability of this software for any purpose.  It
11 dnl  is provided "as is" without express or implied warranty.
12 dnl 
13 dnl  RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
14 dnl  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
15 dnl  EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
16 dnl  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
17 dnl  DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 dnl  TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 dnl  PERFORMANCE OF THIS SOFTWARE.
20 dnl
21 dnl Process this file with autoconf to create configure.
22
23 AC_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
55 m4_define([pixman_major], 0)
56 m4_define([pixman_minor], 25)
57 m4_define([pixman_micro], 3)
58
59 m4_define([pixman_version],[pixman_major.pixman_minor.pixman_micro])
60
61 AC_INIT(pixman, pixman_version, [pixman@lists.freedesktop.org], pixman)
62 AM_INIT_AUTOMAKE([foreign dist-bzip2])
63
64 # Suppress verbose compile lines
65 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
66
67 AM_CONFIG_HEADER(config.h)
68
69 AC_CANONICAL_HOST
70
71 test_CFLAGS=${CFLAGS+set} # We may override autoconf default CFLAGS.
72
73 AC_PROG_CC
74 AM_PROG_AS
75 AC_PROG_LIBTOOL
76 AC_CHECK_FUNCS([getisax])
77 AC_C_BIGENDIAN
78 AC_C_INLINE
79
80 dnl PIXMAN_LINK_WITH_ENV(env-setup, program, true-action, false-action)
81 dnl
82 dnl Compiles and links the given program in the environment setup by env-setup
83 dnl and executes true-action on success and false-action on failure.
84 AC_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         AC_LINK_IFELSE(
93                 [AC_LANG_SOURCE([$2])],
94                 [pixman_cc_stderr=`test -f conftest.err && cat conftest.err`
95                  pixman_cc_flag=yes],
96                 [pixman_cc_stderr=`test -f conftest.err && cat conftest.err`
97                  pixman_cc_flag=no])
98
99         if test "x$pixman_cc_stderr" != "x"; then
100                 pixman_cc_flag=no
101         fi
102
103         if test "x$pixman_cc_flag" = "xyes"; then
104                 ifelse([$3], , :, [$3])
105         else
106                 ifelse([$4], , :, [$4])
107         fi
108         CFLAGS="$save_CFLAGS"
109         LDFLAGS="$save_LDFLAGS"
110         LIBS="$save_LIBS"
111 ])
112
113 dnl Find a -Werror for catching warnings.
114 WERROR=
115 for w in -Werror -errwarn; do
116     if test "z$WERROR" = "z"; then
117         AC_MSG_CHECKING([whether the compiler supports $w])
118         PIXMAN_LINK_WITH_ENV(
119                 [CFLAGS=$w],
120                 [int main(int c, char **v) { (void)c; (void)v; return 0; }],
121                 [WERROR=$w; yesno=yes], [yesno=no])
122         AC_MSG_RESULT($yesno)
123     fi
124 done
125
126 dnl PIXMAN_CHECK_CFLAG(flag, [program])
127 dnl  Adds flag to CFLAGS if the given program links without warnings or errors.
128 AC_DEFUN([PIXMAN_CHECK_CFLAG], [dnl
129         AC_MSG_CHECKING([whether the compiler supports $1])
130         PIXMAN_LINK_WITH_ENV(
131                 [CFLAGS="$WERROR $1"],
132                 [$2
133                  int main(int c, char **v) { (void)c; (void)v; return 0; }
134                 ],
135                 [_yesno=yes],
136                 [_yesno=no])
137         if test "x$_yesno" = xyes; then
138            CFLAGS="$CFLAGS $1"
139         fi
140         AC_MSG_RESULT($_yesno)
141 ])
142
143 AC_CHECK_SIZEOF(long)
144
145 # Checks for Sun Studio compilers
146 AC_CHECK_DECL([__SUNPRO_C], [SUNCC="yes"], [SUNCC="no"])
147 AC_CHECK_DECL([__amd64], [AMD64_ABI="yes"], [AMD64_ABI="no"])
148
149 # Default CFLAGS to -O -g rather than just the -g from AC_PROG_CC
150 # if we're using Sun Studio and neither the user nor a config.site
151 # has set CFLAGS.
152 if test $SUNCC = yes &&                 \
153    test "x$test_CFLAGS" = "x" &&        \
154    test "$CFLAGS" = "-g"
155 then
156   CFLAGS="-O -g"
157 fi
158
159
160 # We ignore pixman_major in the version here because the major version should
161 # always be encoded in the actual library name. Ie., the soname is:
162 #
163 #      pixman-$(pixman_major).0.minor.micro
164 #
165 m4_define([lt_current], [pixman_minor])
166 m4_define([lt_revision], [pixman_micro])
167 m4_define([lt_age], [pixman_minor])
168
169 LT_VERSION_INFO="lt_current:lt_revision:lt_age"
170
171 PIXMAN_VERSION_MAJOR=pixman_major()
172 AC_SUBST(PIXMAN_VERSION_MAJOR)
173 PIXMAN_VERSION_MINOR=pixman_minor()
174 AC_SUBST(PIXMAN_VERSION_MINOR)
175 PIXMAN_VERSION_MICRO=pixman_micro()
176 AC_SUBST(PIXMAN_VERSION_MICRO)
177
178 AC_SUBST(LT_VERSION_INFO)
179
180 # Check for dependencies
181
182 PIXMAN_CHECK_CFLAG([-Wall])
183 PIXMAN_CHECK_CFLAG([-fno-strict-aliasing])
184
185 AC_PATH_PROG(PERL, perl, no)
186 if test "x$PERL" = xno; then
187     AC_MSG_ERROR([Perl is required to build pixman.])
188 fi
189 AC_SUBST(PERL)
190
191 dnl =========================================================================
192 dnl OpenMP for the test suite?
193 dnl
194
195 # Check for OpenMP support only when autoconf support that (require autoconf >=2.62)
196 OPENMP_CFLAGS=
197 m4_ifdef([AC_OPENMP], [AC_OPENMP])
198
199 if test "x$enable_openmp" = "xyes" && test "x$ac_cv_prog_c_openmp" = "xunsupported" ; then
200   AC_MSG_WARN([OpenMP support requested but found unsupported])
201 fi
202
203 dnl May not fail to link without -Wall -Werror added
204 dnl So try to link only when openmp is supported
205 dnl ac_cv_prog_c_openmp is not defined when --disable-openmp is used
206 if test "x$ac_cv_prog_c_openmp" != "xunsupported" && test "x$ac_cv_prog_c_openmp" != "x"; then
207   m4_define([openmp_test_program],[dnl
208   #include <stdio.h>
209
210   extern unsigned int lcg_seed;
211   #pragma omp threadprivate(lcg_seed)
212   unsigned int lcg_seed;
213
214   unsigned function(unsigned a, unsigned b)
215   {
216         lcg_seed ^= b;
217         return ((a + b) ^ a ) + lcg_seed;
218   }
219
220   int main(int argc, char **argv)
221   {
222         int i;
223         int n1 = 0, n2 = argc;
224         unsigned checksum = 0;
225         int verbose = argv != NULL;
226         unsigned (*test_function)(unsigned, unsigned);
227         test_function = function;
228         #pragma omp parallel for reduction(+:checksum) default(none) \
229                                         shared(n1, n2, test_function, verbose)
230         for (i = n1; i < n2; i++)
231         {
232                 unsigned crc = test_function (i, 0);
233                 if (verbose)
234                         printf ("%d: %08X\n", i, crc);
235                 checksum += crc;
236         }
237         printf("%u\n", checksum);
238         return 0;
239   }
240   ])
241
242   PIXMAN_LINK_WITH_ENV(
243         [CFLAGS="$OPENMP_CFLAGS" LDFLAGS="$OPENMP_CFLAGS"],
244         [openmp_test_program],
245         [have_openmp=yes],
246         [have_openmp=no])
247   if test "x$have_openmp" = "xyes" ; then
248     AC_DEFINE(USE_OPENMP, 1, [use OpenMP in the test suite])
249   fi
250 fi
251 AC_SUBST(OPENMP_CFLAGS)
252
253 dnl =========================================================================
254 dnl -fvisibility stuff
255
256 PIXMAN_CHECK_CFLAG([-fvisibility=hidden], [dnl
257 #if defined(__GNUC__) && (__GNUC__ >= 4)
258 #ifdef _WIN32
259 #error Have -fvisibility but it is ignored and generates a warning
260 #endif
261 #else
262 #error Need GCC 4.0 for visibility
263 #endif
264 ])
265
266 PIXMAN_CHECK_CFLAG([-xldscope=hidden], [dnl
267 #if defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)
268 #else
269 #error Need Sun Studio 8 for visibility
270 #endif
271 ])
272
273 dnl ===========================================================================
274 dnl Check for MMX
275
276 if test "x$MMX_CFLAGS" = "x" ; then
277    if test "x$SUNCC" = "xyes"; then
278       # Sun Studio doesn't have an -xarch=mmx flag, so we have to use sse
279       # but if we're building 64-bit, mmx & sse support is on by default and
280       # -xarch=sse throws an error instead
281       if test "$AMD64_ABI" = "no" ; then
282          MMX_CFLAGS="-xarch=sse"
283       fi
284    else
285       MMX_CFLAGS="-mmmx -Winline"
286    fi
287 fi
288
289 have_mmx_intrinsics=no
290 AC_MSG_CHECKING(whether to use MMX intrinsics)
291 xserver_save_CFLAGS=$CFLAGS
292 CFLAGS="$MMX_CFLAGS $CFLAGS"
293 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
294 #if defined(__GNUC__) && (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4))
295 #error "Need GCC >= 3.4 for MMX intrinsics"
296 #endif
297 #include <mmintrin.h>
298 int main () {
299     __m64 v = _mm_cvtsi32_si64 (1);
300     return _mm_cvtsi64_si32 (v);
301 }]])], have_mmx_intrinsics=yes)
302 CFLAGS=$xserver_save_CFLAGS
303
304 AC_ARG_ENABLE(mmx,
305    [AC_HELP_STRING([--disable-mmx],
306                    [disable x86 MMX fast paths])],
307    [enable_mmx=$enableval], [enable_mmx=auto])
308
309 if test $enable_mmx = no ; then
310    have_mmx_intrinsics=disabled
311 fi
312
313 if test $have_mmx_intrinsics = yes ; then
314    AC_DEFINE(USE_X86_MMX, 1, [use x86 MMX compiler intrinsics])
315 else
316    MMX_CFLAGS=
317 fi
318
319 AC_MSG_RESULT($have_mmx_intrinsics)
320 if test $enable_mmx = yes && test $have_mmx_intrinsics = no ; then
321    AC_MSG_ERROR([x86 MMX intrinsics not detected])
322 fi
323
324 AM_CONDITIONAL(USE_X86_MMX, test $have_mmx_intrinsics = yes)
325
326 dnl ===========================================================================
327 dnl Check for SSE2
328
329 if test "x$SSE2_CFLAGS" = "x" ; then
330    if test "x$SUNCC" = "xyes"; then
331       # SSE2 is enabled by default in the Sun Studio 64-bit environment
332       if test "$AMD64_ABI" = "no" ; then
333          SSE2_CFLAGS="-xarch=sse2"
334       fi
335    else
336       SSE2_CFLAGS="-msse2 -Winline"
337    fi
338 fi
339
340 have_sse2_intrinsics=no
341 AC_MSG_CHECKING(whether to use SSE2 intrinsics)
342 xserver_save_CFLAGS=$CFLAGS
343 CFLAGS="$SSE2_CFLAGS $CFLAGS"
344
345 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
346 #if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2))
347 #   if !defined(__amd64__) && !defined(__x86_64__)
348 #      error "Need GCC >= 4.2 for SSE2 intrinsics on x86"
349 #   endif
350 #endif
351 #include <mmintrin.h>
352 #include <xmmintrin.h>
353 #include <emmintrin.h>
354 int main () {
355     __m128i a = _mm_set1_epi32 (0), b = _mm_set1_epi32 (0), c;
356         c = _mm_xor_si128 (a, b);
357     return 0;
358 }]])], have_sse2_intrinsics=yes)
359 CFLAGS=$xserver_save_CFLAGS
360
361 AC_ARG_ENABLE(sse2,
362    [AC_HELP_STRING([--disable-sse2],
363                    [disable SSE2 fast paths])],
364    [enable_sse2=$enableval], [enable_sse2=auto])
365
366 if test $enable_sse2 = no ; then
367    have_sse2_intrinsics=disabled
368 fi
369
370 if test $have_sse2_intrinsics = yes ; then
371    AC_DEFINE(USE_SSE2, 1, [use SSE2 compiler intrinsics])
372 fi
373
374 AC_MSG_RESULT($have_sse2_intrinsics)
375 if test $enable_sse2 = yes && test $have_sse2_intrinsics = no ; then
376    AC_MSG_ERROR([SSE2 intrinsics not detected])
377 fi
378
379 AM_CONDITIONAL(USE_SSE2, test $have_sse2_intrinsics = yes)
380
381 dnl ===========================================================================
382 dnl Other special flags needed when building code using MMX or SSE instructions
383 case $host_os in
384    solaris*)
385       # When building 32-bit binaries, apply a mapfile to ensure that the
386       # binaries aren't flagged as only able to run on MMX+SSE capable CPUs
387       # since they check at runtime before using those instructions.
388       # Not all linkers grok the mapfile format so we check for that first.
389       if test "$AMD64_ABI" = "no" ; then
390          use_hwcap_mapfile=no
391          AC_MSG_CHECKING(whether to use a hardware capability map file)
392          hwcap_save_LDFLAGS="$LDFLAGS"
393          HWCAP_LDFLAGS='-Wl,-M,$(srcdir)/solaris-hwcap.mapfile'
394          LDFLAGS="$LDFLAGS -Wl,-M,pixman/solaris-hwcap.mapfile"
395          AC_LINK_IFELSE([AC_LANG_SOURCE([[int main() { return 0; }]])],
396                         use_hwcap_mapfile=yes,
397                         HWCAP_LDFLAGS="")
398          LDFLAGS="$hwcap_save_LDFLAGS"
399          AC_MSG_RESULT($use_hwcap_mapfile)
400       fi
401       if test "x$MMX_LDFLAGS" = "x" ; then
402          MMX_LDFLAGS="$HWCAP_LDFLAGS"
403       fi
404       if test "x$SSE2_LDFLAGS" = "x" ; then
405          SSE2_LDFLAGS="$HWCAP_LDFLAGS"
406       fi
407       ;;
408 esac
409
410 AC_SUBST(IWMMXT_CFLAGS)
411 AC_SUBST(MMX_CFLAGS)
412 AC_SUBST(MMX_LDFLAGS)
413 AC_SUBST(SSE2_CFLAGS)
414 AC_SUBST(SSE2_LDFLAGS)
415
416 dnl ===========================================================================
417 dnl Check for VMX/Altivec
418 if test -n "`$CC -v 2>&1 | grep version | grep Apple`"; then
419     VMX_CFLAGS="-faltivec"
420 else
421     VMX_CFLAGS="-maltivec -mabi=altivec"
422 fi
423
424 have_vmx_intrinsics=no
425 AC_MSG_CHECKING(whether to use VMX/Altivec intrinsics)
426 xserver_save_CFLAGS=$CFLAGS
427 CFLAGS="$VMX_CFLAGS $CFLAGS"
428 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
429 #if defined(__GNUC__) && (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4))
430 #error "Need GCC >= 3.4 for sane altivec support"
431 #endif
432 #include <altivec.h>
433 int main () {
434     vector unsigned int v = vec_splat_u32 (1);
435     v = vec_sub (v, v);
436     return 0;
437 }]])], have_vmx_intrinsics=yes)
438 CFLAGS=$xserver_save_CFLAGS
439
440 AC_ARG_ENABLE(vmx,
441    [AC_HELP_STRING([--disable-vmx],
442                    [disable VMX fast paths])],
443    [enable_vmx=$enableval], [enable_vmx=auto])
444
445 if test $enable_vmx = no ; then
446    have_vmx_intrinsics=disabled
447 fi
448
449 if test $have_vmx_intrinsics = yes ; then
450    AC_DEFINE(USE_VMX, 1, [use VMX compiler intrinsics])
451 else
452    VMX_CFLAGS=
453 fi
454
455 AC_MSG_RESULT($have_vmx_intrinsics)
456 if test $enable_vmx = yes && test $have_vmx_intrinsics = no ; then
457    AC_MSG_ERROR([VMX intrinsics not detected])
458 fi
459
460 AC_SUBST(VMX_CFLAGS)
461
462 AM_CONDITIONAL(USE_VMX, test $have_vmx_intrinsics = yes)
463
464 dnl ==========================================================================
465 dnl Check if assembler is gas compatible and supports ARM SIMD instructions
466 have_arm_simd=no
467 AC_MSG_CHECKING(whether to use ARM SIMD assembler)
468 xserver_save_CFLAGS=$CFLAGS
469 CFLAGS="-x assembler-with-cpp $CFLAGS"
470 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
471 .text
472 .arch armv6
473 .object_arch armv4
474 .arm
475 .altmacro
476 #ifndef __ARM_EABI__
477 #error EABI is required (to be sure that calling conventions are compatible)
478 #endif
479 pld [r0]
480 uqadd8 r0, r0, r0]])], have_arm_simd=yes)
481 CFLAGS=$xserver_save_CFLAGS
482
483 AC_ARG_ENABLE(arm-simd,
484    [AC_HELP_STRING([--disable-arm-simd],
485                    [disable ARM SIMD fast paths])],
486    [enable_arm_simd=$enableval], [enable_arm_simd=auto])
487
488 if test $enable_arm_simd = no ; then
489    have_arm_simd=disabled
490 fi
491
492 if test $have_arm_simd = yes ; then
493    AC_DEFINE(USE_ARM_SIMD, 1, [use ARM SIMD assembly optimizations])
494 fi
495
496 AM_CONDITIONAL(USE_ARM_SIMD, test $have_arm_simd = yes)
497
498 AC_MSG_RESULT($have_arm_simd)
499 if test $enable_arm_simd = yes && test $have_arm_simd = no ; then
500    AC_MSG_ERROR([ARM SIMD intrinsics not detected])
501 fi
502
503 dnl ==========================================================================
504 dnl Check if assembler is gas compatible and supports NEON instructions
505 have_arm_neon=no
506 AC_MSG_CHECKING(whether to use ARM NEON assembler)
507 xserver_save_CFLAGS=$CFLAGS
508 CFLAGS="-x assembler-with-cpp $CFLAGS"
509 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
510 .text
511 .fpu neon
512 .arch armv7a
513 .object_arch armv4
514 .eabi_attribute 10, 0
515 .arm
516 .altmacro
517 #ifndef __ARM_EABI__
518 #error EABI is required (to be sure that calling conventions are compatible)
519 #endif
520 pld [r0]
521 vmovn.u16 d0, q0]])], have_arm_neon=yes)
522 CFLAGS=$xserver_save_CFLAGS
523
524 AC_ARG_ENABLE(arm-neon,
525    [AC_HELP_STRING([--disable-arm-neon],
526                    [disable ARM NEON fast paths])],
527    [enable_arm_neon=$enableval], [enable_arm_neon=auto])
528
529 if test $enable_arm_neon = no ; then
530    have_arm_neon=disabled
531 fi
532
533 if test $have_arm_neon = yes ; then
534    AC_DEFINE(USE_ARM_NEON, 1, [use ARM NEON assembly optimizations])
535 fi
536
537 AM_CONDITIONAL(USE_ARM_NEON, test $have_arm_neon = yes)
538
539 AC_MSG_RESULT($have_arm_neon)
540 if test $enable_arm_neon = yes && test $have_arm_neon = no ; then
541    AC_MSG_ERROR([ARM NEON intrinsics not detected])
542 fi
543
544 dnl ===========================================================================
545 dnl Check for IWMMXT
546
547 if test "x$IWMMXT_CFLAGS" = "x" ; then
548    IWMMXT_CFLAGS="-march=iwmmxt -flax-vector-conversions -Winline"
549 fi
550
551 have_iwmmxt_intrinsics=no
552 AC_MSG_CHECKING(whether to use ARM IWMMXT intrinsics)
553 xserver_save_CFLAGS=$CFLAGS
554 CFLAGS="$IWMMXT_CFLAGS $CFLAGS"
555 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
556 #ifndef __arm__
557 #error "IWMMXT is only available on ARM"
558 #endif
559 #if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6))
560 #error "Need GCC >= 4.6 for IWMMXT intrinsics"
561 #endif
562 #include <mmintrin.h>
563 int main () {
564         union {
565                 __m64 v;
566                 char c[8];
567         } a = { .c = {1, 2, 3, 4, 5, 6, 7, 8} };
568         int b = 4;
569         __m64 c = _mm_srli_si64 (a.v, b);
570 }]])], have_iwmmxt_intrinsics=yes)
571 CFLAGS=$xserver_save_CFLAGS
572
573 AC_ARG_ENABLE(arm-iwmmxt,
574    [AC_HELP_STRING([--disable-arm-iwmmxt],
575                    [disable ARM IWMMXT fast paths])],
576    [enable_iwmmxt=$enableval], [enable_iwmmxt=auto])
577
578 if test $enable_iwmmxt = no ; then
579    have_iwmmxt_intrinsics=disabled
580 fi
581
582 if test $have_iwmmxt_intrinsics = yes ; then
583    AC_DEFINE(USE_ARM_IWMMXT, 1, [use ARM IWMMXT compiler intrinsics])
584 else
585    IWMMXT_CFLAGS=
586 fi
587
588 AC_MSG_RESULT($have_iwmmxt_intrinsics)
589 if test $enable_iwmmxt = yes && test $have_iwmmxt_intrinsics = no ; then
590    AC_MSG_ERROR([IWMMXT intrinsics not detected])
591 fi
592
593 AM_CONDITIONAL(USE_ARM_IWMMXT, test $have_iwmmxt_intrinsics = yes)
594
595 dnl ==========================================================================
596 dnl Check if assembler is gas compatible and supports MIPS DSPr2 instructions
597
598 have_mips_dspr2=no
599 AC_MSG_CHECKING(whether to use MIPS DSPr2 assembler)
600 xserver_save_CFLAGS=$CFLAGS
601 CFLAGS="-mdspr2 $CFLAGS"
602
603 AC_COMPILE_IFELSE([[
604 #if !(defined(__mips__) &&  __mips_isa_rev >= 2)
605 #error MIPS DSPr2 is currently only available on MIPS32r2 platforms.
606 #endif
607 int
608 main ()
609 {
610     int c = 0, a = 0, b = 0;
611     __asm__ __volatile__ (
612         "precr.qb.ph %[c], %[a], %[b]          \n\t"
613         : [c] "=r" (c)
614         : [a] "r" (a), [b] "r" (b)
615     );
616     return c;
617 }]], have_mips_dspr2=yes)
618 CFLAGS=$xserver_save_CFLAGS
619
620 AC_ARG_ENABLE(mips-dspr2,
621    [AC_HELP_STRING([--disable-mips-dspr2],
622                    [disable MIPS DSPr2 fast paths])],
623    [enable_mips_dspr2=$enableval], [enable_mips_dspr2=auto])
624
625 if test $enable_mips_dspr2 = no ; then
626    have_mips_dspr2=disabled
627 fi
628
629 if test $have_mips_dspr2 = yes ; then
630    AC_DEFINE(USE_MIPS_DSPR2, 1, [use MIPS DSPr2 assembly optimizations])
631 fi
632
633 AM_CONDITIONAL(USE_MIPS_DSPR2, test $have_mips_dspr2 = yes)
634
635 AC_MSG_RESULT($have_mips_dspr2)
636 if test $enable_mips_dspr2 = yes && test $have_mips_dspr2 = no ; then
637    AC_MSG_ERROR([MIPS DSPr2 instructions not detected])
638 fi
639
640 dnl =========================================================================================
641 dnl Check for GNU-style inline assembly support
642
643 have_gcc_inline_asm=no
644 AC_MSG_CHECKING(whether to use GNU-style inline assembler)
645 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
646 int main () {
647     /* Most modern architectures have a NOP instruction, so this is a fairly generic test. */
648         asm volatile ( "\tnop\n" : : : "cc", "memory" );
649     return 0;
650 }]])], have_gcc_inline_asm=yes)
651
652 AC_ARG_ENABLE(gcc-inline-asm,
653    [AC_HELP_STRING([--disable-gcc-inline-asm],
654                    [disable GNU-style inline assembler])],
655    [enable_gcc_inline_asm=$enableval], [enable_gcc_inline_asm=auto])
656
657 if test $enable_gcc_inline_asm = no ; then
658    have_gcc_inline_asm=disabled
659 fi
660
661 if test $have_gcc_inline_asm = yes ; then
662    AC_DEFINE(USE_GCC_INLINE_ASM, 1, [use GNU-style inline assembler])
663 fi
664
665 AC_MSG_RESULT($have_gcc_inline_asm)
666 if test $enable_gcc_inline_asm = yes && test $have_gcc_inline_asm = no ; then
667    AC_MSG_ERROR([GNU-style inline assembler not detected])
668 fi
669
670 AM_CONDITIONAL(USE_GCC_INLINE_ASM, test $have_gcc_inline_asm = yes)
671
672 dnl ==============================================
673 dnl Static test programs
674
675 AC_ARG_ENABLE(static-testprogs,
676    [AC_HELP_STRING([--enable-static-testprogs],
677                    [build test programs as static binaries [default=no]])],
678    [enable_static_testprogs=$enableval], [enable_static_testprogs=no])
679
680 TESTPROGS_EXTRA_LDFLAGS=
681 if test "x$enable_static_testprogs" = "xyes" ; then
682    TESTPROGS_EXTRA_LDFLAGS="-all-static"
683 fi
684 AC_SUBST(TESTPROGS_EXTRA_LDFLAGS)
685
686 dnl ==============================================
687 dnl Timers
688
689 AC_ARG_ENABLE(timers,
690    [AC_HELP_STRING([--enable-timers],
691                    [enable TIMER_BEGIN and TIMER_END macros [default=no]])],
692    [enable_timers=$enableval], [enable_timers=no])
693
694 if test $enable_timers = yes ; then 
695    AC_DEFINE(PIXMAN_TIMERS, 1, [enable TIMER_BEGIN/TIMER_END macros])
696 fi
697 AC_SUBST(PIXMAN_TIMERS)
698
699 dnl ===================================
700 dnl GTK+
701
702 AC_ARG_ENABLE(gtk,
703    [AC_HELP_STRING([--enable-gtk],
704                    [enable tests using GTK+ [default=auto]])],
705    [enable_gtk=$enableval], [enable_gtk=auto])
706
707 PKG_PROG_PKG_CONFIG
708
709 if test $enable_gtk = yes ; then
710    AC_CHECK_LIB([pixman-1], [pixman_version_string])
711    PKG_CHECK_MODULES(GTK, [gtk+-2.0 pixman-1])
712 fi
713
714 if test $enable_gtk = auto ; then
715    AC_CHECK_LIB([pixman-1], [pixman_version_string], [enable_gtk=auto], [enable_gtk=no])
716 fi
717
718 if test $enable_gtk = auto ; then
719    PKG_CHECK_MODULES(GTK, [gtk+-2.0 pixman-1], [enable_gtk=yes], [enable_gtk=no])
720 fi
721
722 AM_CONDITIONAL(HAVE_GTK, [test "x$enable_gtk" = xyes])
723
724 AC_SUBST(GTK_CFLAGS)
725 AC_SUBST(GTK_LIBS)
726 AC_SUBST(DEP_CFLAGS)
727 AC_SUBST(DEP_LIBS)
728
729 dnl =====================================
730 dnl posix_memalign, sigaction, alarm, gettimeofday
731
732 AC_CHECK_FUNC(posix_memalign, have_posix_memalign=yes, have_posix_memalign=no)
733 if test x$have_posix_memalign = xyes; then
734    AC_DEFINE(HAVE_POSIX_MEMALIGN, 1, [Whether we have posix_memalign()])
735 fi
736
737 AC_CHECK_FUNC(sigaction, have_sigaction=yes, have_sigaction=no)
738 if test x$have_sigaction = xyes; then
739    AC_DEFINE(HAVE_SIGACTION, 1, [Whether we have sigaction()])
740 fi
741
742 AC_CHECK_FUNC(alarm, have_alarm=yes, have_alarm=no)
743 if test x$have_alarm = xyes; then
744    AC_DEFINE(HAVE_ALARM, 1, [Whether we have alarm()])
745 fi
746
747 AC_CHECK_HEADER([sys/mman.h],
748    [AC_DEFINE(HAVE_SYS_MMAN_H, [1], [Define to 1 if we have <sys/mman.h>])])
749
750 AC_CHECK_FUNC(mmap, have_mmap=yes, have_mmap=no)
751 if test x$have_mmap = xyes; then
752    AC_DEFINE(HAVE_MMAP, 1, [Whether we have mmap()])
753 fi
754
755 AC_CHECK_FUNC(mprotect, have_mprotect=yes, have_mprotect=no)
756 if test x$have_mprotect = xyes; then
757    AC_DEFINE(HAVE_MPROTECT, 1, [Whether we have mprotect()])
758 fi
759
760 AC_CHECK_FUNC(getpagesize, have_getpagesize=yes, have_getpagesize=no)
761 if test x$have_getpagesize = xyes; then
762    AC_DEFINE(HAVE_GETPAGESIZE, 1, [Whether we have getpagesize()])
763 fi
764
765 AC_CHECK_HEADER([fenv.h],
766    [AC_DEFINE(HAVE_FENV_H, [1], [Define to 1 if we have <fenv.h>])])
767
768 AC_CHECK_LIB(m, feenableexcept, have_feenableexcept=yes, have_feenableexcept=no)
769 if test x$have_feenableexcept = xyes; then
770    AC_DEFINE(HAVE_FEENABLEEXCEPT, 1, [Whether we have feenableexcept()])
771 fi
772
773 AC_CHECK_FUNC(gettimeofday, have_gettimeofday=yes, have_gettimeofday=no)
774 AC_CHECK_HEADER(sys/time.h, have_sys_time_h=yes, have_sys_time_h=no)
775 if test x$have_gettimeofday = xyes && test x$have_sys_time_h = xyes; then
776    AC_DEFINE(HAVE_GETTIMEOFDAY, 1, [Whether we have gettimeofday()])
777 fi
778
779 dnl =====================================
780 dnl Thread local storage
781
782 support_for__thread=no
783
784 AC_MSG_CHECKING(for __thread)
785 AC_LINK_IFELSE([AC_LANG_SOURCE([[
786 #if defined(__MINGW32__) && !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))
787 #error This MinGW version has broken __thread support
788 #endif
789 #ifdef __OpenBSD__
790 #error OpenBSD has broken __thread support
791 #endif
792 static __thread int x ;
793 int main () { x = 123; return x; }
794 ]])], support_for__thread=yes)
795
796 if test $support_for__thread = yes; then 
797    AC_DEFINE([TOOLCHAIN_SUPPORTS__THREAD],[],[Whether the tool chain supports __thread])
798 fi
799
800 AC_MSG_RESULT($support_for__thread)
801
802 dnl
803 dnl posix tls
804 dnl
805
806 m4_define([pthread_test_program],AC_LANG_SOURCE([[dnl
807 #include <stdlib.h>
808 #include <pthread.h>
809
810 static pthread_once_t once_control = PTHREAD_ONCE_INIT;
811 static pthread_key_t key;
812
813 static void
814 make_key (void)
815 {
816     pthread_key_create (&key, NULL);
817 }
818
819 int
820 main ()
821 {
822     void *value = NULL;
823
824     if (pthread_once (&once_control, make_key) != 0)
825     {
826         value = NULL;
827     }
828     else
829     {
830         value = pthread_getspecific (key);
831         if (!value)
832         {
833             value = malloc (100);
834             pthread_setspecific (key, value);
835         }
836     }
837     return 0;
838 }
839 ]]))
840
841 AC_DEFUN([PIXMAN_CHECK_PTHREAD],[dnl
842     if test "z$support_for_pthread_setspecific" != "zyes"; then
843         PIXMAN_LINK_WITH_ENV(
844                 [$1], [pthread_test_program],
845                 [PTHREAD_CFLAGS="$CFLAGS"
846                  PTHREAD_LIBS="$LIBS"
847                  PTHREAD_LDFLAGS="$LDFLAGS"
848                  support_for_pthread_setspecific=yes])
849     fi
850 ])
851
852 if test $support_for__thread = no; then
853     support_for_pthread_setspecific=no
854
855     AC_MSG_CHECKING(for pthread_setspecific)
856
857     PIXMAN_CHECK_PTHREAD([CFLAGS="-D_REENTRANT"; LIBS="-lpthread"])
858     PIXMAN_CHECK_PTHREAD([CFLAGS="-pthread"; LDFLAGS="-pthread"])
859     PIXMAN_CHECK_PTHREAD([CFLAGS="-D_REENTRANT"; LDFLAGS="-lroot"])
860     
861     if test $support_for_pthread_setspecific = yes; then
862         CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
863         AC_DEFINE([HAVE_PTHREAD_SETSPECIFIC], [], [Whether pthread_setspecific() is supported])
864     fi
865
866     AC_MSG_RESULT($support_for_pthread_setspecific);
867 fi
868
869 AC_SUBST(TOOLCHAIN_SUPPORTS__THREAD)
870 AC_SUBST(HAVE_PTHREAD_SETSPECIFIC)
871 AC_SUBST(PTHREAD_LDFLAGS)
872 AC_SUBST(PTHREAD_LIBS)
873
874 dnl =====================================
875 dnl __attribute__((constructor))
876
877 support_for_attribute_constructor=no
878
879 AC_MSG_CHECKING(for __attribute__((constructor)))
880 AC_LINK_IFELSE([AC_LANG_SOURCE([[
881 #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7))
882 /* attribute 'constructor' is supported since gcc 2.7, but some compilers
883  * may only pretend to be gcc, so let's try to actually use it
884  */
885 static int x = 1;
886 static void __attribute__((constructor)) constructor_function () { x = 0; }
887 int main (void) { return x; }
888 #else
889 #error not gcc or gcc version is older than 2.7
890 #endif
891 ]])], support_for_attribute_constructor=yes)
892
893 if test x$support_for_attribute_constructor = xyes; then
894    AC_DEFINE([TOOLCHAIN_SUPPORTS_ATTRIBUTE_CONSTRUCTOR],
895              [],[Whether the tool chain supports __attribute__((constructor))])
896 fi
897
898 AC_MSG_RESULT($support_for_attribute_constructor)
899 AC_SUBST(TOOLCHAIN_SUPPORTS_ATTRIBUTE_CONSTRUCTOR)
900
901 dnl ==================
902 dnl libpng
903
904 AC_ARG_ENABLE(libpng, AS_HELP_STRING([--enable-libpng], [Build support for libpng (default: auto)]),
905                       [have_libpng=$enableval], [have_libpng=auto])
906
907 case x$have_libpng in
908         xyes) PKG_CHECK_MODULES(PNG, [libpng]) ;;
909         xno) ;;
910         *) PKG_CHECK_MODULES(PNG, [libpng], have_libpng=yes, have_libpng=no) ;;
911 esac
912
913 if test x$have_libpng = xyes; then
914     AC_DEFINE([HAVE_LIBPNG], [1], [Whether we have libpng])
915 fi
916
917 AC_SUBST(HAVE_LIBPNG)
918
919 AC_OUTPUT([pixman-1.pc
920            pixman-1-uninstalled.pc
921            Makefile
922            pixman/Makefile
923            pixman/pixman-version.h
924            demos/Makefile
925            test/Makefile])
926
927 m4_if(m4_eval(pixman_minor % 2), [1], [
928    echo
929    echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
930    echo
931    echo "      Thanks for testing this development snapshot of pixman. Please"
932    echo "      report any problems you find, either by sending email to "
933    echo
934    echo "          pixman@lists.freedesktop.org"
935    echo
936    echo "      or by filing a bug at "
937    echo
938    echo "          https://bugs.freedesktop.org/enter_bug.cgi?product=pixman "
939    echo
940    echo "      If you are looking for a stable release of pixman, please note "
941    echo "      that stable releases have _even_ minor version numbers. Ie., "
942    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 "
943    echo "      development snapshot that may contain bugs and experimental "
944    echo "      features. "
945    echo 
946    echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
947    echo
948 ])