configure.ac revision 748dfac7788e3cbc2fc6d36196a81d3f002669f6
1dnl Process this file with autoconf to produce a configure script. 2AC_INIT([Makefile.in]) 3 4dnl ============================================================================ 5dnl Custom macro definitions. 6 7dnl JE_CFLAGS_APPEND(cflag) 8AC_DEFUN([JE_CFLAGS_APPEND], 9[ 10AC_MSG_CHECKING([whether compiler supports $1]) 11TCFLAGS="${CFLAGS}" 12if test "x${CFLAGS}" = "x" ; then 13 CFLAGS="$1" 14else 15 CFLAGS="${CFLAGS} $1" 16fi 17AC_COMPILE_IFELSE([AC_LANG_PROGRAM( 18[[ 19]], [[ 20 return 0; 21]])], 22 AC_MSG_RESULT([yes]), 23 AC_MSG_RESULT([no]) 24 [CFLAGS="${TCFLAGS}"] 25) 26]) 27 28dnl JE_COMPILABLE(label, hcode, mcode, rvar) 29dnl 30dnl Use AC_LINK_IFELSE() rather than AC_COMPILE_IFELSE() so that linker errors 31dnl cause failure. 32AC_DEFUN([JE_COMPILABLE], 33[ 34AC_CACHE_CHECK([whether $1 is compilable], 35 [$4], 36 [AC_LINK_IFELSE([AC_LANG_PROGRAM([$2], 37 [$3])], 38 [$4=yes], 39 [$4=no])]) 40]) 41 42dnl ============================================================================ 43 44dnl Library revision. 45rev=1 46AC_SUBST([rev]) 47 48srcroot=$srcdir 49if test "x${srcroot}" = "x." ; then 50 srcroot="" 51else 52 srcroot="${srcroot}/" 53fi 54AC_SUBST([srcroot]) 55abs_srcroot="`cd \"${srcdir}\"; pwd`/" 56AC_SUBST([abs_srcroot]) 57 58objroot="" 59AC_SUBST([objroot]) 60abs_objroot="`pwd`/" 61AC_SUBST([abs_objroot]) 62 63dnl Munge install path variables. 64if test "x$prefix" = "xNONE" ; then 65 prefix="/usr/local" 66fi 67if test "x$exec_prefix" = "xNONE" ; then 68 exec_prefix=$prefix 69fi 70PREFIX=$prefix 71AC_SUBST([PREFIX]) 72BINDIR=`eval echo $bindir` 73BINDIR=`eval echo $BINDIR` 74AC_SUBST([BINDIR]) 75INCLUDEDIR=`eval echo $includedir` 76INCLUDEDIR=`eval echo $INCLUDEDIR` 77AC_SUBST([INCLUDEDIR]) 78LIBDIR=`eval echo $libdir` 79LIBDIR=`eval echo $LIBDIR` 80AC_SUBST([LIBDIR]) 81DATADIR=`eval echo $datadir` 82DATADIR=`eval echo $DATADIR` 83AC_SUBST([DATADIR]) 84MANDIR=`eval echo $mandir` 85MANDIR=`eval echo $MANDIR` 86AC_SUBST([MANDIR]) 87 88dnl Support for building documentation. 89AC_PATH_PROG([XSLTPROC], [xsltproc], [false], [$PATH]) 90if test -d "/usr/share/xml/docbook/stylesheet/docbook-xsl" ; then 91 DEFAULT_XSLROOT="/usr/share/xml/docbook/stylesheet/docbook-xsl" 92elif test -d "/usr/share/sgml/docbook/xsl-stylesheets" ; then 93 DEFAULT_XSLROOT="/usr/share/sgml/docbook/xsl-stylesheets" 94else 95 dnl Documentation building will fail if this default gets used. 96 DEFAULT_XSLROOT="" 97fi 98AC_ARG_WITH([xslroot], 99 [AS_HELP_STRING([--with-xslroot=<path>], [XSL stylesheet root path])], [ 100if test "x$with_xslroot" = "xno" ; then 101 XSLROOT="${DEFAULT_XSLROOT}" 102else 103 XSLROOT="${with_xslroot}" 104fi 105], 106 XSLROOT="${DEFAULT_XSLROOT}" 107) 108AC_SUBST([XSLROOT]) 109 110dnl If CFLAGS isn't defined, set CFLAGS to something reasonable. Otherwise, 111dnl just prevent autoconf from molesting CFLAGS. 112CFLAGS=$CFLAGS 113AC_PROG_CC 114if test "x$GCC" != "xyes" ; then 115 AC_CACHE_CHECK([whether compiler is MSVC], 116 [je_cv_msvc], 117 [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], 118 [ 119#ifndef _MSC_VER 120 int fail[-1]; 121#endif 122])], 123 [je_cv_msvc=yes], 124 [je_cv_msvc=no])]) 125fi 126 127if test "x$CFLAGS" = "x" ; then 128 no_CFLAGS="yes" 129 if test "x$GCC" = "xyes" ; then 130 JE_CFLAGS_APPEND([-std=gnu99]) 131 JE_CFLAGS_APPEND([-Wall]) 132 JE_CFLAGS_APPEND([-pipe]) 133 JE_CFLAGS_APPEND([-g3]) 134 elif test "x$je_cv_msvc" = "xyes" ; then 135 CC="$CC -nologo" 136 JE_CFLAGS_APPEND([-Zi]) 137 JE_CFLAGS_APPEND([-MT]) 138 JE_CFLAGS_APPEND([-W3]) 139 CPPFLAGS="$CPPFLAGS -I${srcroot}/include/msvc_compat" 140 fi 141fi 142dnl Append EXTRA_CFLAGS to CFLAGS, if defined. 143if test "x$EXTRA_CFLAGS" != "x" ; then 144 JE_CFLAGS_APPEND([$EXTRA_CFLAGS]) 145fi 146AC_PROG_CPP 147 148AC_CHECK_SIZEOF([void *]) 149if test "x${ac_cv_sizeof_void_p}" = "x8" ; then 150 LG_SIZEOF_PTR=3 151elif test "x${ac_cv_sizeof_void_p}" = "x4" ; then 152 LG_SIZEOF_PTR=2 153else 154 AC_MSG_ERROR([Unsupported pointer size: ${ac_cv_sizeof_void_p}]) 155fi 156AC_DEFINE_UNQUOTED([LG_SIZEOF_PTR], [$LG_SIZEOF_PTR]) 157 158AC_CHECK_SIZEOF([int]) 159if test "x${ac_cv_sizeof_int}" = "x8" ; then 160 LG_SIZEOF_INT=3 161elif test "x${ac_cv_sizeof_int}" = "x4" ; then 162 LG_SIZEOF_INT=2 163else 164 AC_MSG_ERROR([Unsupported int size: ${ac_cv_sizeof_int}]) 165fi 166AC_DEFINE_UNQUOTED([LG_SIZEOF_INT], [$LG_SIZEOF_INT]) 167 168AC_CHECK_SIZEOF([long]) 169if test "x${ac_cv_sizeof_long}" = "x8" ; then 170 LG_SIZEOF_LONG=3 171elif test "x${ac_cv_sizeof_long}" = "x4" ; then 172 LG_SIZEOF_LONG=2 173else 174 AC_MSG_ERROR([Unsupported long size: ${ac_cv_sizeof_long}]) 175fi 176AC_DEFINE_UNQUOTED([LG_SIZEOF_LONG], [$LG_SIZEOF_LONG]) 177 178AC_CHECK_SIZEOF([intmax_t]) 179if test "x${ac_cv_sizeof_intmax_t}" = "x16" ; then 180 LG_SIZEOF_INTMAX_T=4 181elif test "x${ac_cv_sizeof_intmax_t}" = "x8" ; then 182 LG_SIZEOF_INTMAX_T=3 183elif test "x${ac_cv_sizeof_intmax_t}" = "x4" ; then 184 LG_SIZEOF_INTMAX_T=2 185else 186 AC_MSG_ERROR([Unsupported intmax_t size: ${ac_cv_sizeof_intmax_t}]) 187fi 188AC_DEFINE_UNQUOTED([LG_SIZEOF_INTMAX_T], [$LG_SIZEOF_INTMAX_T]) 189 190AC_CANONICAL_HOST 191dnl CPU-specific settings. 192CPU_SPINWAIT="" 193case "${host_cpu}" in 194 i[[345]]86) 195 ;; 196 i686) 197 JE_COMPILABLE([__asm__], [], [[__asm__ volatile("pause"); return 0;]], 198 [je_cv_asm]) 199 if test "x${je_cv_asm}" = "xyes" ; then 200 CPU_SPINWAIT='__asm__ volatile("pause")' 201 fi 202 ;; 203 x86_64) 204 JE_COMPILABLE([__asm__ syntax], [], 205 [[__asm__ volatile("pause"); return 0;]], [je_cv_asm]) 206 if test "x${je_cv_asm}" = "xyes" ; then 207 CPU_SPINWAIT='__asm__ volatile("pause")' 208 fi 209 ;; 210 *) 211 ;; 212esac 213AC_DEFINE_UNQUOTED([CPU_SPINWAIT], [$CPU_SPINWAIT]) 214 215LD_PRELOAD_VAR="LD_PRELOAD" 216so="so" 217importlib="${so}" 218o="$ac_objext" 219a="a" 220exe="$ac_exeext" 221libprefix="lib" 222DSO_LDFLAGS='-shared -Wl,-soname,$(@F)' 223RPATH='-Wl,-rpath,$(1)' 224SOREV="${so}.${rev}" 225PIC_CFLAGS='-fPIC -DPIC' 226CTARGET='-o $@' 227LDTARGET='-o $@' 228EXTRA_LDFLAGS= 229ARFLAGS='crus' 230AROUT=' $@' 231CC_MM=1 232 233AN_MAKEVAR([AR], [AC_PROG_AR]) 234AN_PROGRAM([ar], [AC_PROG_AR]) 235AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL(AR, ar, :)]) 236AC_PROG_AR 237 238dnl Platform-specific settings. abi and RPATH can probably be determined 239dnl programmatically, but doing so is error-prone, which makes it generally 240dnl not worth the trouble. 241dnl 242dnl Define cpp macros in CPPFLAGS, rather than doing AC_DEFINE(macro), since the 243dnl definitions need to be seen before any headers are included, which is a pain 244dnl to make happen otherwise. 245default_munmap="1" 246JEMALLOC_USABLE_SIZE_CONST="const" 247case "${host}" in 248 *-*-darwin*) 249 CFLAGS="$CFLAGS" 250 abi="macho" 251 AC_DEFINE([JEMALLOC_PURGE_MADVISE_FREE], [ ]) 252 RPATH="" 253 LD_PRELOAD_VAR="DYLD_INSERT_LIBRARIES" 254 so="dylib" 255 importlib="${so}" 256 force_tls="0" 257 DSO_LDFLAGS='-shared -Wl,-dylib_install_name,$(@F)' 258 SOREV="${rev}.${so}" 259 sbrk_deprecated="1" 260 ;; 261 *-*-freebsd*) 262 CFLAGS="$CFLAGS" 263 abi="elf" 264 AC_DEFINE([JEMALLOC_PURGE_MADVISE_FREE], [ ]) 265 force_lazy_lock="1" 266 ;; 267 *-*-linux*) 268 CFLAGS="$CFLAGS" 269 CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE" 270 abi="elf" 271 AC_DEFINE([JEMALLOC_HAS_ALLOCA_H]) 272 AC_DEFINE([JEMALLOC_PURGE_MADVISE_DONTNEED], [ ]) 273 AC_DEFINE([JEMALLOC_THREADED_INIT], [ ]) 274 JEMALLOC_USABLE_SIZE_CONST="" 275 default_munmap="0" 276 ;; 277 *-*-netbsd*) 278 AC_MSG_CHECKING([ABI]) 279 AC_COMPILE_IFELSE([AC_LANG_PROGRAM( 280[[#ifdef __ELF__ 281/* ELF */ 282#else 283#error aout 284#endif 285]])], 286 [CFLAGS="$CFLAGS"; abi="elf"], 287 [abi="aout"]) 288 AC_MSG_RESULT([$abi]) 289 AC_DEFINE([JEMALLOC_PURGE_MADVISE_FREE], [ ]) 290 ;; 291 *-*-solaris2*) 292 CFLAGS="$CFLAGS" 293 abi="elf" 294 RPATH='-Wl,-R,$(1)' 295 dnl Solaris needs this for sigwait(). 296 CPPFLAGS="$CPPFLAGS -D_POSIX_PTHREAD_SEMANTICS" 297 LIBS="$LIBS -lposix4 -lsocket -lnsl" 298 ;; 299 *-ibm-aix*) 300 if "$LG_SIZEOF_PTR" = "8"; then 301 dnl 64bit AIX 302 LD_PRELOAD_VAR="LDR_PRELOAD64" 303 else 304 dnl 32bit AIX 305 LD_PRELOAD_VAR="LDR_PRELOAD" 306 fi 307 abi="xcoff" 308 ;; 309 *-*-mingw*) 310 abi="pecoff" 311 force_tls="0" 312 RPATH="" 313 so="dll" 314 if test "x$je_cv_msvc" = "xyes" ; then 315 importlib="lib" 316 DSO_LDFLAGS="-LD" 317 EXTRA_LDFLAGS="-link -DEBUG" 318 CTARGET='-Fo$@' 319 LDTARGET='-Fe$@' 320 AR='lib' 321 ARFLAGS='-nologo -out:' 322 AROUT='$@' 323 CC_MM= 324 else 325 importlib="${so}" 326 DSO_LDFLAGS="-shared" 327 fi 328 a="lib" 329 libprefix="" 330 SOREV="${so}" 331 PIC_CFLAGS="" 332 ;; 333 *) 334 AC_MSG_RESULT([Unsupported operating system: ${host}]) 335 abi="elf" 336 ;; 337esac 338AC_DEFINE_UNQUOTED([JEMALLOC_USABLE_SIZE_CONST], [$JEMALLOC_USABLE_SIZE_CONST]) 339AC_SUBST([abi]) 340AC_SUBST([RPATH]) 341AC_SUBST([LD_PRELOAD_VAR]) 342AC_SUBST([so]) 343AC_SUBST([importlib]) 344AC_SUBST([o]) 345AC_SUBST([a]) 346AC_SUBST([exe]) 347AC_SUBST([libprefix]) 348AC_SUBST([DSO_LDFLAGS]) 349AC_SUBST([EXTRA_LDFLAGS]) 350AC_SUBST([SOREV]) 351AC_SUBST([PIC_CFLAGS]) 352AC_SUBST([CTARGET]) 353AC_SUBST([LDTARGET]) 354AC_SUBST([MKLIB]) 355AC_SUBST([ARFLAGS]) 356AC_SUBST([AROUT]) 357AC_SUBST([CC_MM]) 358 359JE_COMPILABLE([__attribute__ syntax], 360 [static __attribute__((unused)) void foo(void){}], 361 [], 362 [je_cv_attribute]) 363if test "x${je_cv_attribute}" = "xyes" ; then 364 AC_DEFINE([JEMALLOC_HAVE_ATTR], [ ]) 365 if test "x${GCC}" = "xyes" -a "x${abi}" = "xelf"; then 366 JE_CFLAGS_APPEND([-fvisibility=hidden]) 367 fi 368fi 369dnl Check for tls_model attribute support (clang 3.0 still lacks support). 370SAVED_CFLAGS="${CFLAGS}" 371JE_CFLAGS_APPEND([-Werror]) 372JE_COMPILABLE([tls_model attribute], [], 373 [static __thread int 374 __attribute__((tls_model("initial-exec"))) foo; 375 foo = 0;], 376 [je_cv_tls_model]) 377CFLAGS="${SAVED_CFLAGS}" 378if test "x${je_cv_tls_model}" = "xyes" ; then 379 AC_DEFINE([JEMALLOC_TLS_MODEL], 380 [__attribute__((tls_model("initial-exec")))]) 381else 382 AC_DEFINE([JEMALLOC_TLS_MODEL], [ ]) 383fi 384 385dnl Support optional additions to rpath. 386AC_ARG_WITH([rpath], 387 [AS_HELP_STRING([--with-rpath=<rpath>], [Colon-separated rpath (ELF systems only)])], 388if test "x$with_rpath" = "xno" ; then 389 RPATH_EXTRA= 390else 391 RPATH_EXTRA="`echo $with_rpath | tr \":\" \" \"`" 392fi, 393 RPATH_EXTRA= 394) 395AC_SUBST([RPATH_EXTRA]) 396 397dnl Disable rules that do automatic regeneration of configure output by default. 398AC_ARG_ENABLE([autogen], 399 [AS_HELP_STRING([--enable-autogen], [Automatically regenerate configure output])], 400if test "x$enable_autogen" = "xno" ; then 401 enable_autogen="0" 402else 403 enable_autogen="1" 404fi 405, 406enable_autogen="0" 407) 408AC_SUBST([enable_autogen]) 409 410AC_PROG_INSTALL 411AC_PROG_RANLIB 412AC_PATH_PROG([LD], [ld], [false], [$PATH]) 413AC_PATH_PROG([AUTOCONF], [autoconf], [false], [$PATH]) 414 415public_syms="malloc_conf malloc_message malloc calloc posix_memalign aligned_alloc realloc free malloc_usable_size malloc_stats_print mallctl mallctlnametomib mallctlbymib" 416 417dnl Check for allocator-related functions that should be wrapped. 418AC_CHECK_FUNC([memalign], 419 [AC_DEFINE([JEMALLOC_OVERRIDE_MEMALIGN], [ ]) 420 public_syms="${public_syms} memalign"]) 421AC_CHECK_FUNC([valloc], 422 [AC_DEFINE([JEMALLOC_OVERRIDE_VALLOC], [ ]) 423 public_syms="${public_syms} valloc"]) 424 425dnl Support the experimental API by default. 426AC_ARG_ENABLE([experimental], 427 [AS_HELP_STRING([--disable-experimental], 428 [Disable support for the experimental API])], 429[if test "x$enable_experimental" = "xno" ; then 430 enable_experimental="0" 431else 432 enable_experimental="1" 433fi 434], 435[enable_experimental="1"] 436) 437if test "x$enable_experimental" = "x1" ; then 438 AC_DEFINE([JEMALLOC_EXPERIMENTAL], [ ]) 439 public_syms="${public_syms} allocm dallocm nallocm rallocm sallocm" 440fi 441AC_SUBST([enable_experimental]) 442 443dnl Do not compute test code coverage by default. 444GCOV_FLAGS= 445AC_ARG_ENABLE([code-coverage], 446 [AS_HELP_STRING([--enable-code-coverage], 447 [Enable code coverage])], 448[if test "x$enable_code_coverage" = "xno" ; then 449 enable_code_coverage="0" 450else 451 enable_code_coverage="1" 452fi 453], 454[enable_code_coverage="0"] 455) 456if test "x$enable_code_coverage" = "x1" ; then 457 deoptimize="no" 458 echo "$CFLAGS $EXTRA_CFLAGS" | grep '\-O' >/dev/null || deoptimize="yes" 459 if test "x${deoptimize}" = "xyes" ; then 460 JE_CFLAGS_APPEND([-O0]) 461 fi 462 JE_CFLAGS_APPEND([-fprofile-arcs -ftest-coverage]) 463 EXTRA_LDFLAGS="$EXTRA_LDFLAGS -fprofile-arcs -ftest-coverage" 464 AC_DEFINE([JEMALLOC_CODE_COVERAGE], [ ]) 465fi 466AC_SUBST([enable_code_coverage]) 467 468dnl Perform no name mangling by default. 469AC_ARG_WITH([mangling], 470 [AS_HELP_STRING([--with-mangling=<map>], [Mangle symbols in <map>])], 471 [mangling_map="$with_mangling"], [mangling_map=""]) 472for nm in `echo ${mangling_map} |tr ',' ' '` ; do 473 k="`echo ${nm} |tr ':' ' ' |awk '{print $1}'`" 474 n="je_${k}" 475 m=`echo ${nm} |tr ':' ' ' |awk '{print $2}'` 476 AC_DEFINE_UNQUOTED([${n}], [${m}]) 477 dnl Remove key from public_syms so that it isn't redefined later. 478 public_syms=`for sym in ${public_syms}; do echo "${sym}"; done |grep -v "^${k}\$" |tr '\n' ' '` 479done 480 481dnl Do not prefix public APIs by default. 482AC_ARG_WITH([jemalloc_prefix], 483 [AS_HELP_STRING([--with-jemalloc-prefix=<prefix>], [Prefix to prepend to all public APIs])], 484 [JEMALLOC_PREFIX="$with_jemalloc_prefix"], 485 [if test "x$abi" != "xmacho" -a "x$abi" != "xpecoff"; then 486 JEMALLOC_PREFIX="" 487else 488 JEMALLOC_PREFIX="je_" 489fi] 490) 491if test "x$JEMALLOC_PREFIX" != "x" ; then 492 JEMALLOC_CPREFIX=`echo ${JEMALLOC_PREFIX} | tr "a-z" "A-Z"` 493 AC_DEFINE_UNQUOTED([JEMALLOC_PREFIX], ["$JEMALLOC_PREFIX"]) 494 AC_DEFINE_UNQUOTED([JEMALLOC_CPREFIX], ["$JEMALLOC_CPREFIX"]) 495fi 496dnl Generate macros to rename public symbols. All public symbols are prefixed 497dnl with je_ in the source code, so these macro definitions are needed even if 498dnl --with-jemalloc-prefix wasn't specified. 499for stem in ${public_syms}; do 500 n="je_${stem}" 501 m="${JEMALLOC_PREFIX}${stem}" 502 AC_DEFINE_UNQUOTED([${n}], [${m}]) 503done 504 505AC_ARG_WITH([export], 506 [AS_HELP_STRING([--without-export], [disable exporting jemalloc public APIs])], 507 [if test "x$with_export" = "xno"; then 508 AC_DEFINE([JEMALLOC_EXPORT],[]) 509fi] 510) 511 512dnl Mangle library-private APIs. 513AC_ARG_WITH([private_namespace], 514 [AS_HELP_STRING([--with-private-namespace=<prefix>], [Prefix to prepend to all library-private APIs])], 515 [JEMALLOC_PRIVATE_NAMESPACE="${with_private_namespace}je_"], 516 [JEMALLOC_PRIVATE_NAMESPACE="je_"] 517) 518AC_DEFINE_UNQUOTED([JEMALLOC_PRIVATE_NAMESPACE], [$JEMALLOC_PRIVATE_NAMESPACE]) 519private_namespace="$JEMALLOC_PRIVATE_NAMESPACE" 520AC_SUBST([private_namespace]) 521 522dnl Do not add suffix to installed files by default. 523AC_ARG_WITH([install_suffix], 524 [AS_HELP_STRING([--with-install-suffix=<suffix>], [Suffix to append to all installed files])], 525 [INSTALL_SUFFIX="$with_install_suffix"], 526 [INSTALL_SUFFIX=] 527) 528install_suffix="$INSTALL_SUFFIX" 529AC_SUBST([install_suffix]) 530 531dnl Substitute @je_@ in jemalloc_protos.h.in, primarily to make generation of 532dnl jemalloc_protos_jet.h easy. 533je_="je_" 534AC_SUBST([je_]) 535 536cfgoutputs_in="${srcroot}Makefile.in" 537cfgoutputs_in="${cfgoutputs_in} ${srcroot}doc/html.xsl.in" 538cfgoutputs_in="${cfgoutputs_in} ${srcroot}doc/manpages.xsl.in" 539cfgoutputs_in="${cfgoutputs_in} ${srcroot}doc/jemalloc.xml.in" 540cfgoutputs_in="${cfgoutputs_in} ${srcroot}include/jemalloc/jemalloc_macros.h.in" 541cfgoutputs_in="${cfgoutputs_in} ${srcroot}include/jemalloc/jemalloc_protos.h.in" 542cfgoutputs_in="${cfgoutputs_in} ${srcroot}include/jemalloc/jemalloc_mangle.h.in" 543cfgoutputs_in="${cfgoutputs_in} ${srcroot}include/jemalloc/internal/jemalloc_internal.h.in" 544cfgoutputs_in="${cfgoutputs_in} ${srcroot}test/test.sh.in" 545cfgoutputs_in="${cfgoutputs_in} ${srcroot}test/include/test/jemalloc_test.h.in" 546 547cfgoutputs_out="Makefile" 548cfgoutputs_out="${cfgoutputs_out} doc/html.xsl" 549cfgoutputs_out="${cfgoutputs_out} doc/manpages.xsl" 550cfgoutputs_out="${cfgoutputs_out} doc/jemalloc.xml" 551cfgoutputs_out="${cfgoutputs_out} include/jemalloc/jemalloc_macros.h" 552cfgoutputs_out="${cfgoutputs_out} include/jemalloc/jemalloc_protos.h" 553cfgoutputs_out="${cfgoutputs_out} include/jemalloc/jemalloc_mangle.h" 554cfgoutputs_out="${cfgoutputs_out} include/jemalloc/internal/jemalloc_internal.h" 555cfgoutputs_out="${cfgoutputs_out} test/test.sh" 556cfgoutputs_out="${cfgoutputs_out} test/include/test/jemalloc_test.h" 557 558cfgoutputs_tup="Makefile" 559cfgoutputs_tup="${cfgoutputs_tup} doc/html.xsl:doc/html.xsl.in" 560cfgoutputs_tup="${cfgoutputs_tup} doc/manpages.xsl:doc/manpages.xsl.in" 561cfgoutputs_tup="${cfgoutputs_tup} doc/jemalloc.xml:doc/jemalloc.xml.in" 562cfgoutputs_tup="${cfgoutputs_tup} include/jemalloc/jemalloc_macros.h:include/jemalloc/jemalloc_macros.h.in" 563cfgoutputs_tup="${cfgoutputs_tup} include/jemalloc/jemalloc_protos.h:include/jemalloc/jemalloc_protos.h.in" 564cfgoutputs_tup="${cfgoutputs_tup} include/jemalloc/jemalloc_mangle.h:include/jemalloc/jemalloc_mangle.h.in" 565cfgoutputs_tup="${cfgoutputs_tup} include/jemalloc/internal/jemalloc_internal.h" 566cfgoutputs_tup="${cfgoutputs_tup} test/test.sh:test/test.sh.in" 567cfgoutputs_tup="${cfgoutputs_tup} test/include/test/jemalloc_test.h:test/include/test/jemalloc_test.h.in" 568 569cfghdrs_in="${srcroot}include/jemalloc/jemalloc_defs.h.in" 570cfghdrs_in="${cfghdrs_in} ${srcroot}include/jemalloc/internal/jemalloc_internal_defs.h.in" 571cfghdrs_in="${cfghdrs_in} ${srcroot}include/jemalloc/internal/private_namespace.sh" 572cfghdrs_in="${cfghdrs_in} ${srcroot}include/jemalloc/internal/private_unnamespace.sh" 573cfghdrs_in="${cfghdrs_in} ${srcroot}include/jemalloc/internal/public_namespace.sh" 574cfghdrs_in="${cfghdrs_in} ${srcroot}include/jemalloc/internal/public_unnamespace.sh" 575cfghdrs_in="${cfghdrs_in} ${srcroot}include/jemalloc/internal/size_classes.sh" 576cfghdrs_in="${cfghdrs_in} ${srcroot}include/jemalloc/jemalloc.sh" 577 578cfghdrs_out="include/jemalloc/jemalloc_defs.h" 579cfghdrs_out="${cfghdrs_out} include/jemalloc/jemalloc${install_suffix}.h" 580cfghdrs_out="${cfghdrs_out} include/jemalloc/jemalloc_protos_jet.h" 581cfghdrs_out="${cfghdrs_out} include/jemalloc/internal/jemalloc_internal_defs.h" 582cfghdrs_out="${cfghdrs_out} include/jemalloc/internal/private_namespace.h" 583cfghdrs_out="${cfghdrs_out} include/jemalloc/internal/private_unnamespace.h" 584cfghdrs_out="${cfghdrs_out} include/jemalloc/internal/public_namespace.h" 585cfghdrs_out="${cfghdrs_out} include/jemalloc/internal/public_unnamespace.h" 586cfghdrs_out="${cfghdrs_out} include/jemalloc/internal/size_classes.h" 587 588cfghdrs_tup="include/jemalloc/jemalloc_defs.h:include/jemalloc/jemalloc_defs.h.in" 589cfghdrs_tup="${cfghdrs_tup} include/jemalloc/internal/jemalloc_internal_defs.h:${srcroot}include/jemalloc/internal/jemalloc_internal_defs.h.in" 590 591dnl Do not silence irrelevant compiler warnings by default, since enabling this 592dnl option incurs a performance penalty. 593AC_ARG_ENABLE([cc-silence], 594 [AS_HELP_STRING([--enable-cc-silence], 595 [Silence irrelevant compiler warnings])], 596[if test "x$enable_cc_silence" = "xno" ; then 597 enable_cc_silence="0" 598else 599 enable_cc_silence="1" 600fi 601], 602[enable_cc_silence="0"] 603) 604if test "x$enable_cc_silence" = "x1" ; then 605 AC_DEFINE([JEMALLOC_CC_SILENCE], [ ]) 606fi 607 608dnl Do not compile with debugging by default. 609AC_ARG_ENABLE([debug], 610 [AS_HELP_STRING([--enable-debug], [Build debugging code (implies --enable-ivsalloc)])], 611[if test "x$enable_debug" = "xno" ; then 612 enable_debug="0" 613else 614 enable_debug="1" 615fi 616], 617[enable_debug="0"] 618) 619if test "x$enable_debug" = "x1" ; then 620 AC_DEFINE([JEMALLOC_DEBUG], [ ]) 621 enable_ivsalloc="1" 622fi 623AC_SUBST([enable_debug]) 624 625dnl Do not validate pointers by default. 626AC_ARG_ENABLE([ivsalloc], 627 [AS_HELP_STRING([--enable-ivsalloc], [Validate pointers passed through the public API])], 628[if test "x$enable_ivsalloc" = "xno" ; then 629 enable_ivsalloc="0" 630else 631 enable_ivsalloc="1" 632fi 633], 634[enable_ivsalloc="0"] 635) 636if test "x$enable_ivsalloc" = "x1" ; then 637 AC_DEFINE([JEMALLOC_IVSALLOC], [ ]) 638fi 639 640dnl Only optimize if not debugging. 641if test "x$enable_debug" = "x0" -a "x$no_CFLAGS" = "xyes" ; then 642 dnl Make sure that an optimization flag was not specified in EXTRA_CFLAGS. 643 optimize="no" 644 echo "$CFLAGS $EXTRA_CFLAGS" | grep '\-O' >/dev/null || optimize="yes" 645 if test "x${optimize}" = "xyes" ; then 646 if test "x$GCC" = "xyes" ; then 647 JE_CFLAGS_APPEND([-O3]) 648 JE_CFLAGS_APPEND([-funroll-loops]) 649 elif test "x$je_cv_msvc" = "xyes" ; then 650 JE_CFLAGS_APPEND([-O2]) 651 else 652 JE_CFLAGS_APPEND([-O]) 653 fi 654 fi 655fi 656 657dnl Enable statistics calculation by default. 658AC_ARG_ENABLE([stats], 659 [AS_HELP_STRING([--disable-stats], 660 [Disable statistics calculation/reporting])], 661[if test "x$enable_stats" = "xno" ; then 662 enable_stats="0" 663else 664 enable_stats="1" 665fi 666], 667[enable_stats="1"] 668) 669if test "x$enable_stats" = "x1" ; then 670 AC_DEFINE([JEMALLOC_STATS], [ ]) 671fi 672AC_SUBST([enable_stats]) 673 674dnl Do not enable profiling by default. 675AC_ARG_ENABLE([prof], 676 [AS_HELP_STRING([--enable-prof], [Enable allocation profiling])], 677[if test "x$enable_prof" = "xno" ; then 678 enable_prof="0" 679else 680 enable_prof="1" 681fi 682], 683[enable_prof="0"] 684) 685if test "x$enable_prof" = "x1" ; then 686 backtrace_method="" 687else 688 backtrace_method="N/A" 689fi 690 691AC_ARG_ENABLE([prof-libunwind], 692 [AS_HELP_STRING([--enable-prof-libunwind], [Use libunwind for backtracing])], 693[if test "x$enable_prof_libunwind" = "xno" ; then 694 enable_prof_libunwind="0" 695else 696 enable_prof_libunwind="1" 697fi 698], 699[enable_prof_libunwind="0"] 700) 701AC_ARG_WITH([static_libunwind], 702 [AS_HELP_STRING([--with-static-libunwind=<libunwind.a>], 703 [Path to static libunwind library; use rather than dynamically linking])], 704if test "x$with_static_libunwind" = "xno" ; then 705 LUNWIND="-lunwind" 706else 707 if test ! -f "$with_static_libunwind" ; then 708 AC_MSG_ERROR([Static libunwind not found: $with_static_libunwind]) 709 fi 710 LUNWIND="$with_static_libunwind" 711fi, 712 LUNWIND="-lunwind" 713) 714if test "x$backtrace_method" = "x" -a "x$enable_prof_libunwind" = "x1" ; then 715 AC_CHECK_HEADERS([libunwind.h], , [enable_prof_libunwind="0"]) 716 if test "x$LUNWIND" = "x-lunwind" ; then 717 AC_CHECK_LIB([unwind], [backtrace], [LIBS="$LIBS $LUNWIND"], 718 [enable_prof_libunwind="0"]) 719 else 720 LIBS="$LIBS $LUNWIND" 721 fi 722 if test "x${enable_prof_libunwind}" = "x1" ; then 723 backtrace_method="libunwind" 724 AC_DEFINE([JEMALLOC_PROF_LIBUNWIND], [ ]) 725 fi 726fi 727 728AC_ARG_ENABLE([prof-libgcc], 729 [AS_HELP_STRING([--disable-prof-libgcc], 730 [Do not use libgcc for backtracing])], 731[if test "x$enable_prof_libgcc" = "xno" ; then 732 enable_prof_libgcc="0" 733else 734 enable_prof_libgcc="1" 735fi 736], 737[enable_prof_libgcc="1"] 738) 739if test "x$backtrace_method" = "x" -a "x$enable_prof_libgcc" = "x1" \ 740 -a "x$GCC" = "xyes" ; then 741 AC_CHECK_HEADERS([unwind.h], , [enable_prof_libgcc="0"]) 742 AC_CHECK_LIB([gcc], [_Unwind_Backtrace], [LIBS="$LIBS -lgcc"], [enable_prof_libgcc="0"]) 743 dnl The following is conservative, in that it only has entries for CPUs on 744 dnl which jemalloc has been tested. 745 AC_MSG_CHECKING([libgcc-based backtracing reliability on ${host_cpu}]) 746 case "${host_cpu}" in 747 i[[3456]]86) 748 AC_MSG_RESULT([unreliable]) 749 enable_prof_libgcc="0"; 750 ;; 751 x86_64) 752 AC_MSG_RESULT([reliable]) 753 ;; 754 *) 755 AC_MSG_RESULT([unreliable]) 756 enable_prof_libgcc="0"; 757 ;; 758 esac 759 if test "x${enable_prof_libgcc}" = "x1" ; then 760 backtrace_method="libgcc" 761 AC_DEFINE([JEMALLOC_PROF_LIBGCC], [ ]) 762 fi 763else 764 enable_prof_libgcc="0" 765fi 766 767AC_ARG_ENABLE([prof-gcc], 768 [AS_HELP_STRING([--disable-prof-gcc], 769 [Do not use gcc intrinsics for backtracing])], 770[if test "x$enable_prof_gcc" = "xno" ; then 771 enable_prof_gcc="0" 772else 773 enable_prof_gcc="1" 774fi 775], 776[enable_prof_gcc="1"] 777) 778if test "x$backtrace_method" = "x" -a "x$enable_prof_gcc" = "x1" \ 779 -a "x$GCC" = "xyes" ; then 780 backtrace_method="gcc intrinsics" 781 AC_DEFINE([JEMALLOC_PROF_GCC], [ ]) 782else 783 enable_prof_gcc="0" 784fi 785 786if test "x$backtrace_method" = "x" ; then 787 backtrace_method="none (disabling profiling)" 788 enable_prof="0" 789fi 790AC_MSG_CHECKING([configured backtracing method]) 791AC_MSG_RESULT([$backtrace_method]) 792if test "x$enable_prof" = "x1" ; then 793 if test "x${force_tls}" = "x0" ; then 794 AC_MSG_ERROR([Heap profiling requires TLS]); 795 fi 796 force_tls="1" 797 798 if test "x$abi" != "xpecoff"; then 799 dnl Heap profiling uses the log(3) function. 800 LIBS="$LIBS -lm" 801 fi 802 803 AC_DEFINE([JEMALLOC_PROF], [ ]) 804fi 805AC_SUBST([enable_prof]) 806 807dnl Enable thread-specific caching by default. 808AC_ARG_ENABLE([tcache], 809 [AS_HELP_STRING([--disable-tcache], [Disable per thread caches])], 810[if test "x$enable_tcache" = "xno" ; then 811 enable_tcache="0" 812else 813 enable_tcache="1" 814fi 815], 816[enable_tcache="1"] 817) 818if test "x$enable_tcache" = "x1" ; then 819 AC_DEFINE([JEMALLOC_TCACHE], [ ]) 820fi 821AC_SUBST([enable_tcache]) 822 823dnl Disable mremap() for huge realloc() by default. 824AC_ARG_ENABLE([mremap], 825 [AS_HELP_STRING([--enable-mremap], [Enable mremap(2) for huge realloc()])], 826[if test "x$enable_mremap" = "xno" ; then 827 enable_mremap="0" 828else 829 enable_mremap="1" 830fi 831], 832[enable_mremap="0"] 833) 834if test "x$enable_mremap" = "x1" ; then 835 JE_COMPILABLE([mremap(...MREMAP_FIXED...)], [ 836#define _GNU_SOURCE 837#include <sys/mman.h> 838], [ 839void *p = mremap((void *)0, 0, 0, MREMAP_MAYMOVE|MREMAP_FIXED, (void *)0); 840], [je_cv_mremap_fixed]) 841 if test "x${je_cv_mremap_fixed}" = "xno" ; then 842 enable_mremap="0" 843 fi 844fi 845if test "x$enable_mremap" = "x1" ; then 846 AC_DEFINE([JEMALLOC_MREMAP], [ ]) 847fi 848AC_SUBST([enable_mremap]) 849 850dnl Enable VM deallocation via munmap() by default. 851AC_ARG_ENABLE([munmap], 852 [AS_HELP_STRING([--disable-munmap], [Disable VM deallocation via munmap(2)])], 853[if test "x$enable_munmap" = "xno" ; then 854 enable_munmap="0" 855else 856 enable_munmap="1" 857fi 858], 859[enable_munmap="${default_munmap}"] 860) 861if test "x$enable_munmap" = "x1" ; then 862 AC_DEFINE([JEMALLOC_MUNMAP], [ ]) 863fi 864AC_SUBST([enable_munmap]) 865 866dnl Do not enable allocation from DSS by default. 867AC_ARG_ENABLE([dss], 868 [AS_HELP_STRING([--enable-dss], [Enable allocation from DSS])], 869[if test "x$enable_dss" = "xno" ; then 870 enable_dss="0" 871else 872 enable_dss="1" 873fi 874], 875[enable_dss="0"] 876) 877dnl Check whether the BSD/SUSv1 sbrk() exists. If not, disable DSS support. 878AC_CHECK_FUNC([sbrk], [have_sbrk="1"], [have_sbrk="0"]) 879if test "x$have_sbrk" = "x1" ; then 880 if test "x$sbrk_deprecated" == "x1" ; then 881 AC_MSG_RESULT([Disabling dss allocation because sbrk is deprecated]) 882 enable_dss="0" 883 else 884 AC_DEFINE([JEMALLOC_HAVE_SBRK], [ ]) 885 fi 886else 887 enable_dss="0" 888fi 889 890if test "x$enable_dss" = "x1" ; then 891 AC_DEFINE([JEMALLOC_DSS], [ ]) 892fi 893AC_SUBST([enable_dss]) 894 895dnl Support the junk/zero filling option by default. 896AC_ARG_ENABLE([fill], 897 [AS_HELP_STRING([--disable-fill], 898 [Disable support for junk/zero filling, quarantine, and redzones])], 899[if test "x$enable_fill" = "xno" ; then 900 enable_fill="0" 901else 902 enable_fill="1" 903fi 904], 905[enable_fill="1"] 906) 907if test "x$enable_fill" = "x1" ; then 908 AC_DEFINE([JEMALLOC_FILL], [ ]) 909fi 910AC_SUBST([enable_fill]) 911 912dnl Disable utrace(2)-based tracing by default. 913AC_ARG_ENABLE([utrace], 914 [AS_HELP_STRING([--enable-utrace], [Enable utrace(2)-based tracing])], 915[if test "x$enable_utrace" = "xno" ; then 916 enable_utrace="0" 917else 918 enable_utrace="1" 919fi 920], 921[enable_utrace="0"] 922) 923JE_COMPILABLE([utrace(2)], [ 924#include <sys/types.h> 925#include <sys/param.h> 926#include <sys/time.h> 927#include <sys/uio.h> 928#include <sys/ktrace.h> 929], [ 930 utrace((void *)0, 0); 931], [je_cv_utrace]) 932if test "x${je_cv_utrace}" = "xno" ; then 933 enable_utrace="0" 934fi 935if test "x$enable_utrace" = "x1" ; then 936 AC_DEFINE([JEMALLOC_UTRACE], [ ]) 937fi 938AC_SUBST([enable_utrace]) 939 940dnl Support Valgrind by default. 941AC_ARG_ENABLE([valgrind], 942 [AS_HELP_STRING([--disable-valgrind], [Disable support for Valgrind])], 943[if test "x$enable_valgrind" = "xno" ; then 944 enable_valgrind="0" 945else 946 enable_valgrind="1" 947fi 948], 949[enable_valgrind="1"] 950) 951if test "x$enable_valgrind" = "x1" ; then 952 JE_COMPILABLE([valgrind], [ 953#include <valgrind/valgrind.h> 954#include <valgrind/memcheck.h> 955 956#if !defined(VALGRIND_RESIZEINPLACE_BLOCK) 957# error "Incompatible Valgrind version" 958#endif 959], [], [je_cv_valgrind]) 960 if test "x${je_cv_valgrind}" = "xno" ; then 961 enable_valgrind="0" 962 fi 963 if test "x$enable_valgrind" = "x1" ; then 964 AC_DEFINE([JEMALLOC_VALGRIND], [ ]) 965 fi 966fi 967AC_SUBST([enable_valgrind]) 968 969dnl Do not support the xmalloc option by default. 970AC_ARG_ENABLE([xmalloc], 971 [AS_HELP_STRING([--enable-xmalloc], [Support xmalloc option])], 972[if test "x$enable_xmalloc" = "xno" ; then 973 enable_xmalloc="0" 974else 975 enable_xmalloc="1" 976fi 977], 978[enable_xmalloc="0"] 979) 980if test "x$enable_xmalloc" = "x1" ; then 981 AC_DEFINE([JEMALLOC_XMALLOC], [ ]) 982fi 983AC_SUBST([enable_xmalloc]) 984 985AC_CACHE_CHECK([STATIC_PAGE_SHIFT], 986 [je_cv_static_page_shift], 987 AC_RUN_IFELSE([AC_LANG_PROGRAM( 988[[ 989#include <strings.h> 990#ifdef _WIN32 991#include <windows.h> 992#else 993#include <unistd.h> 994#endif 995#include <stdio.h> 996]], 997[[ 998 int result; 999 FILE *f; 1000 1001#ifdef _WIN32 1002 SYSTEM_INFO si; 1003 GetSystemInfo(&si); 1004 result = si.dwPageSize; 1005#else 1006 result = sysconf(_SC_PAGESIZE); 1007#endif 1008 if (result == -1) { 1009 return 1; 1010 } 1011 result = ffsl(result) - 1; 1012 1013 f = fopen("conftest.out", "w"); 1014 if (f == NULL) { 1015 return 1; 1016 } 1017 fprintf(f, "%d\n", result); 1018 fclose(f); 1019 1020 return 0; 1021]])], 1022 [je_cv_static_page_shift=`cat conftest.out`], 1023 [je_cv_static_page_shift=undefined])) 1024 1025if test "x$je_cv_static_page_shift" != "xundefined"; then 1026 AC_DEFINE_UNQUOTED([STATIC_PAGE_SHIFT], [$je_cv_static_page_shift]) 1027else 1028 AC_MSG_ERROR([cannot determine value for STATIC_PAGE_SHIFT]) 1029fi 1030 1031dnl ============================================================================ 1032dnl jemalloc configuration. 1033dnl 1034 1035dnl Set VERSION if source directory has an embedded git repository. 1036if test -d "${srcroot}.git" ; then 1037 git describe --long --abbrev=40 > ${srcroot}VERSION 1038fi 1039jemalloc_version=`cat ${srcroot}VERSION` 1040jemalloc_version_major=`echo ${jemalloc_version} | tr ".g-" " " | awk '{print [$]1}'` 1041jemalloc_version_minor=`echo ${jemalloc_version} | tr ".g-" " " | awk '{print [$]2}'` 1042jemalloc_version_bugfix=`echo ${jemalloc_version} | tr ".g-" " " | awk '{print [$]3}'` 1043jemalloc_version_nrev=`echo ${jemalloc_version} | tr ".g-" " " | awk '{print [$]4}'` 1044jemalloc_version_gid=`echo ${jemalloc_version} | tr ".g-" " " | awk '{print [$]5}'` 1045AC_SUBST([jemalloc_version]) 1046AC_SUBST([jemalloc_version_major]) 1047AC_SUBST([jemalloc_version_minor]) 1048AC_SUBST([jemalloc_version_bugfix]) 1049AC_SUBST([jemalloc_version_nrev]) 1050AC_SUBST([jemalloc_version_gid]) 1051 1052dnl ============================================================================ 1053dnl Configure pthreads. 1054 1055if test "x$abi" != "xpecoff" ; then 1056 AC_CHECK_HEADERS([pthread.h], , [AC_MSG_ERROR([pthread.h is missing])]) 1057 dnl Some systems may embed pthreads functionality in libc; check for libpthread 1058 dnl first, but try libc too before failing. 1059 AC_CHECK_LIB([pthread], [pthread_create], [LIBS="$LIBS -lpthread"], 1060 [AC_SEARCH_LIBS([pthread_create], , , 1061 AC_MSG_ERROR([libpthread is missing]))]) 1062fi 1063 1064CPPFLAGS="$CPPFLAGS -D_REENTRANT" 1065 1066dnl Check whether the BSD-specific _malloc_thread_cleanup() exists. If so, use 1067dnl it rather than pthreads TSD cleanup functions to support cleanup during 1068dnl thread exit, in order to avoid pthreads library recursion during 1069dnl bootstrapping. 1070AC_CHECK_FUNC([_malloc_thread_cleanup], 1071 [have__malloc_thread_cleanup="1"], 1072 [have__malloc_thread_cleanup="0"] 1073 ) 1074if test "x$have__malloc_thread_cleanup" = "x1" ; then 1075 AC_DEFINE([JEMALLOC_MALLOC_THREAD_CLEANUP], [ ]) 1076 force_tls="1" 1077fi 1078 1079dnl Check whether the BSD-specific _pthread_mutex_init_calloc_cb() exists. If 1080dnl so, mutex initialization causes allocation, and we need to implement this 1081dnl callback function in order to prevent recursive allocation. 1082AC_CHECK_FUNC([_pthread_mutex_init_calloc_cb], 1083 [have__pthread_mutex_init_calloc_cb="1"], 1084 [have__pthread_mutex_init_calloc_cb="0"] 1085 ) 1086if test "x$have__pthread_mutex_init_calloc_cb" = "x1" ; then 1087 AC_DEFINE([JEMALLOC_MUTEX_INIT_CB]) 1088fi 1089 1090dnl Disable lazy locking by default. 1091AC_ARG_ENABLE([lazy_lock], 1092 [AS_HELP_STRING([--enable-lazy-lock], 1093 [Enable lazy locking (only lock when multi-threaded)])], 1094[if test "x$enable_lazy_lock" = "xno" ; then 1095 enable_lazy_lock="0" 1096else 1097 enable_lazy_lock="1" 1098fi 1099], 1100[enable_lazy_lock="0"] 1101) 1102if test "x$enable_lazy_lock" = "x0" -a "x${force_lazy_lock}" = "x1" ; then 1103 AC_MSG_RESULT([Forcing lazy-lock to avoid allocator/threading bootstrap issues]) 1104 enable_lazy_lock="1" 1105fi 1106if test "x$enable_lazy_lock" = "x1" ; then 1107 if test "x$abi" != "xpecoff" ; then 1108 AC_CHECK_HEADERS([dlfcn.h], , [AC_MSG_ERROR([dlfcn.h is missing])]) 1109 AC_CHECK_FUNC([dlsym], [], 1110 [AC_CHECK_LIB([dl], [dlsym], [LIBS="$LIBS -ldl"], 1111 [AC_MSG_ERROR([libdl is missing])]) 1112 ]) 1113 fi 1114 AC_DEFINE([JEMALLOC_LAZY_LOCK], [ ]) 1115fi 1116AC_SUBST([enable_lazy_lock]) 1117 1118AC_ARG_ENABLE([tls], 1119 [AS_HELP_STRING([--disable-tls], [Disable thread-local storage (__thread keyword)])], 1120if test "x$enable_tls" = "xno" ; then 1121 enable_tls="0" 1122else 1123 enable_tls="1" 1124fi 1125, 1126enable_tls="1" 1127) 1128if test "x${enable_tls}" = "x0" -a "x${force_tls}" = "x1" ; then 1129 AC_MSG_RESULT([Forcing TLS to avoid allocator/threading bootstrap issues]) 1130 enable_tls="1" 1131fi 1132if test "x${enable_tls}" = "x1" -a "x${force_tls}" = "x0" ; then 1133 AC_MSG_RESULT([Forcing no TLS to avoid allocator/threading bootstrap issues]) 1134 enable_tls="0" 1135fi 1136if test "x${enable_tls}" = "x1" ; then 1137AC_MSG_CHECKING([for TLS]) 1138AC_COMPILE_IFELSE([AC_LANG_PROGRAM( 1139[[ 1140 __thread int x; 1141]], [[ 1142 x = 42; 1143 1144 return 0; 1145]])], 1146 AC_MSG_RESULT([yes]), 1147 AC_MSG_RESULT([no]) 1148 enable_tls="0") 1149fi 1150AC_SUBST([enable_tls]) 1151if test "x${enable_tls}" = "x1" ; then 1152 AC_DEFINE_UNQUOTED([JEMALLOC_TLS], [ ]) 1153elif test "x${force_tls}" = "x1" ; then 1154 AC_MSG_ERROR([Failed to configure TLS, which is mandatory for correct function]) 1155fi 1156 1157dnl ============================================================================ 1158dnl Check for ffsl(3), and fail if not found. This function exists on all 1159dnl platforms that jemalloc currently has a chance of functioning on without 1160dnl modification. 1161JE_COMPILABLE([a program using ffsl], [ 1162#include <stdio.h> 1163#include <strings.h> 1164#include <string.h> 1165], [ 1166 { 1167 int rv = ffsl(0x08); 1168 printf("%d\n", rv); 1169 } 1170], [je_cv_function_ffsl]) 1171if test "x${je_cv_function_ffsl}" != "xyes" ; then 1172 AC_MSG_ERROR([Cannot build without ffsl(3)]) 1173fi 1174 1175dnl ============================================================================ 1176dnl Check for atomic(9) operations as provided on FreeBSD. 1177 1178JE_COMPILABLE([atomic(9)], [ 1179#include <sys/types.h> 1180#include <machine/atomic.h> 1181#include <inttypes.h> 1182], [ 1183 { 1184 uint32_t x32 = 0; 1185 volatile uint32_t *x32p = &x32; 1186 atomic_fetchadd_32(x32p, 1); 1187 } 1188 { 1189 unsigned long xlong = 0; 1190 volatile unsigned long *xlongp = &xlong; 1191 atomic_fetchadd_long(xlongp, 1); 1192 } 1193], [je_cv_atomic9]) 1194if test "x${je_cv_atomic9}" = "xyes" ; then 1195 AC_DEFINE([JEMALLOC_ATOMIC9]) 1196fi 1197 1198dnl ============================================================================ 1199dnl Check for atomic(3) operations as provided on Darwin. 1200 1201JE_COMPILABLE([Darwin OSAtomic*()], [ 1202#include <libkern/OSAtomic.h> 1203#include <inttypes.h> 1204], [ 1205 { 1206 int32_t x32 = 0; 1207 volatile int32_t *x32p = &x32; 1208 OSAtomicAdd32(1, x32p); 1209 } 1210 { 1211 int64_t x64 = 0; 1212 volatile int64_t *x64p = &x64; 1213 OSAtomicAdd64(1, x64p); 1214 } 1215], [je_cv_osatomic]) 1216if test "x${je_cv_osatomic}" = "xyes" ; then 1217 AC_DEFINE([JEMALLOC_OSATOMIC], [ ]) 1218fi 1219 1220dnl ============================================================================ 1221dnl Check whether __sync_{add,sub}_and_fetch() are available despite 1222dnl __GCC_HAVE_SYNC_COMPARE_AND_SWAP_n macros being undefined. 1223 1224AC_DEFUN([JE_SYNC_COMPARE_AND_SWAP_CHECK],[ 1225 AC_CACHE_CHECK([whether to force $1-bit __sync_{add,sub}_and_fetch()], 1226 [je_cv_sync_compare_and_swap_$2], 1227 [AC_LINK_IFELSE([AC_LANG_PROGRAM([ 1228 #include <stdint.h> 1229 ], 1230 [ 1231 #ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_$2 1232 { 1233 uint$1_t x$1 = 0; 1234 __sync_add_and_fetch(&x$1, 42); 1235 __sync_sub_and_fetch(&x$1, 1); 1236 } 1237 #else 1238 #error __GCC_HAVE_SYNC_COMPARE_AND_SWAP_$2 is defined, no need to force 1239 #endif 1240 ])], 1241 [je_cv_sync_compare_and_swap_$2=yes], 1242 [je_cv_sync_compare_and_swap_$2=no])]) 1243 1244 if test "x${je_cv_sync_compare_and_swap_$2}" = "xyes" ; then 1245 AC_DEFINE([JE_FORCE_SYNC_COMPARE_AND_SWAP_$2], [ ]) 1246 fi 1247]) 1248 1249if test "x${je_cv_atomic9}" != "xyes" -a "x${je_cv_osatomic}" != "xyes" ; then 1250 JE_SYNC_COMPARE_AND_SWAP_CHECK(32, 4) 1251 JE_SYNC_COMPARE_AND_SWAP_CHECK(64, 8) 1252fi 1253 1254dnl ============================================================================ 1255dnl Check for spinlock(3) operations as provided on Darwin. 1256 1257JE_COMPILABLE([Darwin OSSpin*()], [ 1258#include <libkern/OSAtomic.h> 1259#include <inttypes.h> 1260], [ 1261 OSSpinLock lock = 0; 1262 OSSpinLockLock(&lock); 1263 OSSpinLockUnlock(&lock); 1264], [je_cv_osspin]) 1265if test "x${je_cv_osspin}" = "xyes" ; then 1266 AC_DEFINE([JEMALLOC_OSSPIN], [ ]) 1267fi 1268 1269dnl ============================================================================ 1270dnl Darwin-related configuration. 1271 1272AC_ARG_ENABLE([zone-allocator], 1273 [AS_HELP_STRING([--disable-zone-allocator], 1274 [Disable zone allocator for Darwin])], 1275[if test "x$enable_zone_allocator" = "xno" ; then 1276 enable_zone_allocator="0" 1277else 1278 enable_zone_allocator="1" 1279fi 1280], 1281[if test "x${abi}" = "xmacho"; then 1282 enable_zone_allocator="1" 1283fi 1284] 1285) 1286AC_SUBST([enable_zone_allocator]) 1287 1288if test "x${enable_zone_allocator}" = "x1" ; then 1289 if test "x${abi}" != "xmacho"; then 1290 AC_MSG_ERROR([--enable-zone-allocator is only supported on Darwin]) 1291 fi 1292 AC_DEFINE([JEMALLOC_IVSALLOC], [ ]) 1293 AC_DEFINE([JEMALLOC_ZONE], [ ]) 1294 1295 dnl The szone version jumped from 3 to 6 between the OS X 10.5.x and 10.6 1296 dnl releases. malloc_zone_t and malloc_introspection_t have new fields in 1297 dnl 10.6, which is the only source-level indication of the change. 1298 AC_MSG_CHECKING([malloc zone version]) 1299 AC_DEFUN([JE_ZONE_PROGRAM], 1300 [AC_LANG_PROGRAM( 1301 [#include <malloc/malloc.h>], 1302 [static foo[[sizeof($1) $2 sizeof(void *) * $3 ? 1 : -1]]] 1303 )]) 1304 1305 AC_COMPILE_IFELSE([JE_ZONE_PROGRAM(malloc_zone_t,==,14)],[JEMALLOC_ZONE_VERSION=3],[ 1306 AC_COMPILE_IFELSE([JE_ZONE_PROGRAM(malloc_zone_t,==,15)],[JEMALLOC_ZONE_VERSION=5],[ 1307 AC_COMPILE_IFELSE([JE_ZONE_PROGRAM(malloc_zone_t,==,16)],[ 1308 AC_COMPILE_IFELSE([JE_ZONE_PROGRAM(malloc_introspection_t,==,9)],[JEMALLOC_ZONE_VERSION=6],[ 1309 AC_COMPILE_IFELSE([JE_ZONE_PROGRAM(malloc_introspection_t,==,13)],[JEMALLOC_ZONE_VERSION=7],[JEMALLOC_ZONE_VERSION=] 1310 )])],[ 1311 AC_COMPILE_IFELSE([JE_ZONE_PROGRAM(malloc_zone_t,==,17)],[JEMALLOC_ZONE_VERSION=8],[ 1312 AC_COMPILE_IFELSE([JE_ZONE_PROGRAM(malloc_zone_t,>,17)],[JEMALLOC_ZONE_VERSION=9],[JEMALLOC_ZONE_VERSION=] 1313 )])])])]) 1314 if test "x${JEMALLOC_ZONE_VERSION}" = "x"; then 1315 AC_MSG_RESULT([unsupported]) 1316 AC_MSG_ERROR([Unsupported malloc zone version]) 1317 fi 1318 if test "${JEMALLOC_ZONE_VERSION}" = 9; then 1319 JEMALLOC_ZONE_VERSION=8 1320 AC_MSG_RESULT([> 8]) 1321 else 1322 AC_MSG_RESULT([$JEMALLOC_ZONE_VERSION]) 1323 fi 1324 AC_DEFINE_UNQUOTED(JEMALLOC_ZONE_VERSION, [$JEMALLOC_ZONE_VERSION]) 1325fi 1326 1327dnl ============================================================================ 1328dnl Check for typedefs, structures, and compiler characteristics. 1329AC_HEADER_STDBOOL 1330 1331dnl ============================================================================ 1332dnl Define commands that generate output files. 1333 1334AC_CONFIG_COMMANDS([include/jemalloc/internal/private_namespace.h], [ 1335 mkdir -p "${objroot}include/jemalloc/internal" 1336 "${srcdir}/include/jemalloc/internal/private_namespace.sh" "${srcdir}/include/jemalloc/internal/private_symbols.txt" > "${objroot}include/jemalloc/internal/private_namespace.h" 1337]) 1338AC_CONFIG_COMMANDS([include/jemalloc/internal/private_unnamespace.h], [ 1339 mkdir -p "${objroot}include/jemalloc/internal" 1340 "${srcdir}/include/jemalloc/internal/private_unnamespace.sh" "${srcdir}/include/jemalloc/internal/private_symbols.txt" > "${objroot}include/jemalloc/internal/private_unnamespace.h" 1341]) 1342AC_CONFIG_COMMANDS([include/jemalloc/internal/public_namespace.h], [ 1343 mkdir -p "${objroot}include/jemalloc/internal" 1344 "${srcdir}/include/jemalloc/internal/public_namespace.sh" "${srcdir}/include/jemalloc/internal/public_symbols.txt" > "${objroot}include/jemalloc/internal/public_namespace.h" 1345]) 1346AC_CONFIG_COMMANDS([include/jemalloc/internal/public_unnamespace.h], [ 1347 mkdir -p "${objroot}include/jemalloc/internal" 1348 "${srcdir}/include/jemalloc/internal/public_unnamespace.sh" "${srcdir}/include/jemalloc/internal/public_symbols.txt" > "${objroot}include/jemalloc/internal/public_unnamespace.h" 1349]) 1350AC_CONFIG_COMMANDS([include/jemalloc/internal/size_classes.h], [ 1351 mkdir -p "${objroot}include/jemalloc/internal" 1352 "${srcdir}/include/jemalloc/internal/size_classes.sh" > "${objroot}include/jemalloc/internal/size_classes.h" 1353]) 1354AC_CONFIG_COMMANDS([include/jemalloc/jemalloc_protos_jet.h], [ 1355 mkdir -p "${objroot}include/jemalloc" 1356 cat "${srcdir}/include/jemalloc/jemalloc_protos.h.in" | sed -e 's/@je_@/jet_/g' > "${objroot}include/jemalloc/jemalloc_protos_jet.h" 1357]) 1358AC_CONFIG_COMMANDS([include/jemalloc/jemalloc.h], [ 1359 mkdir -p "${objroot}include/jemalloc" 1360 "${srcdir}/include/jemalloc/jemalloc.sh" "${objroot}" > "${objroot}include/jemalloc/jemalloc${install_suffix}.h" 1361]) 1362 1363dnl Process .in files. 1364AC_SUBST([cfghdrs_in]) 1365AC_SUBST([cfghdrs_out]) 1366AC_CONFIG_HEADERS([$cfghdrs_tup]) 1367 1368dnl ============================================================================ 1369dnl Generate outputs. 1370 1371AC_CONFIG_FILES([$cfgoutputs_tup config.stamp bin/jemalloc.sh]) 1372AC_SUBST([cfgoutputs_in]) 1373AC_SUBST([cfgoutputs_out]) 1374AC_OUTPUT 1375 1376dnl ============================================================================ 1377dnl Print out the results of configuration. 1378AC_MSG_RESULT([===============================================================================]) 1379AC_MSG_RESULT([jemalloc version : ${jemalloc_version}]) 1380AC_MSG_RESULT([library revision : ${rev}]) 1381AC_MSG_RESULT([]) 1382AC_MSG_RESULT([CC : ${CC}]) 1383AC_MSG_RESULT([CPPFLAGS : ${CPPFLAGS}]) 1384AC_MSG_RESULT([CFLAGS : ${CFLAGS}]) 1385AC_MSG_RESULT([LDFLAGS : ${LDFLAGS}]) 1386AC_MSG_RESULT([EXTRA_LDFLAGS : ${EXTRA_LDFLAGS}]) 1387AC_MSG_RESULT([LIBS : ${LIBS}]) 1388AC_MSG_RESULT([RPATH_EXTRA : ${RPATH_EXTRA}]) 1389AC_MSG_RESULT([]) 1390AC_MSG_RESULT([XSLTPROC : ${XSLTPROC}]) 1391AC_MSG_RESULT([XSLROOT : ${XSLROOT}]) 1392AC_MSG_RESULT([]) 1393AC_MSG_RESULT([PREFIX : ${PREFIX}]) 1394AC_MSG_RESULT([BINDIR : ${BINDIR}]) 1395AC_MSG_RESULT([INCLUDEDIR : ${INCLUDEDIR}]) 1396AC_MSG_RESULT([LIBDIR : ${LIBDIR}]) 1397AC_MSG_RESULT([DATADIR : ${DATADIR}]) 1398AC_MSG_RESULT([MANDIR : ${MANDIR}]) 1399AC_MSG_RESULT([]) 1400AC_MSG_RESULT([srcroot : ${srcroot}]) 1401AC_MSG_RESULT([abs_srcroot : ${abs_srcroot}]) 1402AC_MSG_RESULT([objroot : ${objroot}]) 1403AC_MSG_RESULT([abs_objroot : ${abs_objroot}]) 1404AC_MSG_RESULT([]) 1405AC_MSG_RESULT([JEMALLOC_PREFIX : ${JEMALLOC_PREFIX}]) 1406AC_MSG_RESULT([JEMALLOC_PRIVATE_NAMESPACE]) 1407AC_MSG_RESULT([ : ${JEMALLOC_PRIVATE_NAMESPACE}]) 1408AC_MSG_RESULT([install_suffix : ${install_suffix}]) 1409AC_MSG_RESULT([autogen : ${enable_autogen}]) 1410AC_MSG_RESULT([experimental : ${enable_experimental}]) 1411AC_MSG_RESULT([cc-silence : ${enable_cc_silence}]) 1412AC_MSG_RESULT([debug : ${enable_debug}]) 1413AC_MSG_RESULT([code-coverage : ${enable_code_coverage}]) 1414AC_MSG_RESULT([stats : ${enable_stats}]) 1415AC_MSG_RESULT([prof : ${enable_prof}]) 1416AC_MSG_RESULT([prof-libunwind : ${enable_prof_libunwind}]) 1417AC_MSG_RESULT([prof-libgcc : ${enable_prof_libgcc}]) 1418AC_MSG_RESULT([prof-gcc : ${enable_prof_gcc}]) 1419AC_MSG_RESULT([tcache : ${enable_tcache}]) 1420AC_MSG_RESULT([fill : ${enable_fill}]) 1421AC_MSG_RESULT([utrace : ${enable_utrace}]) 1422AC_MSG_RESULT([valgrind : ${enable_valgrind}]) 1423AC_MSG_RESULT([xmalloc : ${enable_xmalloc}]) 1424AC_MSG_RESULT([mremap : ${enable_mremap}]) 1425AC_MSG_RESULT([munmap : ${enable_munmap}]) 1426AC_MSG_RESULT([dss : ${enable_dss}]) 1427AC_MSG_RESULT([lazy_lock : ${enable_lazy_lock}]) 1428AC_MSG_RESULT([tls : ${enable_tls}]) 1429AC_MSG_RESULT([===============================================================================]) 1430