Home | History | Annotate | Download | only in pixman
      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], 30)
     57 m4_define([pixman_micro], 0)
     58 
     59 m4_define([pixman_version],[pixman_major.pixman_minor.pixman_micro])
     60 
     61 AC_INIT(pixman, pixman_version, [pixman (a] 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 AC_CONFIG_HEADERS(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 	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 
    116 dnl Find a -Werror for catching warnings.
    117 WERROR=
    118 for 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
    127 done
    128 
    129 dnl PIXMAN_CHECK_CFLAG(flag, [program])
    130 dnl  Adds flag to CFLAGS if the given program links without warnings or errors.
    131 AC_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 
    146 AC_CHECK_SIZEOF(long)
    147 
    148 # Checks for Sun Studio compilers
    149 AC_CHECK_DECL([__SUNPRO_C], [SUNCC="yes"], [SUNCC="no"])
    150 AC_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.
    155 if test $SUNCC = yes &&			\
    156    test "x$test_CFLAGS" = "x" &&	\
    157    test "$CFLAGS" = "-g"
    158 then
    159   CFLAGS="-O -g"
    160 fi
    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 #
    168 m4_define([lt_current], [pixman_minor])
    169 m4_define([lt_revision], [pixman_micro])
    170 m4_define([lt_age], [pixman_minor])
    171 
    172 LT_VERSION_INFO="lt_current:lt_revision:lt_age"
    173 
    174 PIXMAN_VERSION_MAJOR=pixman_major()
    175 AC_SUBST(PIXMAN_VERSION_MAJOR)
    176 PIXMAN_VERSION_MINOR=pixman_minor()
    177 AC_SUBST(PIXMAN_VERSION_MINOR)
    178 PIXMAN_VERSION_MICRO=pixman_micro()
    179 AC_SUBST(PIXMAN_VERSION_MICRO)
    180 
    181 AC_SUBST(LT_VERSION_INFO)
    182 
    183 # Check for dependencies
    184 
    185 PIXMAN_CHECK_CFLAG([-Wall])
    186 PIXMAN_CHECK_CFLAG([-fno-strict-aliasing])
    187 
    188 dnl =========================================================================
    189 dnl OpenMP for the test suite?
    190 dnl
    191 
    192 # Check for OpenMP support only when autoconf support that (require autoconf >=2.62)
    193 OPENMP_CFLAGS=
    194 m4_ifdef([AC_OPENMP], [AC_OPENMP])
    195 
    196 if test "x$enable_openmp" = "xyes" && test "x$ac_cv_prog_c_openmp" = "xunsupported" ; then
    197   AC_MSG_WARN([OpenMP support requested but found unsupported])
    198 fi
    199 
    200 dnl May not fail to link without -Wall -Werror added
    201 dnl So try to link only when openmp is supported
    202 dnl ac_cv_prog_c_openmp is not defined when --disable-openmp is used
    203 if test "x$ac_cv_prog_c_openmp" != "xunsupported" && test "x$ac_cv_prog_c_openmp" != "x"; then
    204   m4_define([openmp_test_program],[dnl
    205   #include <stdio.h>
    206 
    207   extern unsigned int lcg_seed;
    208   #pragma omp threadprivate(lcg_seed)
    209   unsigned int lcg_seed;
    210 
    211   unsigned function(unsigned a, unsigned b)
    212   {
    213 	lcg_seed ^= b;
    214 	return ((a + b) ^ a ) + lcg_seed;
    215   }
    216 
    217   int main(int argc, char **argv)
    218   {
    219 	int i;
    220 	int n1 = 0, n2 = argc;
    221 	unsigned checksum = 0;
    222 	int verbose = argv != NULL;
    223 	unsigned (*test_function)(unsigned, unsigned);
    224 	test_function = function;
    225 	#pragma omp parallel for reduction(+:checksum) default(none) \
    226 					shared(n1, n2, test_function, verbose)
    227 	for (i = n1; i < n2; i++)
    228 	{
    229 		unsigned crc = test_function (i, 0);
    230 		if (verbose)
    231 			printf ("%d: %08X\n", i, crc);
    232 		checksum += crc;
    233 	}
    234 	printf("%u\n", checksum);
    235 	return 0;
    236   }
    237   ])
    238 
    239   PIXMAN_LINK_WITH_ENV(
    240 	[CFLAGS="$OPENMP_CFLAGS" LDFLAGS="$OPENMP_CFLAGS"],
    241 	[openmp_test_program],
    242 	[have_openmp=yes],
    243 	[have_openmp=no])
    244   if test "x$have_openmp" = "xyes" ; then
    245     AC_DEFINE(USE_OPENMP, 1, [use OpenMP in the test suite])
    246   fi
    247 fi
    248 AC_SUBST(OPENMP_CFLAGS)
    249 
    250 dnl =========================================================================
    251 dnl -fvisibility stuff
    252 
    253 PIXMAN_CHECK_CFLAG([-fvisibility=hidden], [dnl
    254 #if defined(__GNUC__) && (__GNUC__ >= 4)
    255 #ifdef _WIN32
    256 #error Have -fvisibility but it is ignored and generates a warning
    257 #endif
    258 #else
    259 #error Need GCC 4.0 for visibility
    260 #endif
    261 ])
    262 
    263 PIXMAN_CHECK_CFLAG([-xldscope=hidden], [dnl
    264 #if defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)
    265 #else
    266 #error Need Sun Studio 8 for visibility
    267 #endif
    268 ])
    269 
    270 dnl ===========================================================================
    271 dnl Check for Loongson Multimedia Instructions
    272 
    273 if test "x$LS_CFLAGS" = "x" ; then
    274     LS_CFLAGS="-march=loongson2f"
    275 fi
    276 
    277 have_loongson_mmi=no
    278 AC_MSG_CHECKING(whether to use Loongson MMI assembler)
    279 
    280 xserver_save_CFLAGS=$CFLAGS
    281 CFLAGS=" $LS_CFLAGS $CFLAGS -I$srcdir"
    282 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
    283 #ifndef __mips_loongson_vector_rev
    284 #error "Loongson Multimedia Instructions are only available on Loongson"
    285 #endif
    286 #if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4))
    287 #error "Need GCC >= 4.4 for Loongson MMI compilation"
    288 #endif
    289 #include "pixman/loongson-mmintrin.h"
    290 int main () {
    291     union {
    292         __m64 v;
    293         char c[8];
    294     } a = { .c = {1, 2, 3, 4, 5, 6, 7, 8} };
    295     int b = 4;
    296     __m64 c = _mm_srli_pi16 (a.v, b);
    297     return 0;
    298 }]])], have_loongson_mmi=yes)
    299 CFLAGS=$xserver_save_CFLAGS
    300 
    301 AC_ARG_ENABLE(loongson-mmi,
    302    [AC_HELP_STRING([--disable-loongson-mmi],
    303                    [disable Loongson MMI fast paths])],
    304    [enable_loongson_mmi=$enableval], [enable_loongson_mmi=auto])
    305 
    306 if test $enable_loongson_mmi = no ; then
    307    have_loongson_mmi=disabled
    308 fi
    309 
    310 if test $have_loongson_mmi = yes ; then
    311    AC_DEFINE(USE_LOONGSON_MMI, 1, [use Loongson Multimedia Instructions])
    312 else
    313    LS_CFLAGS=
    314 fi
    315 
    316 AC_MSG_RESULT($have_loongson_mmi)
    317 if test $enable_loongson_mmi = yes && test $have_loongson_mmi = no ; then
    318    AC_MSG_ERROR([Loongson MMI not detected])
    319 fi
    320 
    321 AM_CONDITIONAL(USE_LOONGSON_MMI, test $have_loongson_mmi = yes)
    322 
    323 dnl ===========================================================================
    324 dnl Check for MMX
    325 
    326 if test "x$MMX_CFLAGS" = "x" ; then
    327    if test "x$SUNCC" = "xyes"; then
    328       # Sun Studio doesn't have an -xarch=mmx flag, so we have to use sse
    329       # but if we're building 64-bit, mmx & sse support is on by default and
    330       # -xarch=sse throws an error instead
    331       if test "$AMD64_ABI" = "no" ; then
    332          MMX_CFLAGS="-xarch=sse"
    333       fi
    334    else
    335       MMX_CFLAGS="-mmmx -Winline"
    336    fi
    337 fi
    338 
    339 have_mmx_intrinsics=no
    340 AC_MSG_CHECKING(whether to use MMX intrinsics)
    341 xserver_save_CFLAGS=$CFLAGS
    342 CFLAGS="$MMX_CFLAGS $CFLAGS"
    343 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
    344 #if defined(__GNUC__) && (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4))
    345 #error "Need GCC >= 3.4 for MMX intrinsics"
    346 #endif
    347 #include <mmintrin.h>
    348 int main () {
    349     __m64 v = _mm_cvtsi32_si64 (1);
    350     __m64 w;
    351 
    352     /* Some versions of clang will choke on K */
    353     asm ("pshufw %2, %1, %0\n\t"
    354         : "=y" (w)
    355         : "y" (v), "K" (5)
    356     );
    357 
    358     return _mm_cvtsi64_si32 (v);
    359 }]])], have_mmx_intrinsics=yes)
    360 CFLAGS=$xserver_save_CFLAGS
    361 
    362 AC_ARG_ENABLE(mmx,
    363    [AC_HELP_STRING([--disable-mmx],
    364                    [disable x86 MMX fast paths])],
    365    [enable_mmx=$enableval], [enable_mmx=auto])
    366 
    367 if test $enable_mmx = no ; then
    368    have_mmx_intrinsics=disabled
    369 fi
    370 
    371 if test $have_mmx_intrinsics = yes ; then
    372    AC_DEFINE(USE_X86_MMX, 1, [use x86 MMX compiler intrinsics])
    373 else
    374    MMX_CFLAGS=
    375 fi
    376 
    377 AC_MSG_RESULT($have_mmx_intrinsics)
    378 if test $enable_mmx = yes && test $have_mmx_intrinsics = no ; then
    379    AC_MSG_ERROR([x86 MMX intrinsics not detected])
    380 fi
    381 
    382 AM_CONDITIONAL(USE_X86_MMX, test $have_mmx_intrinsics = yes)
    383 
    384 dnl ===========================================================================
    385 dnl Check for SSE2
    386 
    387 if test "x$SSE2_CFLAGS" = "x" ; then
    388    if test "x$SUNCC" = "xyes"; then
    389       # SSE2 is enabled by default in the Sun Studio 64-bit environment
    390       if test "$AMD64_ABI" = "no" ; then
    391          SSE2_CFLAGS="-xarch=sse2"
    392       fi
    393    else
    394       SSE2_CFLAGS="-msse2 -Winline"
    395    fi
    396 fi
    397 
    398 have_sse2_intrinsics=no
    399 AC_MSG_CHECKING(whether to use SSE2 intrinsics)
    400 xserver_save_CFLAGS=$CFLAGS
    401 CFLAGS="$SSE2_CFLAGS $CFLAGS"
    402 
    403 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
    404 #if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2))
    405 #   if !defined(__amd64__) && !defined(__x86_64__)
    406 #      error "Need GCC >= 4.2 for SSE2 intrinsics on x86"
    407 #   endif
    408 #endif
    409 #include <mmintrin.h>
    410 #include <xmmintrin.h>
    411 #include <emmintrin.h>
    412 int main () {
    413     __m128i a = _mm_set1_epi32 (0), b = _mm_set1_epi32 (0), c;
    414 	c = _mm_xor_si128 (a, b);
    415     return 0;
    416 }]])], have_sse2_intrinsics=yes)
    417 CFLAGS=$xserver_save_CFLAGS
    418 
    419 AC_ARG_ENABLE(sse2,
    420    [AC_HELP_STRING([--disable-sse2],
    421                    [disable SSE2 fast paths])],
    422    [enable_sse2=$enableval], [enable_sse2=auto])
    423 
    424 if test $enable_sse2 = no ; then
    425    have_sse2_intrinsics=disabled
    426 fi
    427 
    428 if test $have_sse2_intrinsics = yes ; then
    429    AC_DEFINE(USE_SSE2, 1, [use SSE2 compiler intrinsics])
    430 fi
    431 
    432 AC_MSG_RESULT($have_sse2_intrinsics)
    433 if test $enable_sse2 = yes && test $have_sse2_intrinsics = no ; then
    434    AC_MSG_ERROR([SSE2 intrinsics not detected])
    435 fi
    436 
    437 AM_CONDITIONAL(USE_SSE2, test $have_sse2_intrinsics = yes)
    438 
    439 dnl ===========================================================================
    440 dnl Other special flags needed when building code using MMX or SSE instructions
    441 case $host_os in
    442    solaris*)
    443       # When building 32-bit binaries, apply a mapfile to ensure that the
    444       # binaries aren't flagged as only able to run on MMX+SSE capable CPUs
    445       # since they check at runtime before using those instructions.
    446       # Not all linkers grok the mapfile format so we check for that first.
    447       if test "$AMD64_ABI" = "no" ; then
    448 	 use_hwcap_mapfile=no
    449 	 AC_MSG_CHECKING(whether to use a hardware capability map file)
    450 	 hwcap_save_LDFLAGS="$LDFLAGS"
    451 	 HWCAP_LDFLAGS='-Wl,-M,$(srcdir)/solaris-hwcap.mapfile'
    452 	 LDFLAGS="$LDFLAGS -Wl,-M,pixman/solaris-hwcap.mapfile"
    453 	 AC_LINK_IFELSE([AC_LANG_SOURCE([[int main() { return 0; }]])],
    454 			use_hwcap_mapfile=yes,
    455 			HWCAP_LDFLAGS="")
    456 	 LDFLAGS="$hwcap_save_LDFLAGS"
    457 	 AC_MSG_RESULT($use_hwcap_mapfile)
    458       fi
    459       if test "x$MMX_LDFLAGS" = "x" ; then
    460          MMX_LDFLAGS="$HWCAP_LDFLAGS"
    461       fi
    462       if test "x$SSE2_LDFLAGS" = "x" ; then
    463 	 SSE2_LDFLAGS="$HWCAP_LDFLAGS"
    464       fi
    465       ;;
    466 esac
    467 
    468 AC_SUBST(LS_CFLAGS)
    469 AC_SUBST(IWMMXT_CFLAGS)
    470 AC_SUBST(MMX_CFLAGS)
    471 AC_SUBST(MMX_LDFLAGS)
    472 AC_SUBST(SSE2_CFLAGS)
    473 AC_SUBST(SSE2_LDFLAGS)
    474 
    475 dnl ===========================================================================
    476 dnl Check for VMX/Altivec
    477 if test -n "`$CC -v 2>&1 | grep version | grep Apple`"; then
    478     VMX_CFLAGS="-faltivec"
    479 else
    480     VMX_CFLAGS="-maltivec -mabi=altivec"
    481 fi
    482 
    483 have_vmx_intrinsics=no
    484 AC_MSG_CHECKING(whether to use VMX/Altivec intrinsics)
    485 xserver_save_CFLAGS=$CFLAGS
    486 CFLAGS="$VMX_CFLAGS $CFLAGS"
    487 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
    488 #if defined(__GNUC__) && (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4))
    489 #error "Need GCC >= 3.4 for sane altivec support"
    490 #endif
    491 #include <altivec.h>
    492 int main () {
    493     vector unsigned int v = vec_splat_u32 (1);
    494     v = vec_sub (v, v);
    495     return 0;
    496 }]])], have_vmx_intrinsics=yes)
    497 CFLAGS=$xserver_save_CFLAGS
    498 
    499 AC_ARG_ENABLE(vmx,
    500    [AC_HELP_STRING([--disable-vmx],
    501                    [disable VMX fast paths])],
    502    [enable_vmx=$enableval], [enable_vmx=auto])
    503 
    504 if test $enable_vmx = no ; then
    505    have_vmx_intrinsics=disabled
    506 fi
    507 
    508 if test $have_vmx_intrinsics = yes ; then
    509    AC_DEFINE(USE_VMX, 1, [use VMX compiler intrinsics])
    510 else
    511    VMX_CFLAGS=
    512 fi
    513 
    514 AC_MSG_RESULT($have_vmx_intrinsics)
    515 if test $enable_vmx = yes && test $have_vmx_intrinsics = no ; then
    516    AC_MSG_ERROR([VMX intrinsics not detected])
    517 fi
    518 
    519 AC_SUBST(VMX_CFLAGS)
    520 
    521 AM_CONDITIONAL(USE_VMX, test $have_vmx_intrinsics = yes)
    522 
    523 dnl ==========================================================================
    524 dnl Check if assembler is gas compatible and supports ARM SIMD instructions
    525 have_arm_simd=no
    526 AC_MSG_CHECKING(whether to use ARM SIMD assembler)
    527 xserver_save_CFLAGS=$CFLAGS
    528 CFLAGS="-x assembler-with-cpp $CFLAGS"
    529 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
    530 .text
    531 .arch armv6
    532 .object_arch armv4
    533 .arm
    534 .altmacro
    535 #ifndef __ARM_EABI__
    536 #error EABI is required (to be sure that calling conventions are compatible)
    537 #endif
    538 pld [r0]
    539 uqadd8 r0, r0, r0]])], have_arm_simd=yes)
    540 CFLAGS=$xserver_save_CFLAGS
    541 
    542 AC_ARG_ENABLE(arm-simd,
    543    [AC_HELP_STRING([--disable-arm-simd],
    544                    [disable ARM SIMD fast paths])],
    545    [enable_arm_simd=$enableval], [enable_arm_simd=auto])
    546 
    547 if test $enable_arm_simd = no ; then
    548    have_arm_simd=disabled
    549 fi
    550 
    551 if test $have_arm_simd = yes ; then
    552    AC_DEFINE(USE_ARM_SIMD, 1, [use ARM SIMD assembly optimizations])
    553 fi
    554 
    555 AM_CONDITIONAL(USE_ARM_SIMD, test $have_arm_simd = yes)
    556 
    557 AC_MSG_RESULT($have_arm_simd)
    558 if test $enable_arm_simd = yes && test $have_arm_simd = no ; then
    559    AC_MSG_ERROR([ARM SIMD intrinsics not detected])
    560 fi
    561 
    562 dnl ==========================================================================
    563 dnl Check if assembler is gas compatible and supports NEON instructions
    564 have_arm_neon=no
    565 AC_MSG_CHECKING(whether to use ARM NEON assembler)
    566 xserver_save_CFLAGS=$CFLAGS
    567 CFLAGS="-x assembler-with-cpp $CFLAGS"
    568 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
    569 .text
    570 .fpu neon
    571 .arch armv7a
    572 .object_arch armv4
    573 .eabi_attribute 10, 0
    574 .arm
    575 .altmacro
    576 #ifndef __ARM_EABI__
    577 #error EABI is required (to be sure that calling conventions are compatible)
    578 #endif
    579 pld [r0]
    580 vmovn.u16 d0, q0]])], have_arm_neon=yes)
    581 CFLAGS=$xserver_save_CFLAGS
    582 
    583 AC_ARG_ENABLE(arm-neon,
    584    [AC_HELP_STRING([--disable-arm-neon],
    585                    [disable ARM NEON fast paths])],
    586    [enable_arm_neon=$enableval], [enable_arm_neon=auto])
    587 
    588 if test $enable_arm_neon = no ; then
    589    have_arm_neon=disabled
    590 fi
    591 
    592 if test $have_arm_neon = yes ; then
    593    AC_DEFINE(USE_ARM_NEON, 1, [use ARM NEON assembly optimizations])
    594 fi
    595 
    596 AM_CONDITIONAL(USE_ARM_NEON, test $have_arm_neon = yes)
    597 
    598 AC_MSG_RESULT($have_arm_neon)
    599 if test $enable_arm_neon = yes && test $have_arm_neon = no ; then
    600    AC_MSG_ERROR([ARM NEON intrinsics not detected])
    601 fi
    602 
    603 dnl ===========================================================================
    604 dnl Check for IWMMXT
    605 
    606 AC_ARG_ENABLE(arm-iwmmxt,
    607    [AC_HELP_STRING([--disable-arm-iwmmxt],
    608                    [disable ARM IWMMXT fast paths])],
    609    [enable_iwmmxt=$enableval], [enable_iwmmxt=auto])
    610 
    611 AC_ARG_ENABLE(arm-iwmmxt2,
    612    [AC_HELP_STRING([--disable-arm-iwmmxt2],
    613                    [build ARM IWMMXT fast paths with -march=iwmmxt instead of -march=iwmmxt2])],
    614    [enable_iwmmxt2=$enableval], [enable_iwmmxt2=auto])
    615 
    616 if test "x$IWMMXT_CFLAGS" = "x" ; then
    617    IWMMXT_CFLAGS="-flax-vector-conversions -Winline -march=iwmmxt"
    618    if test $enable_iwmmxt2 != no ; then
    619       IWMMXT_CFLAGS+="2"
    620    fi
    621 fi
    622 
    623 have_iwmmxt_intrinsics=no
    624 AC_MSG_CHECKING(whether to use ARM IWMMXT intrinsics)
    625 xserver_save_CFLAGS=$CFLAGS
    626 CFLAGS="$CFLAGS $IWMMXT_CFLAGS"
    627 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
    628 #ifndef __arm__
    629 #error "IWMMXT is only available on ARM"
    630 #endif
    631 #ifndef __IWMMXT__
    632 #error "IWMMXT not enabled (with -march=iwmmxt)"
    633 #endif
    634 #if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5))
    635 #error "Need GCC >= 4.5 for IWMMXT intrinsics"
    636 #endif
    637 #include <mmintrin.h>
    638 int main () {
    639 	union {
    640 		__m64 v;
    641 		char c[8];
    642 	} a = { .c = {1, 2, 3, 4, 5, 6, 7, 8} };
    643 	int b = 4;
    644 	__m64 c = _mm_srli_si64 (a.v, b);
    645 }]])], have_iwmmxt_intrinsics=yes)
    646 CFLAGS=$xserver_save_CFLAGS
    647 
    648 if test $enable_iwmmxt = no ; then
    649    have_iwmmxt_intrinsics=disabled
    650 fi
    651 
    652 if test $have_iwmmxt_intrinsics = yes ; then
    653    AC_DEFINE(USE_ARM_IWMMXT, 1, [use ARM IWMMXT compiler intrinsics])
    654 else
    655    IWMMXT_CFLAGS=
    656 fi
    657 
    658 AC_MSG_RESULT($have_iwmmxt_intrinsics)
    659 if test $enable_iwmmxt = yes && test $have_iwmmxt_intrinsics = no ; then
    660    AC_MSG_ERROR([IWMMXT intrinsics not detected])
    661 fi
    662 
    663 AM_CONDITIONAL(USE_ARM_IWMMXT, test $have_iwmmxt_intrinsics = yes)
    664 
    665 dnl ==========================================================================
    666 dnl Check if assembler is gas compatible and supports MIPS DSPr2 instructions
    667 
    668 have_mips_dspr2=no
    669 AC_MSG_CHECKING(whether to use MIPS DSPr2 assembler)
    670 xserver_save_CFLAGS=$CFLAGS
    671 CFLAGS="-mdspr2 $CFLAGS"
    672 
    673 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
    674 #if !(defined(__mips__) &&  __mips_isa_rev >= 2)
    675 #error MIPS DSPr2 is currently only available on MIPS32r2 platforms.
    676 #endif
    677 int
    678 main ()
    679 {
    680     int c = 0, a = 0, b = 0;
    681     __asm__ __volatile__ (
    682         "precr.qb.ph %[c], %[a], %[b]          \n\t"
    683         : [c] "=r" (c)
    684         : [a] "r" (a), [b] "r" (b)
    685     );
    686     return c;
    687 }]])], have_mips_dspr2=yes)
    688 CFLAGS=$xserver_save_CFLAGS
    689 
    690 AC_ARG_ENABLE(mips-dspr2,
    691    [AC_HELP_STRING([--disable-mips-dspr2],
    692                    [disable MIPS DSPr2 fast paths])],
    693    [enable_mips_dspr2=$enableval], [enable_mips_dspr2=auto])
    694 
    695 if test $enable_mips_dspr2 = no ; then
    696    have_mips_dspr2=disabled
    697 fi
    698 
    699 if test $have_mips_dspr2 = yes ; then
    700    AC_DEFINE(USE_MIPS_DSPR2, 1, [use MIPS DSPr2 assembly optimizations])
    701 fi
    702 
    703 AM_CONDITIONAL(USE_MIPS_DSPR2, test $have_mips_dspr2 = yes)
    704 
    705 AC_MSG_RESULT($have_mips_dspr2)
    706 if test $enable_mips_dspr2 = yes && test $have_mips_dspr2 = no ; then
    707    AC_MSG_ERROR([MIPS DSPr2 instructions not detected])
    708 fi
    709 
    710 dnl =========================================================================================
    711 dnl Check for GNU-style inline assembly support
    712 
    713 have_gcc_inline_asm=no
    714 AC_MSG_CHECKING(whether to use GNU-style inline assembler)
    715 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
    716 int main () {
    717     /* Most modern architectures have a NOP instruction, so this is a fairly generic test. */
    718 	asm volatile ( "\tnop\n" : : : "cc", "memory" );
    719     return 0;
    720 }]])], have_gcc_inline_asm=yes)
    721 
    722 AC_ARG_ENABLE(gcc-inline-asm,
    723    [AC_HELP_STRING([--disable-gcc-inline-asm],
    724                    [disable GNU-style inline assembler])],
    725    [enable_gcc_inline_asm=$enableval], [enable_gcc_inline_asm=auto])
    726 
    727 if test $enable_gcc_inline_asm = no ; then
    728    have_gcc_inline_asm=disabled
    729 fi
    730 
    731 if test $have_gcc_inline_asm = yes ; then
    732    AC_DEFINE(USE_GCC_INLINE_ASM, 1, [use GNU-style inline assembler])
    733 fi
    734 
    735 AC_MSG_RESULT($have_gcc_inline_asm)
    736 if test $enable_gcc_inline_asm = yes && test $have_gcc_inline_asm = no ; then
    737    AC_MSG_ERROR([GNU-style inline assembler not detected])
    738 fi
    739 
    740 AM_CONDITIONAL(USE_GCC_INLINE_ASM, test $have_gcc_inline_asm = yes)
    741 
    742 dnl ==============================================
    743 dnl Static test programs
    744 
    745 AC_ARG_ENABLE(static-testprogs,
    746    [AC_HELP_STRING([--enable-static-testprogs],
    747 		   [build test programs as static binaries [default=no]])],
    748    [enable_static_testprogs=$enableval], [enable_static_testprogs=no])
    749 
    750 TESTPROGS_EXTRA_LDFLAGS=
    751 if test "x$enable_static_testprogs" = "xyes" ; then
    752    TESTPROGS_EXTRA_LDFLAGS="-all-static"
    753 fi
    754 AC_SUBST(TESTPROGS_EXTRA_LDFLAGS)
    755 
    756 dnl ==============================================
    757 dnl Timers
    758 
    759 AC_ARG_ENABLE(timers,
    760    [AC_HELP_STRING([--enable-timers],
    761 		   [enable TIMER_BEGIN and TIMER_END macros [default=no]])],
    762    [enable_timers=$enableval], [enable_timers=no])
    763 
    764 if test $enable_timers = yes ; then 
    765    AC_DEFINE(PIXMAN_TIMERS, 1, [enable TIMER_BEGIN/TIMER_END macros])
    766 fi
    767 AC_SUBST(PIXMAN_TIMERS)
    768 
    769 dnl ===================================
    770 dnl GTK+
    771 
    772 AC_ARG_ENABLE(gtk,
    773    [AC_HELP_STRING([--enable-gtk],
    774                    [enable tests using GTK+ [default=auto]])],
    775    [enable_gtk=$enableval], [enable_gtk=auto])
    776 
    777 PKG_PROG_PKG_CONFIG
    778 
    779 if test $enable_gtk = yes ; then
    780    AC_CHECK_LIB([pixman-1], [pixman_version_string])
    781    PKG_CHECK_MODULES(GTK, [gtk+-2.0 pixman-1])
    782 fi
    783 
    784 if test $enable_gtk = auto ; then
    785    AC_CHECK_LIB([pixman-1], [pixman_version_string], [enable_gtk=auto], [enable_gtk=no])
    786 fi
    787 
    788 if test $enable_gtk = auto ; then
    789    PKG_CHECK_MODULES(GTK, [gtk+-2.0 pixman-1], [enable_gtk=yes], [enable_gtk=no])
    790 fi
    791 
    792 AM_CONDITIONAL(HAVE_GTK, [test "x$enable_gtk" = xyes])
    793 
    794 AC_SUBST(GTK_CFLAGS)
    795 AC_SUBST(GTK_LIBS)
    796 
    797 dnl =====================================
    798 dnl posix_memalign, sigaction, alarm, gettimeofday
    799 
    800 AC_CHECK_FUNC(posix_memalign, have_posix_memalign=yes, have_posix_memalign=no)
    801 if test x$have_posix_memalign = xyes; then
    802    AC_DEFINE(HAVE_POSIX_MEMALIGN, 1, [Whether we have posix_memalign()])
    803 fi
    804 
    805 AC_CHECK_FUNC(sigaction, have_sigaction=yes, have_sigaction=no)
    806 if test x$have_sigaction = xyes; then
    807    AC_DEFINE(HAVE_SIGACTION, 1, [Whether we have sigaction()])
    808 fi
    809 
    810 AC_CHECK_FUNC(alarm, have_alarm=yes, have_alarm=no)
    811 if test x$have_alarm = xyes; then
    812    AC_DEFINE(HAVE_ALARM, 1, [Whether we have alarm()])
    813 fi
    814 
    815 AC_CHECK_HEADER([sys/mman.h],
    816    [AC_DEFINE(HAVE_SYS_MMAN_H, [1], [Define to 1 if we have <sys/mman.h>])])
    817 
    818 AC_CHECK_FUNC(mmap, have_mmap=yes, have_mmap=no)
    819 if test x$have_mmap = xyes; then
    820    AC_DEFINE(HAVE_MMAP, 1, [Whether we have mmap()])
    821 fi
    822 
    823 AC_CHECK_FUNC(mprotect, have_mprotect=yes, have_mprotect=no)
    824 if test x$have_mprotect = xyes; then
    825    AC_DEFINE(HAVE_MPROTECT, 1, [Whether we have mprotect()])
    826 fi
    827 
    828 AC_CHECK_FUNC(getpagesize, have_getpagesize=yes, have_getpagesize=no)
    829 if test x$have_getpagesize = xyes; then
    830    AC_DEFINE(HAVE_GETPAGESIZE, 1, [Whether we have getpagesize()])
    831 fi
    832 
    833 AC_CHECK_HEADER([fenv.h],
    834    [AC_DEFINE(HAVE_FENV_H, [1], [Define to 1 if we have <fenv.h>])])
    835 
    836 AC_CHECK_LIB(m, feenableexcept, have_feenableexcept=yes, have_feenableexcept=no)
    837 if test x$have_feenableexcept = xyes; then
    838    AC_DEFINE(HAVE_FEENABLEEXCEPT, 1, [Whether we have feenableexcept()])
    839 fi
    840 
    841 AC_CHECK_FUNC(gettimeofday, have_gettimeofday=yes, have_gettimeofday=no)
    842 AC_CHECK_HEADER(sys/time.h, have_sys_time_h=yes, have_sys_time_h=no)
    843 if test x$have_gettimeofday = xyes && test x$have_sys_time_h = xyes; then
    844    AC_DEFINE(HAVE_GETTIMEOFDAY, 1, [Whether we have gettimeofday()])
    845 fi
    846 
    847 dnl =====================================
    848 dnl Check for missing sqrtf() as, e.g., for Solaris 9
    849 
    850 AC_SEARCH_LIBS([sqrtf], [m], [],
    851                [AC_DEFINE([sqrtf], [sqrt],
    852                           [Define to sqrt if you do not have the `sqrtf' function.])])
    853 
    854 dnl =====================================
    855 dnl Thread local storage
    856 
    857 AC_MSG_CHECKING(for thread local storage (TLS) support)
    858 AC_CACHE_VAL(ac_cv_tls, [
    859     ac_cv_tls=none
    860     keywords="__thread __declspec(thread)"
    861     for kw in $keywords ; do
    862         AC_TRY_COMPILE([
    863 #if defined(__MINGW32__) && !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))
    864 #error This MinGW version has broken __thread support
    865 #endif
    866 #ifdef __OpenBSD__
    867 #error OpenBSD has broken __thread support
    868 #endif
    869 
    870 int $kw test;], [], [ac_cv_tls=$kw; break])
    871     done
    872 ])
    873 AC_MSG_RESULT($ac_cv_tls)
    874 
    875 if test "$ac_cv_tls" != "none"; then
    876     AC_DEFINE_UNQUOTED([TLS], $ac_cv_tls, [The compiler supported TLS storage class])
    877 fi
    878 
    879 dnl
    880 dnl posix tls
    881 dnl
    882 
    883 m4_define([pthread_test_program],AC_LANG_SOURCE([[dnl
    884 #include <stdlib.h>
    885 #include <pthread.h>
    886 
    887 static pthread_once_t once_control = PTHREAD_ONCE_INIT;
    888 static pthread_key_t key;
    889 
    890 static void
    891 make_key (void)
    892 {
    893     pthread_key_create (&key, NULL);
    894 }
    895 
    896 int
    897 main ()
    898 {
    899     void *value = NULL;
    900 
    901     if (pthread_once (&once_control, make_key) != 0)
    902     {
    903 	value = NULL;
    904     }
    905     else
    906     {
    907 	value = pthread_getspecific (key);
    908 	if (!value)
    909 	{
    910 	    value = malloc (100);
    911 	    pthread_setspecific (key, value);
    912 	}
    913     }
    914     return 0;
    915 }
    916 ]]))
    917 
    918 AC_DEFUN([PIXMAN_CHECK_PTHREAD],[dnl
    919     if test "z$support_for_pthread_setspecific" != "zyes"; then
    920 	PIXMAN_LINK_WITH_ENV(
    921 		[$1], [pthread_test_program],
    922 		[PTHREAD_CFLAGS="$CFLAGS"
    923 		 PTHREAD_LIBS="$LIBS"
    924 		 PTHREAD_LDFLAGS="$LDFLAGS"
    925 		 support_for_pthread_setspecific=yes])
    926     fi
    927 ])
    928 
    929 if test $ac_cv_tls = none ; then
    930     support_for_pthread_setspecific=no
    931 
    932     AC_MSG_CHECKING(for pthread_setspecific)
    933 
    934     PIXMAN_CHECK_PTHREAD([CFLAGS="-pthread"; LDFLAGS="-pthread"])
    935     PIXMAN_CHECK_PTHREAD([CFLAGS="-D_REENTRANT"; LIBS="-lpthread"])
    936     PIXMAN_CHECK_PTHREAD([CFLAGS="-D_REENTRANT"; LDFLAGS="-lroot"])
    937     
    938     if test $support_for_pthread_setspecific = yes; then
    939 	CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
    940 	AC_DEFINE([HAVE_PTHREAD_SETSPECIFIC], [], [Whether pthread_setspecific() is supported])
    941     fi
    942 
    943     AC_MSG_RESULT($support_for_pthread_setspecific);
    944 fi
    945 
    946 AC_SUBST(TOOLCHAIN_SUPPORTS__THREAD)
    947 AC_SUBST(HAVE_PTHREAD_SETSPECIFIC)
    948 AC_SUBST(PTHREAD_LDFLAGS)
    949 AC_SUBST(PTHREAD_LIBS)
    950 
    951 dnl =====================================
    952 dnl __attribute__((constructor))
    953 
    954 support_for_attribute_constructor=no
    955 
    956 AC_MSG_CHECKING(for __attribute__((constructor)))
    957 AC_LINK_IFELSE([AC_LANG_SOURCE([[
    958 #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7))
    959 /* attribute 'constructor' is supported since gcc 2.7, but some compilers
    960  * may only pretend to be gcc, so let's try to actually use it
    961  */
    962 static int x = 1;
    963 static void __attribute__((constructor)) constructor_function () { x = 0; }
    964 int main (void) { return x; }
    965 #else
    966 #error not gcc or gcc version is older than 2.7
    967 #endif
    968 ]])], support_for_attribute_constructor=yes)
    969 
    970 if test x$support_for_attribute_constructor = xyes; then
    971    AC_DEFINE([TOOLCHAIN_SUPPORTS_ATTRIBUTE_CONSTRUCTOR],
    972              [],[Whether the tool chain supports __attribute__((constructor))])
    973 fi
    974 
    975 AC_MSG_RESULT($support_for_attribute_constructor)
    976 AC_SUBST(TOOLCHAIN_SUPPORTS_ATTRIBUTE_CONSTRUCTOR)
    977 
    978 dnl =====================================
    979 dnl __float128
    980 
    981 support_for_float128=no
    982 
    983 AC_MSG_CHECKING(for __float128)
    984 AC_LINK_IFELSE([AC_LANG_SOURCE([[
    985 __float128 a = 1.0Q, b = 2.0Q; int main (void) { return a + b; }
    986 ]])], support_for_float128=yes)
    987 
    988 if test x$support_for_float128 = xyes; then
    989    AC_DEFINE([HAVE_FLOAT128], [], [Whether the tool chain supports __float128])
    990 fi
    991 
    992 AC_MSG_RESULT($support_for_float128)
    993 
    994 dnl ==================
    995 dnl libpng
    996 
    997 AC_ARG_ENABLE(libpng, AS_HELP_STRING([--enable-libpng], [Build support for libpng (default: auto)]),
    998                       [have_libpng=$enableval], [have_libpng=auto])
    999 
   1000 case x$have_libpng in
   1001 	xyes) PKG_CHECK_MODULES(PNG, [libpng]) ;;
   1002 	xno) ;;
   1003 	*) PKG_CHECK_MODULES(PNG, [libpng], have_libpng=yes, have_libpng=no) ;;
   1004 esac
   1005 
   1006 if test x$have_libpng = xyes; then
   1007     AC_DEFINE([HAVE_LIBPNG], [1], [Whether we have libpng])
   1008 fi
   1009 
   1010 AC_SUBST(HAVE_LIBPNG)
   1011 
   1012 AC_OUTPUT([pixman-1.pc
   1013            pixman-1-uninstalled.pc
   1014            Makefile
   1015 	   pixman/Makefile
   1016 	   pixman/pixman-version.h
   1017 	   demos/Makefile
   1018 	   test/Makefile])
   1019 
   1020 m4_if(m4_eval(pixman_minor % 2), [1], [
   1021    echo
   1022    echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
   1023    echo
   1024    echo "      Thanks for testing this development snapshot of pixman. Please"
   1025    echo "      report any problems you find, either by sending email to "
   1026    echo
   1027    echo "          pixman (a] lists.freedesktop.org"
   1028    echo
   1029    echo "      or by filing a bug at "
   1030    echo
   1031    echo "          https://bugs.freedesktop.org/enter_bug.cgi?product=pixman "
   1032    echo
   1033    echo "      If you are looking for a stable release of pixman, please note "
   1034    echo "      that stable releases have _even_ minor version numbers. Ie., "
   1035    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 "
   1036    echo "      development snapshot that may contain bugs and experimental "
   1037    echo "      features. "
   1038    echo 
   1039    echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
   1040    echo
   1041 ])
   1042