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