1 dnl Copyright 2005 Red Hat, Inc.
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.
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.
21 dnl Process this file with autoconf to create configure.
25 # Pixman versioning scheme
27 # - The version in git has an odd MICRO version number
29 # - Released versions both development and stable have an even MICRO
32 # - Released development versions have an odd MINOR number
34 # - Released stable versions have an even MINOR number
36 # - Versions that break ABI must have a new MAJOR number
38 # - If you break the ABI, then at least this must be done:
42 # - In the first development release where you break ABI, find
43 # all instances of "pixman-n" and change them to pixman-(n+1)
45 # This needs to be done at least in
50 # This ensures that binary incompatible versions can be installed
51 # in parallel. See http://www106.pair.com/rhp/parallel.html for
55 m4_define([pixman_major], 0)
56 m4_define([pixman_minor], 19)
57 m4_define([pixman_micro], 3)
59 m4_define([pixman_version],[pixman_major.pixman_minor.pixman_micro])
61 AC_INIT(pixman, pixman_version, "pixman@lists.freedesktop.org", pixman)
62 AM_INIT_AUTOMAKE([foreign dist-bzip2])
64 # Suppress verbose compile lines
65 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
67 AM_CONFIG_HEADER(config.h)
71 test_CFLAGS=${CFLAGS+set} # We may override autoconf default CFLAGS.
76 AC_CHECK_FUNCS([getisax])
80 dnl PIXMAN_LINK_WITH_ENV(env-setup, program, true-action, false-action)
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
86 save_LDFLAGS="$LDFLAGS"
94 [pixman_cc_stderr=`test -f conftest.err && cat conftest.err`
96 [pixman_cc_stderr=`test -f conftest.err && cat conftest.err`
99 if test "x$pixman_cc_stderr" != "x"; then
103 if test "x$pixman_cc_flag" = "xyes"; then
104 ifelse([$3], , :, [$3])
106 ifelse([$4], , :, [$4])
108 CFLAGS="$save_CFLAGS"
109 LDFLAGS="$save_LDFLAGS"
113 dnl Find a -Werror for catching warnings.
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(
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)
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"],
133 int main(int c, char **v) { (void)c; (void)v; return 0; }
137 if test "x$_yesno" = xyes; then
140 AC_MSG_RESULT($_yesno)
143 AC_CHECK_SIZEOF(long)
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"])
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
152 if test $SUNCC = yes && \
153 test "$test_CFLAGS" == "" && \
154 test "$CFLAGS" = "-g"
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:
163 # pixman-$(pixman_major).0.minor.micro
165 m4_define([lt_current], [pixman_minor])
166 m4_define([lt_revision], [pixman_micro])
167 m4_define([lt_age], [pixman_minor])
169 LT_VERSION_INFO="lt_current:lt_revision:lt_age"
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)
178 AC_SUBST(LT_VERSION_INFO)
180 # Check for dependencies
182 PIXMAN_CHECK_CFLAG([-Wall])
183 PIXMAN_CHECK_CFLAG([-fno-strict-aliasing])
185 AC_PATH_PROG(PERL, perl, no)
186 if test "x$PERL" = xno; then
187 AC_MSG_ERROR([Perl is required to build pixman.])
191 dnl =========================================================================
192 dnl OpenMP for the test suite?
195 # Check for OpenMP support (only supported by autoconf >=2.62)
197 m4_ifdef([AC_OPENMP], [AC_OPENMP])
199 m4_define([openmp_test_program],[dnl
202 extern unsigned int lcg_seed;
203 #pragma omp threadprivate(lcg_seed)
204 unsigned int lcg_seed;
206 unsigned function(unsigned a, unsigned b)
209 return ((a + b) ^ a ) + lcg_seed;
212 int main(int argc, char **argv)
215 int n1 = 0, n2 = argc;
216 unsigned checksum = 0;
217 int verbose = argv != NULL;
218 unsigned (*test_function)(unsigned, unsigned);
219 test_function = function;
220 #pragma omp parallel for reduction(+:checksum) default(none) \
221 shared(n1, n2, test_function, verbose)
222 for (i = n1; i < n2; i++)
224 unsigned crc = test_function (i, 0);
226 printf ("%d: %08X\n", i, crc);
229 printf("%u\n", checksum);
234 PIXMAN_LINK_WITH_ENV(
235 [CFLAGS="$OPENMP_CFLAGS" LDFLAGS="$OPENMP_CFLAGS"],
236 [openmp_test_program],
239 if test "x$have_openmp" = "xyes"; then
240 AC_DEFINE(USE_OPENMP, 1, [use OpenMP in the test suite])
244 AC_SUBST(OPENMP_CFLAGS)
246 dnl =========================================================================
247 dnl -fvisibility stuff
249 PIXMAN_CHECK_CFLAG([-fvisibility=hidden], [dnl
250 #if defined(__GNUC__) && (__GNUC__ >= 4)
252 error Need GCC 4.0 for visibility
256 PIXMAN_CHECK_CFLAG([-xldscope=hidden], [dnl
257 #if defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)
259 error Need Sun Studio 8 for visibility
263 dnl ===========================================================================
266 if test "x$MMX_CFLAGS" = "x" ; then
267 if test "x$SUNCC" = "xyes"; then
268 # Sun Studio doesn't have an -xarch=mmx flag, so we have to use sse
269 # but if we're building 64-bit, mmx & sse support is on by default and
270 # -xarch=sse throws an error instead
271 if test "$AMD64_ABI" = "no" ; then
272 MMX_CFLAGS="-xarch=sse"
275 MMX_CFLAGS="-mmmx -Winline"
279 have_mmx_intrinsics=no
280 AC_MSG_CHECKING(whether to use MMX intrinsics)
281 xserver_save_CFLAGS=$CFLAGS
282 CFLAGS="$MMX_CFLAGS $CFLAGS"
284 #if defined(__GNUC__) && (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4))
285 error "Need GCC >= 3.4 for MMX intrinsics"
287 #include <mmintrin.h>
289 __m64 v = _mm_cvtsi32_si64 (1);
290 return _mm_cvtsi64_si32 (v);
291 }], have_mmx_intrinsics=yes)
292 CFLAGS=$xserver_save_CFLAGS
295 [AC_HELP_STRING([--disable-mmx],
296 [disable MMX fast paths])],
297 [enable_mmx=$enableval], [enable_mmx=auto])
299 if test $enable_mmx = no ; then
300 have_mmx_intrinsics=disabled
303 if test $have_mmx_intrinsics = yes ; then
304 AC_DEFINE(USE_MMX, 1, [use MMX compiler intrinsics])
309 AC_MSG_RESULT($have_mmx_intrinsics)
310 if test $enable_mmx = yes && test $have_mmx_intrinsics = no ; then
311 AC_MSG_ERROR([MMX intrinsics not detected])
314 AM_CONDITIONAL(USE_MMX, test $have_mmx_intrinsics = yes)
316 dnl ===========================================================================
319 if test "x$SSE2_CFLAGS" = "x" ; then
320 if test "x$SUNCC" = "xyes"; then
321 # SSE2 is enabled by default in the Sun Studio 64-bit environment
322 if test "$AMD64_ABI" = "no" ; then
323 SSE2_CFLAGS="-xarch=sse2"
326 SSE2_CFLAGS="-mmmx -msse2 -Winline"
330 have_sse2_intrinsics=no
331 AC_MSG_CHECKING(whether to use SSE2 intrinsics)
332 xserver_save_CFLAGS=$CFLAGS
333 CFLAGS="$SSE2_CFLAGS $CFLAGS"
336 #if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2))
337 # if !defined(__amd64__) && !defined(__x86_64__)
338 # error "Need GCC >= 4.2 for SSE2 intrinsics on x86"
341 #include <mmintrin.h>
342 #include <xmmintrin.h>
343 #include <emmintrin.h>
345 __m128i a = _mm_set1_epi32 (0), b = _mm_set1_epi32 (0), c;
346 c = _mm_xor_si128 (a, b);
348 }], have_sse2_intrinsics=yes)
349 CFLAGS=$xserver_save_CFLAGS
352 [AC_HELP_STRING([--disable-sse2],
353 [disable SSE2 fast paths])],
354 [enable_sse2=$enableval], [enable_sse2=auto])
356 if test $enable_sse2 = no ; then
357 have_sse2_intrinsics=disabled
360 if test $have_sse2_intrinsics = yes ; then
361 AC_DEFINE(USE_SSE2, 1, [use SSE2 compiler intrinsics])
364 AC_MSG_RESULT($have_sse2_intrinsics)
365 if test $enable_sse2 = yes && test $have_sse2_intrinsics = no ; then
366 AC_MSG_ERROR([SSE2 intrinsics not detected])
369 AM_CONDITIONAL(USE_SSE2, test $have_sse2_intrinsics = yes)
371 dnl ===========================================================================
372 dnl Other special flags needed when building code using MMX or SSE instructions
375 # When building 32-bit binaries, apply a mapfile to ensure that the
376 # binaries aren't flagged as only able to run on MMX+SSE capable CPUs
377 # since they check at runtime before using those instructions.
378 # Not all linkers grok the mapfile format so we check for that first.
379 if test "$AMD64_ABI" = "no" ; then
381 AC_MSG_CHECKING(whether to use a hardware capability map file)
382 hwcap_save_LDFLAGS="$LDFLAGS"
383 HWCAP_LDFLAGS='-Wl,-M,$(srcdir)/solaris-hwcap.mapfile'
384 LDFLAGS="$LDFLAGS -Wl,-M,pixman/solaris-hwcap.mapfile"
385 AC_LINK_IFELSE([int main() { return 0; }],
386 use_hwcap_mapfile=yes,
388 LDFLAGS="$hwcap_save_LDFLAGS"
389 AC_MSG_RESULT($use_hwcap_mapfile)
391 if test "x$MMX_LDFLAGS" = "x" ; then
392 MMX_LDFLAGS="$HWCAP_LDFLAGS"
394 if test "x$SSE2_LDFLAGS" = "x" ; then
395 SSE2_LDFLAGS="$HWCAP_LDFLAGS"
401 AC_SUBST(MMX_LDFLAGS)
402 AC_SUBST(SSE2_CFLAGS)
403 AC_SUBST(SSE2_LDFLAGS)
405 dnl ===========================================================================
406 dnl Check for VMX/Altivec
407 if test -n "`$CC -v 2>&1 | grep version | grep Apple`"; then
408 VMX_CFLAGS="-faltivec"
410 VMX_CFLAGS="-maltivec -mabi=altivec"
413 have_vmx_intrinsics=no
414 AC_MSG_CHECKING(whether to use VMX/Altivec intrinsics)
415 xserver_save_CFLAGS=$CFLAGS
416 CFLAGS="$VMX_CFLAGS $CFLAGS"
418 #if defined(__GNUC__) && (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4))
419 error "Need GCC >= 3.4 for sane altivec support"
423 vector unsigned int v = vec_splat_u32 (1);
426 }], have_vmx_intrinsics=yes)
427 CFLAGS=$xserver_save_CFLAGS
430 [AC_HELP_STRING([--disable-vmx],
431 [disable VMX fast paths])],
432 [enable_vmx=$enableval], [enable_vmx=auto])
434 if test $enable_vmx = no ; then
435 have_vmx_intrinsics=disabled
438 if test $have_vmx_intrinsics = yes ; then
439 AC_DEFINE(USE_VMX, 1, [use VMX compiler intrinsics])
444 AC_MSG_RESULT($have_vmx_intrinsics)
445 if test $enable_vmx = yes && test $have_vmx_intrinsics = no ; then
446 AC_MSG_ERROR([VMX intrinsics not detected])
451 AM_CONDITIONAL(USE_VMX, test $have_vmx_intrinsics = yes)
453 dnl ==========================================================================
454 dnl Check if assembler is gas compatible and supports ARM SIMD instructions
456 AC_MSG_CHECKING(whether to use ARM SIMD assembler)
457 xserver_save_CFLAGS=$CFLAGS
458 CFLAGS="-x assembler-with-cpp $CFLAGS"
466 #error EABI is required (to be sure that calling conventions are compatible)
469 uqadd8 r0, r0, r0]], have_arm_simd=yes)
470 CFLAGS=$xserver_save_CFLAGS
472 AC_ARG_ENABLE(arm-simd,
473 [AC_HELP_STRING([--disable-arm-simd],
474 [disable ARM SIMD fast paths])],
475 [enable_arm_simd=$enableval], [enable_arm_simd=auto])
477 if test $enable_arm_simd = no ; then
478 have_arm_simd=disabled
481 if test $have_arm_simd = yes ; then
482 AC_DEFINE(USE_ARM_SIMD, 1, [use ARM SIMD assembly optimizations])
485 AM_CONDITIONAL(USE_ARM_SIMD, test $have_arm_simd = yes)
487 AC_MSG_RESULT($have_arm_simd)
488 if test $enable_arm_simd = yes && test $have_arm_simd = no ; then
489 AC_MSG_ERROR([ARM SIMD intrinsics not detected])
492 dnl ==========================================================================
493 dnl Check if assembler is gas compatible and supports NEON instructions
495 AC_MSG_CHECKING(whether to use ARM NEON assembler)
496 xserver_save_CFLAGS=$CFLAGS
497 CFLAGS="-x assembler-with-cpp $CFLAGS"
503 .eabi_attribute 10, 0
507 #error EABI is required (to be sure that calling conventions are compatible)
510 vmovn.u16 d0, q0]], have_arm_neon=yes)
511 CFLAGS=$xserver_save_CFLAGS
513 AC_ARG_ENABLE(arm-neon,
514 [AC_HELP_STRING([--disable-arm-neon],
515 [disable ARM NEON fast paths])],
516 [enable_arm_neon=$enableval], [enable_arm_neon=auto])
518 if test $enable_arm_neon = no ; then
519 have_arm_neon=disabled
522 if test $have_arm_neon = yes ; then
523 AC_DEFINE(USE_ARM_NEON, 1, [use ARM NEON assembly optimizations])
526 AM_CONDITIONAL(USE_ARM_NEON, test $have_arm_neon = yes)
528 AC_MSG_RESULT($have_arm_neon)
529 if test $enable_arm_neon = yes && test $have_arm_neon = no ; then
530 AC_MSG_ERROR([ARM NEON intrinsics not detected])
533 dnl =========================================================================================
534 dnl Check for GNU-style inline assembly support
536 have_gcc_inline_asm=no
537 AC_MSG_CHECKING(whether to use GNU-style inline assembler)
540 /* Most modern architectures have a NOP instruction, so this is a fairly generic test. */
541 asm volatile ( "\tnop\n" : : : "cc", "memory" );
543 }], have_gcc_inline_asm=yes)
545 AC_ARG_ENABLE(gcc-inline-asm,
546 [AC_HELP_STRING([--disable-gcc-inline-asm],
547 [disable GNU-style inline assembler])],
548 [enable_gcc_inline_asm=$enableval], [enable_gcc_inline_asm=auto])
550 if test $enable_gcc_inline_asm = no ; then
551 have_gcc_inline_asm=disabled
554 if test $have_gcc_inline_asm = yes ; then
555 AC_DEFINE(USE_GCC_INLINE_ASM, 1, [use GNU-style inline assembler])
558 AC_MSG_RESULT($have_gcc_inline_asm)
559 if test $enable_gcc_inline_asm = yes && test $have_gcc_inline_asm = no ; then
560 AC_MSG_ERROR([GNU-style inline assembler not detected])
563 AM_CONDITIONAL(USE_GCC_INLINE_ASM, test $have_gcc_inline_asm = yes)
565 dnl ==============================================
568 AC_ARG_ENABLE(timers,
569 [AC_HELP_STRING([--enable-timers],
570 [enable TIMER_BEGIN and TIMER_END macros [default=no]])],
571 [enable_timers=$enableval], [enable_timers=no])
573 if test $enable_timers = yes ; then
574 AC_DEFINE(PIXMAN_TIMERS, 1, [enable TIMER_BEGIN/TIMER_END macros])
576 AC_SUBST(PIXMAN_TIMERS)
578 dnl ===================================
582 [AC_HELP_STRING([--enable-gtk],
583 [enable tests using GTK+ [default=auto]])],
584 [enable_gtk=$enableval], [enable_gtk=auto])
588 if test $enable_gtk = yes ; then
589 AC_CHECK_LIB([pixman-1], [pixman_version_string])
590 PKG_CHECK_MODULES(GTK, [gtk+-2.0 pixman-1])
593 if test $enable_gtk = auto ; then
594 AC_CHECK_LIB([pixman-1], [pixman_version_string], [enable_gtk=auto], [enable_gtk=no])
597 if test $enable_gtk = auto ; then
598 PKG_CHECK_MODULES(GTK, [gtk+-2.0 pixman-1], [enable_gtk=yes], [enable_gtk=no])
601 AM_CONDITIONAL(HAVE_GTK, [test "x$enable_gtk" = xyes])
608 dnl =====================================
609 dnl posix_memalign, sigaction, alarm
611 AC_CHECK_FUNC(posix_memalign, have_posix_memalign=yes, have_posix_memalign=no)
612 if test x$have_posix_memalign = xyes; then
613 AC_DEFINE(HAVE_POSIX_MEMALIGN, 1, [Whether we have posix_memalign()])
616 AC_CHECK_FUNC(sigaction, have_sigaction=yes, have_sigaction=no)
617 if test x$have_sigaction = xyes; then
618 AC_DEFINE(HAVE_SIGACTION, 1, [Whether we have sigaction()])
621 AC_CHECK_FUNC(alarm, have_alarm=yes, have_alarm=no)
622 if test x$have_alarm = xyes; then
623 AC_DEFINE(HAVE_ALARM, 1, [Whether we have alarm()])
626 AC_CHECK_HEADER([sys/mman.h],
627 [AC_DEFINE(HAVE_SYS_MMAN_H, [1], [Define to 1 if we have <sys/mman.h>])])
629 AC_CHECK_FUNC(mprotect, have_mprotect=yes, have_mprotect=no)
630 if test x$have_mprotect = xyes; then
631 AC_DEFINE(HAVE_MPROTECT, 1, [Whether we have mprotect()])
634 AC_CHECK_FUNC(getpagesize, have_getpagesize=yes, have_getpagesize=no)
635 if test x$have_getpagesize = xyes; then
636 AC_DEFINE(HAVE_GETPAGESIZE, 1, [Whether we have getpagesize()])
639 dnl =====================================
640 dnl Thread local storage
642 support_for__thread=no
644 AC_MSG_CHECKING(for __thread)
647 #error MinGW has broken __thread support
650 #error OpenBSD has broken __thread support
652 static __thread int x ;
653 int main () { x = 123; return x; }
654 ], support_for__thread=yes)
656 if test $support_for__thread = yes; then
657 AC_DEFINE([TOOLCHAIN_SUPPORTS__THREAD],[],[Whether the tool chain supports __thread])
660 AC_MSG_RESULT($support_for__thread)
666 m4_define([pthread_test_program],[dnl
670 static pthread_once_t once_control = PTHREAD_ONCE_INIT;
671 static pthread_key_t key;
676 pthread_key_create (&key, NULL);
684 if (pthread_once (&once_control, make_key) != 0)
690 value = pthread_getspecific (key);
693 value = malloc (100);
694 pthread_setspecific (key, value);
701 AC_DEFUN([PIXMAN_CHECK_PTHREAD],[dnl
702 if test "z$support_for_pthread_setspecific" != "zyes"; then
703 PIXMAN_LINK_WITH_ENV(
704 [$1], [pthread_test_program],
705 [PTHREAD_CFLAGS="$CFLAGS"
707 PTHREAD_LDFLAGS="$LDFLAGS"
708 support_for_pthread_setspecific=yes])
712 if test $support_for__thread = no; then
713 support_for_pthread_setspecific=no
715 AC_MSG_CHECKING(for pthread_setspecific)
717 PIXMAN_CHECK_PTHREAD([CFLAGS="-D_REENTRANT"; LIBS="-lpthread"])
718 PIXMAN_CHECK_PTHREAD([CFLAGS="-pthread"; LDFLAGS="-pthread"])
720 if test $support_for_pthread_setspecific = yes; then
721 CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
722 AC_DEFINE([HAVE_PTHREAD_SETSPECIFIC], [], [Whether pthread_setspecific() is supported])
725 AC_MSG_RESULT($support_for_pthread_setspecific);
728 AC_SUBST(TOOLCHAIN_SUPPORTS__THREAD)
729 AC_SUBST(HAVE_PTHREAD_SETSPECIFIC)
730 AC_SUBST(PTHREAD_LDFLAGS)
731 AC_SUBST(PTHREAD_LIBS)
733 AC_OUTPUT([pixman-1.pc
734 pixman-1-uninstalled.pc
737 pixman/pixman-version.h