1# Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. 2# 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; version 2 of the License. 6# 7# This program is distributed in the hope that it will be useful, 8# but WITHOUT ANY WARRANTY; without even the implied warranty of 9# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10# GNU General Public License for more details. 11# 12# You should have received a copy of the GNU General Public License 13# along with this program; if not, write to the Free Software 14# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 15# 16 17INCLUDE (CheckCSourceCompiles) 18INCLUDE (CheckCXXSourceCompiles) 19INCLUDE (CheckStructHasMember) 20INCLUDE (CheckLibraryExists) 21INCLUDE (CheckFunctionExists) 22INCLUDE (CheckCCompilerFlag) 23INCLUDE (CheckCSourceRuns) 24INCLUDE (CheckSymbolExists) 25 26 27# WITH_PIC options.Not of much use, PIC is taken care of on platforms 28# where it makes sense anyway. 29IF(UNIX) 30 IF(APPLE) 31 # OSX executable are always PIC 32 SET(WITH_PIC ON) 33 ELSE() 34 OPTION(WITH_PIC "Generate PIC objects" OFF) 35 IF(WITH_PIC) 36 SET(CMAKE_C_FLAGS 37 "${CMAKE_C_FLAGS} ${CMAKE_SHARED_LIBRARY_C_FLAGS}") 38 SET(CMAKE_CXX_FLAGS 39 "${CMAKE_CXX_FLAGS} ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}") 40 ENDIF() 41 ENDIF() 42ENDIF() 43 44 45 46# System type affects version_compile_os variable 47IF(NOT SYSTEM_TYPE) 48 IF(PLATFORM) 49 SET(SYSTEM_TYPE ${PLATFORM}) 50 ELSE() 51 SET(SYSTEM_TYPE ${CMAKE_SYSTEM_NAME}) 52 ENDIF() 53ENDIF() 54 55 56IF(CMAKE_COMPILER_IS_GNUCXX) 57 # MySQL "canonical" GCC flags. At least -fno-rtti flag affects 58 # ABI and cannot be simply removed. 59 SET(CMAKE_CXX_FLAGS 60 "${CMAKE_CXX_FLAGS} -fno-implicit-templates -fno-exceptions -fno-rtti") 61 IF(CMAKE_CXX_FLAGS) 62 STRING(REGEX MATCH "fno-implicit-templates" NO_IMPLICIT_TEMPLATES 63 ${CMAKE_CXX_FLAGS}) 64 IF (NO_IMPLICIT_TEMPLATES) 65 SET(HAVE_EXPLICIT_TEMPLATE_INSTANTIATION TRUE) 66 ENDIF() 67 ENDIF() 68 69 IF (CMAKE_EXE_LINKER_FLAGS MATCHES " -static " 70 OR CMAKE_EXE_LINKER_FLAGS MATCHES " -static$") 71 SET(HAVE_DLOPEN FALSE CACHE "Disable dlopen due to -static flag" FORCE) 72 SET(WITHOUT_DYNAMIC_PLUGINS TRUE) 73 ENDIF() 74ENDIF() 75 76IF(WITHOUT_DYNAMIC_PLUGINS) 77 MESSAGE("Dynamic plugins are disabled.") 78ENDIF(WITHOUT_DYNAMIC_PLUGINS) 79 80# Large files, common flag 81SET(_LARGEFILE_SOURCE 1) 82 83# If finds the size of a type, set SIZEOF_<type> and HAVE_<type> 84FUNCTION(MY_CHECK_TYPE_SIZE type defbase) 85 CHECK_TYPE_SIZE("${type}" SIZEOF_${defbase}) 86 IF(SIZEOF_${defbase}) 87 SET(HAVE_${defbase} 1 PARENT_SCOPE) 88 ENDIF() 89ENDFUNCTION() 90 91# Same for structs, setting HAVE_STRUCT_<name> instead 92FUNCTION(MY_CHECK_STRUCT_SIZE type defbase) 93 CHECK_TYPE_SIZE("struct ${type}" SIZEOF_${defbase}) 94 IF(SIZEOF_${defbase}) 95 SET(HAVE_STRUCT_${defbase} 1 PARENT_SCOPE) 96 ENDIF() 97ENDFUNCTION() 98 99# Searches function in libraries 100# if function is found, sets output parameter result to the name of the library 101# if function is found in libc, result will be empty 102FUNCTION(MY_SEARCH_LIBS func libs result) 103 IF(${${result}}) 104 # Library is already found or was predefined 105 RETURN() 106 ENDIF() 107 CHECK_FUNCTION_EXISTS(${func} HAVE_${func}_IN_LIBC) 108 IF(HAVE_${func}_IN_LIBC) 109 SET(${result} "" PARENT_SCOPE) 110 RETURN() 111 ENDIF() 112 FOREACH(lib ${libs}) 113 CHECK_LIBRARY_EXISTS(${lib} ${func} "" HAVE_${func}_IN_${lib}) 114 IF(HAVE_${func}_IN_${lib}) 115 SET(${result} ${lib} PARENT_SCOPE) 116 SET(HAVE_${result} 1 PARENT_SCOPE) 117 RETURN() 118 ENDIF() 119 ENDFOREACH() 120ENDFUNCTION() 121 122# Find out which libraries to use. 123IF(UNIX) 124 MY_SEARCH_LIBS(floor m LIBM) 125 IF(NOT LIBM) 126 MY_SEARCH_LIBS(__infinity m LIBM) 127 ENDIF() 128 MY_SEARCH_LIBS(gethostbyname_r "nsl_r;nsl" LIBNSL) 129 MY_SEARCH_LIBS(bind "bind;socket" LIBBIND) 130 MY_SEARCH_LIBS(crypt crypt LIBCRYPT) 131 MY_SEARCH_LIBS(setsockopt socket LIBSOCKET) 132 MY_SEARCH_LIBS(dlopen dl LIBDL) 133 MY_SEARCH_LIBS(sched_yield rt LIBRT) 134 IF(NOT LIBRT) 135 MY_SEARCH_LIBS(clock_gettime rt LIBRT) 136 ENDIF() 137 FIND_PACKAGE(Threads) 138 139 SET(CMAKE_REQUIRED_LIBRARIES 140 ${LIBM} ${LIBNSL} ${LIBBIND} ${LIBCRYPT} ${LIBSOCKET} ${LIBDL} ${CMAKE_THREAD_LIBS_INIT} ${LIBRT}) 141 # Need explicit pthread for gcc -fsanitize=address 142 IF(CMAKE_USE_PTHREADS_INIT AND CMAKE_C_FLAGS MATCHES "-fsanitize=") 143 SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} pthread) 144 ENDIF() 145 146 LIST(LENGTH CMAKE_REQUIRED_LIBRARIES required_libs_length) 147 IF(${required_libs_length} GREATER 0) 148 LIST(REMOVE_DUPLICATES CMAKE_REQUIRED_LIBRARIES) 149 ENDIF() 150 LINK_LIBRARIES(${CMAKE_THREAD_LIBS_INIT}) 151 152 OPTION(WITH_LIBWRAP "Compile with tcp wrappers support" OFF) 153 IF(WITH_LIBWRAP) 154 SET(SAVE_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) 155 SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} wrap) 156 CHECK_C_SOURCE_COMPILES( 157 " 158 #include <tcpd.h> 159 int allow_severity = 0; 160 int deny_severity = 0; 161 int main() 162 { 163 hosts_access(0); 164 }" 165 HAVE_LIBWRAP) 166 SET(CMAKE_REQUIRED_LIBRARIES ${SAVE_CMAKE_REQUIRED_LIBRARIES}) 167 IF(HAVE_LIBWRAP) 168 SET(MYSYS_LIBWRAP_SOURCE ${CMAKE_SOURCE_DIR}/mysys/my_libwrap.c) 169 SET(LIBWRAP "wrap") 170 ENDIF() 171 ENDIF() 172ENDIF() 173 174# 175# Tests for header files 176# 177INCLUDE (CheckIncludeFiles) 178 179CHECK_INCLUDE_FILES ("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS) 180CHECK_INCLUDE_FILES (sys/types.h HAVE_SYS_TYPES_H) 181CHECK_INCLUDE_FILES (alloca.h HAVE_ALLOCA_H) 182CHECK_INCLUDE_FILES (aio.h HAVE_AIO_H) 183CHECK_INCLUDE_FILES (arpa/inet.h HAVE_ARPA_INET_H) 184CHECK_INCLUDE_FILES (crypt.h HAVE_CRYPT_H) 185CHECK_INCLUDE_FILES (cxxabi.h HAVE_CXXABI_H) 186CHECK_INCLUDE_FILES (dirent.h HAVE_DIRENT_H) 187CHECK_INCLUDE_FILES (dlfcn.h HAVE_DLFCN_H) 188CHECK_INCLUDE_FILES (execinfo.h HAVE_EXECINFO_H) 189CHECK_INCLUDE_FILES (fcntl.h HAVE_FCNTL_H) 190CHECK_INCLUDE_FILES (fenv.h HAVE_FENV_H) 191CHECK_INCLUDE_FILES (float.h HAVE_FLOAT_H) 192CHECK_INCLUDE_FILES (floatingpoint.h HAVE_FLOATINGPOINT_H) 193CHECK_INCLUDE_FILES (fpu_control.h HAVE_FPU_CONTROL_H) 194CHECK_INCLUDE_FILES (grp.h HAVE_GRP_H) 195CHECK_INCLUDE_FILES (ieeefp.h HAVE_IEEEFP_H) 196CHECK_INCLUDE_FILES (inttypes.h HAVE_INTTYPES_H) 197CHECK_INCLUDE_FILES (langinfo.h HAVE_LANGINFO_H) 198CHECK_INCLUDE_FILES (limits.h HAVE_LIMITS_H) 199CHECK_INCLUDE_FILES (locale.h HAVE_LOCALE_H) 200CHECK_INCLUDE_FILES (malloc.h HAVE_MALLOC_H) 201CHECK_INCLUDE_FILES (memory.h HAVE_MEMORY_H) 202CHECK_INCLUDE_FILES (ndir.h HAVE_NDIR_H) 203CHECK_INCLUDE_FILES (netinet/in.h HAVE_NETINET_IN_H) 204CHECK_INCLUDE_FILES (paths.h HAVE_PATHS_H) 205CHECK_INCLUDE_FILES (port.h HAVE_PORT_H) 206CHECK_INCLUDE_FILES (poll.h HAVE_POLL_H) 207CHECK_INCLUDE_FILES (pwd.h HAVE_PWD_H) 208CHECK_INCLUDE_FILES (sched.h HAVE_SCHED_H) 209CHECK_INCLUDE_FILES (select.h HAVE_SELECT_H) 210CHECK_INCLUDE_FILES (semaphore.h HAVE_SEMAPHORE_H) 211CHECK_INCLUDE_FILES ("sys/types.h;sys/dir.h" HAVE_SYS_DIR_H) 212CHECK_INCLUDE_FILES (sys/ndir.h HAVE_SYS_NDIR_H) 213CHECK_INCLUDE_FILES (sys/pte.h HAVE_SYS_PTE_H) 214CHECK_INCLUDE_FILES (stddef.h HAVE_STDDEF_H) 215CHECK_INCLUDE_FILES (stdint.h HAVE_STDINT_H) 216CHECK_INCLUDE_FILES (stdlib.h HAVE_STDLIB_H) 217CHECK_INCLUDE_FILES (strings.h HAVE_STRINGS_H) 218CHECK_INCLUDE_FILES (string.h HAVE_STRING_H) 219CHECK_INCLUDE_FILES (synch.h HAVE_SYNCH_H) 220CHECK_INCLUDE_FILES (sysent.h HAVE_SYSENT_H) 221CHECK_INCLUDE_FILES (sys/cdefs.h HAVE_SYS_CDEFS_H) 222CHECK_INCLUDE_FILES (sys/file.h HAVE_SYS_FILE_H) 223CHECK_INCLUDE_FILES (sys/fpu.h HAVE_SYS_FPU_H) 224CHECK_INCLUDE_FILES (sys/ioctl.h HAVE_SYS_IOCTL_H) 225CHECK_INCLUDE_FILES (sys/ipc.h HAVE_SYS_IPC_H) 226CHECK_INCLUDE_FILES (sys/malloc.h HAVE_SYS_MALLOC_H) 227CHECK_INCLUDE_FILES (sys/mman.h HAVE_SYS_MMAN_H) 228CHECK_INCLUDE_FILES (sys/prctl.h HAVE_SYS_PRCTL_H) 229CHECK_INCLUDE_FILES (sys/resource.h HAVE_SYS_RESOURCE_H) 230CHECK_INCLUDE_FILES (sys/select.h HAVE_SYS_SELECT_H) 231CHECK_INCLUDE_FILES (sys/shm.h HAVE_SYS_SHM_H) 232CHECK_INCLUDE_FILES (sys/socket.h HAVE_SYS_SOCKET_H) 233CHECK_INCLUDE_FILES (sys/stat.h HAVE_SYS_STAT_H) 234CHECK_INCLUDE_FILES (sys/stream.h HAVE_SYS_STREAM_H) 235CHECK_INCLUDE_FILES (sys/termcap.h HAVE_SYS_TERMCAP_H) 236CHECK_INCLUDE_FILES ("time.h;sys/timeb.h" HAVE_SYS_TIMEB_H) 237CHECK_INCLUDE_FILES ("curses.h;term.h" HAVE_TERM_H) 238CHECK_INCLUDE_FILES (asm/termbits.h HAVE_ASM_TERMBITS_H) 239CHECK_INCLUDE_FILES (termbits.h HAVE_TERMBITS_H) 240CHECK_INCLUDE_FILES (termios.h HAVE_TERMIOS_H) 241CHECK_INCLUDE_FILES (termio.h HAVE_TERMIO_H) 242CHECK_INCLUDE_FILES (termcap.h HAVE_TERMCAP_H) 243CHECK_INCLUDE_FILES (unistd.h HAVE_UNISTD_H) 244CHECK_INCLUDE_FILES (utime.h HAVE_UTIME_H) 245CHECK_INCLUDE_FILES (varargs.h HAVE_VARARGS_H) 246CHECK_INCLUDE_FILES (sys/time.h HAVE_SYS_TIME_H) 247CHECK_INCLUDE_FILES (sys/utime.h HAVE_SYS_UTIME_H) 248CHECK_INCLUDE_FILES (sys/wait.h HAVE_SYS_WAIT_H) 249CHECK_INCLUDE_FILES (sys/param.h HAVE_SYS_PARAM_H) 250CHECK_INCLUDE_FILES (sys/vadvise.h HAVE_SYS_VADVISE_H) 251CHECK_INCLUDE_FILES (fnmatch.h HAVE_FNMATCH_H) 252CHECK_INCLUDE_FILES (stdarg.h HAVE_STDARG_H) 253CHECK_INCLUDE_FILES ("stdlib.h;sys/un.h" HAVE_SYS_UN_H) 254CHECK_INCLUDE_FILES (vis.h HAVE_VIS_H) 255CHECK_INCLUDE_FILES (wchar.h HAVE_WCHAR_H) 256CHECK_INCLUDE_FILES (wctype.h HAVE_WCTYPE_H) 257 258IF(HAVE_SYS_STREAM_H) 259 # Needs sys/stream.h on Solaris 260 CHECK_INCLUDE_FILES ("sys/stream.h;sys/ptem.h" HAVE_SYS_PTEM_H) 261ELSE() 262 CHECK_INCLUDE_FILES (sys/ptem.h HAVE_SYS_PTEM_H) 263ENDIF() 264 265# Figure out threading library 266# 267FIND_PACKAGE (Threads) 268 269FUNCTION(MY_CHECK_PTHREAD_ONCE_INIT) 270 CHECK_C_COMPILER_FLAG("-Werror" HAVE_WERROR_FLAG) 271 IF(NOT HAVE_WERROR_FLAG) 272 RETURN() 273 ENDIF() 274 SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror") 275 CHECK_C_SOURCE_COMPILES(" 276 #include <pthread.h> 277 void foo(void) {} 278 int main() 279 { 280 pthread_once_t once_control = PTHREAD_ONCE_INIT; 281 pthread_once(&once_control, foo); 282 return 0; 283 }" 284 HAVE_PTHREAD_ONCE_INIT 285 ) 286 # http://bugs.opensolaris.org/bugdatabase/printableBug.do?bug_id=6611808 287 IF(NOT HAVE_PTHREAD_ONCE_INIT) 288 CHECK_C_SOURCE_COMPILES(" 289 #include <pthread.h> 290 void foo(void) {} 291 int main() 292 { 293 pthread_once_t once_control = { PTHREAD_ONCE_INIT }; 294 pthread_once(&once_control, foo); 295 return 0; 296 }" 297 HAVE_ARRAY_PTHREAD_ONCE_INIT 298 ) 299 ENDIF() 300 IF(HAVE_PTHREAD_ONCE_INIT) 301 SET(PTHREAD_ONCE_INITIALIZER "PTHREAD_ONCE_INIT" PARENT_SCOPE) 302 ENDIF() 303 IF(HAVE_ARRAY_PTHREAD_ONCE_INIT) 304 SET(PTHREAD_ONCE_INITIALIZER "{ PTHREAD_ONCE_INIT }" PARENT_SCOPE) 305 ENDIF() 306ENDFUNCTION() 307 308IF(CMAKE_USE_PTHREADS_INIT) 309 MY_CHECK_PTHREAD_ONCE_INIT() 310ENDIF() 311 312# 313# Tests for functions 314# 315#CHECK_FUNCTION_EXISTS (aiowait HAVE_AIOWAIT) 316CHECK_FUNCTION_EXISTS (aio_read HAVE_AIO_READ) 317CHECK_FUNCTION_EXISTS (alarm HAVE_ALARM) 318SET(HAVE_ALLOCA 1) 319CHECK_FUNCTION_EXISTS (backtrace HAVE_BACKTRACE) 320CHECK_FUNCTION_EXISTS (backtrace_symbols HAVE_BACKTRACE_SYMBOLS) 321CHECK_FUNCTION_EXISTS (backtrace_symbols_fd HAVE_BACKTRACE_SYMBOLS_FD) 322CHECK_FUNCTION_EXISTS (printstack HAVE_PRINTSTACK) 323CHECK_FUNCTION_EXISTS (bfill HAVE_BFILL) 324CHECK_FUNCTION_EXISTS (bmove HAVE_BMOVE) 325CHECK_FUNCTION_EXISTS (bsearch HAVE_BSEARCH) 326CHECK_FUNCTION_EXISTS (index HAVE_INDEX) 327CHECK_FUNCTION_EXISTS (bzero HAVE_BZERO) 328CHECK_FUNCTION_EXISTS (clock_gettime HAVE_CLOCK_GETTIME) 329CHECK_FUNCTION_EXISTS (cuserid HAVE_CUSERID) 330CHECK_FUNCTION_EXISTS (directio HAVE_DIRECTIO) 331CHECK_FUNCTION_EXISTS (_doprnt HAVE_DOPRNT) 332CHECK_FUNCTION_EXISTS (flockfile HAVE_FLOCKFILE) 333CHECK_FUNCTION_EXISTS (ftruncate HAVE_FTRUNCATE) 334CHECK_FUNCTION_EXISTS (getline HAVE_GETLINE) 335CHECK_FUNCTION_EXISTS (compress HAVE_COMPRESS) 336CHECK_FUNCTION_EXISTS (crypt HAVE_CRYPT) 337CHECK_FUNCTION_EXISTS (dlerror HAVE_DLERROR) 338CHECK_FUNCTION_EXISTS (dlopen HAVE_DLOPEN) 339CHECK_FUNCTION_EXISTS (fchmod HAVE_FCHMOD) 340CHECK_FUNCTION_EXISTS (fcntl HAVE_FCNTL) 341CHECK_FUNCTION_EXISTS (fconvert HAVE_FCONVERT) 342CHECK_FUNCTION_EXISTS (fdatasync HAVE_FDATASYNC) 343CHECK_SYMBOL_EXISTS(fdatasync "unistd.h" HAVE_DECL_FDATASYNC) 344CHECK_FUNCTION_EXISTS (fesetround HAVE_FESETROUND) 345CHECK_FUNCTION_EXISTS (fedisableexcept HAVE_FEDISABLEEXCEPT) 346CHECK_FUNCTION_EXISTS (fpsetmask HAVE_FPSETMASK) 347CHECK_FUNCTION_EXISTS (fseeko HAVE_FSEEKO) 348CHECK_FUNCTION_EXISTS (fsync HAVE_FSYNC) 349CHECK_FUNCTION_EXISTS (getcwd HAVE_GETCWD) 350CHECK_FUNCTION_EXISTS (gethostbyaddr_r HAVE_GETHOSTBYADDR_R) 351CHECK_FUNCTION_EXISTS (gethrtime HAVE_GETHRTIME) 352CHECK_FUNCTION_EXISTS (getnameinfo HAVE_GETNAMEINFO) 353CHECK_FUNCTION_EXISTS (getpass HAVE_GETPASS) 354CHECK_FUNCTION_EXISTS (getpassphrase HAVE_GETPASSPHRASE) 355CHECK_FUNCTION_EXISTS (getpwnam HAVE_GETPWNAM) 356CHECK_FUNCTION_EXISTS (getpwuid HAVE_GETPWUID) 357CHECK_FUNCTION_EXISTS (getrlimit HAVE_GETRLIMIT) 358CHECK_FUNCTION_EXISTS (getrusage HAVE_GETRUSAGE) 359CHECK_FUNCTION_EXISTS (getwd HAVE_GETWD) 360CHECK_FUNCTION_EXISTS (gmtime_r HAVE_GMTIME_R) 361CHECK_FUNCTION_EXISTS (initgroups HAVE_INITGROUPS) 362CHECK_FUNCTION_EXISTS (issetugid HAVE_ISSETUGID) 363CHECK_FUNCTION_EXISTS (getuid HAVE_GETUID) 364CHECK_FUNCTION_EXISTS (geteuid HAVE_GETEUID) 365CHECK_FUNCTION_EXISTS (getgid HAVE_GETGID) 366CHECK_FUNCTION_EXISTS (getegid HAVE_GETEGID) 367CHECK_FUNCTION_EXISTS (ldiv HAVE_LDIV) 368CHECK_FUNCTION_EXISTS (localtime_r HAVE_LOCALTIME_R) 369CHECK_FUNCTION_EXISTS (longjmp HAVE_LONGJMP) 370CHECK_FUNCTION_EXISTS (lstat HAVE_LSTAT) 371CHECK_FUNCTION_EXISTS (madvise HAVE_MADVISE) 372CHECK_FUNCTION_EXISTS (mallinfo HAVE_MALLINFO) 373CHECK_FUNCTION_EXISTS (memcpy HAVE_MEMCPY) 374CHECK_FUNCTION_EXISTS (memmove HAVE_MEMMOVE) 375CHECK_FUNCTION_EXISTS (mkstemp HAVE_MKSTEMP) 376CHECK_FUNCTION_EXISTS (mlock HAVE_MLOCK) 377CHECK_FUNCTION_EXISTS (mlockall HAVE_MLOCKALL) 378CHECK_FUNCTION_EXISTS (mmap HAVE_MMAP) 379CHECK_FUNCTION_EXISTS (mmap64 HAVE_MMAP64) 380CHECK_FUNCTION_EXISTS (perror HAVE_PERROR) 381CHECK_FUNCTION_EXISTS (poll HAVE_POLL) 382CHECK_FUNCTION_EXISTS (port_create HAVE_PORT_CREATE) 383CHECK_FUNCTION_EXISTS (posix_fallocate HAVE_POSIX_FALLOCATE) 384CHECK_FUNCTION_EXISTS (pread HAVE_PREAD) 385CHECK_FUNCTION_EXISTS (pthread_attr_create HAVE_PTHREAD_ATTR_CREATE) 386CHECK_FUNCTION_EXISTS (pthread_attr_getstacksize HAVE_PTHREAD_ATTR_GETSTACKSIZE) 387CHECK_FUNCTION_EXISTS (pthread_attr_setscope HAVE_PTHREAD_ATTR_SETSCOPE) 388CHECK_FUNCTION_EXISTS (pthread_attr_setstacksize HAVE_PTHREAD_ATTR_SETSTACKSIZE) 389CHECK_FUNCTION_EXISTS (pthread_condattr_create HAVE_PTHREAD_CONDATTR_CREATE) 390CHECK_FUNCTION_EXISTS (pthread_condattr_setclock HAVE_PTHREAD_CONDATTR_SETCLOCK) 391CHECK_FUNCTION_EXISTS (pthread_key_delete HAVE_PTHREAD_KEY_DELETE) 392CHECK_FUNCTION_EXISTS (pthread_rwlock_rdlock HAVE_PTHREAD_RWLOCK_RDLOCK) 393CHECK_FUNCTION_EXISTS (pthread_sigmask HAVE_PTHREAD_SIGMASK) 394CHECK_FUNCTION_EXISTS (pthread_threadmask HAVE_PTHREAD_THREADMASK) 395CHECK_FUNCTION_EXISTS (pthread_yield_np HAVE_PTHREAD_YIELD_NP) 396CHECK_FUNCTION_EXISTS (putenv HAVE_PUTENV) 397CHECK_FUNCTION_EXISTS (readdir_r HAVE_READDIR_R) 398CHECK_FUNCTION_EXISTS (readlink HAVE_READLINK) 399CHECK_FUNCTION_EXISTS (re_comp HAVE_RE_COMP) 400CHECK_FUNCTION_EXISTS (regcomp HAVE_REGCOMP) 401CHECK_FUNCTION_EXISTS (realpath HAVE_REALPATH) 402CHECK_FUNCTION_EXISTS (rename HAVE_RENAME) 403CHECK_FUNCTION_EXISTS (rwlock_init HAVE_RWLOCK_INIT) 404CHECK_FUNCTION_EXISTS (sched_yield HAVE_SCHED_YIELD) 405CHECK_FUNCTION_EXISTS (setenv HAVE_SETENV) 406CHECK_FUNCTION_EXISTS (setlocale HAVE_SETLOCALE) 407CHECK_FUNCTION_EXISTS (setfd HAVE_SETFD) 408CHECK_FUNCTION_EXISTS (sigaction HAVE_SIGACTION) 409CHECK_FUNCTION_EXISTS (sigthreadmask HAVE_SIGTHREADMASK) 410CHECK_FUNCTION_EXISTS (sigwait HAVE_SIGWAIT) 411CHECK_FUNCTION_EXISTS (sigaddset HAVE_SIGADDSET) 412CHECK_FUNCTION_EXISTS (sigemptyset HAVE_SIGEMPTYSET) 413CHECK_FUNCTION_EXISTS (sighold HAVE_SIGHOLD) 414CHECK_FUNCTION_EXISTS (sigset HAVE_SIGSET) 415CHECK_FUNCTION_EXISTS (sleep HAVE_SLEEP) 416CHECK_FUNCTION_EXISTS (snprintf HAVE_SNPRINTF) 417CHECK_FUNCTION_EXISTS (stpcpy HAVE_STPCPY) 418CHECK_FUNCTION_EXISTS (strcoll HAVE_STRCOLL) 419CHECK_FUNCTION_EXISTS (strerror HAVE_STRERROR) 420CHECK_FUNCTION_EXISTS (strlcpy HAVE_STRLCPY) 421CHECK_FUNCTION_EXISTS (strnlen HAVE_STRNLEN) 422CHECK_FUNCTION_EXISTS (strlcat HAVE_STRLCAT) 423CHECK_FUNCTION_EXISTS (strsignal HAVE_STRSIGNAL) 424CHECK_FUNCTION_EXISTS (fgetln HAVE_FGETLN) 425CHECK_FUNCTION_EXISTS (strpbrk HAVE_STRPBRK) 426CHECK_FUNCTION_EXISTS (strsep HAVE_STRSEP) 427CHECK_FUNCTION_EXISTS (strstr HAVE_STRSTR) 428CHECK_FUNCTION_EXISTS (strtok_r HAVE_STRTOK_R) 429CHECK_FUNCTION_EXISTS (strtol HAVE_STRTOL) 430CHECK_FUNCTION_EXISTS (strtoll HAVE_STRTOLL) 431CHECK_FUNCTION_EXISTS (strtoul HAVE_STRTOUL) 432CHECK_FUNCTION_EXISTS (strtoull HAVE_STRTOULL) 433CHECK_FUNCTION_EXISTS (strcasecmp HAVE_STRCASECMP) 434CHECK_FUNCTION_EXISTS (strncasecmp HAVE_STRNCASECMP) 435CHECK_FUNCTION_EXISTS (strdup HAVE_STRDUP) 436CHECK_FUNCTION_EXISTS (shmat HAVE_SHMAT) 437CHECK_FUNCTION_EXISTS (shmctl HAVE_SHMCTL) 438CHECK_FUNCTION_EXISTS (shmdt HAVE_SHMDT) 439CHECK_FUNCTION_EXISTS (shmget HAVE_SHMGET) 440CHECK_FUNCTION_EXISTS (tell HAVE_TELL) 441CHECK_FUNCTION_EXISTS (tempnam HAVE_TEMPNAM) 442CHECK_FUNCTION_EXISTS (thr_setconcurrency HAVE_THR_SETCONCURRENCY) 443CHECK_FUNCTION_EXISTS (thr_yield HAVE_THR_YIELD) 444CHECK_FUNCTION_EXISTS (vasprintf HAVE_VASPRINTF) 445CHECK_FUNCTION_EXISTS (vsnprintf HAVE_VSNPRINTF) 446CHECK_FUNCTION_EXISTS (vprintf HAVE_VPRINTF) 447CHECK_FUNCTION_EXISTS (valloc HAVE_VALLOC) 448CHECK_FUNCTION_EXISTS (memalign HAVE_MEMALIGN) 449CHECK_FUNCTION_EXISTS (chown HAVE_CHOWN) 450CHECK_FUNCTION_EXISTS (nl_langinfo HAVE_NL_LANGINFO) 451 452#-------------------------------------------------------------------- 453# Support for WL#2373 (Use cycle counter for timing) 454#-------------------------------------------------------------------- 455 456CHECK_INCLUDE_FILES(time.h HAVE_TIME_H) 457CHECK_INCLUDE_FILES(sys/time.h HAVE_SYS_TIME_H) 458CHECK_INCLUDE_FILES(sys/times.h HAVE_SYS_TIMES_H) 459CHECK_INCLUDE_FILES(asm/msr.h HAVE_ASM_MSR_H) 460#msr.h has rdtscll() 461 462CHECK_INCLUDE_FILES(ia64intrin.h HAVE_IA64INTRIN_H) 463 464CHECK_FUNCTION_EXISTS(times HAVE_TIMES) 465CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY) 466CHECK_FUNCTION_EXISTS(read_real_time HAVE_READ_REAL_TIME) 467# This should work on AIX. 468 469CHECK_FUNCTION_EXISTS(ftime HAVE_FTIME) 470# This is still a normal call for milliseconds. 471 472CHECK_FUNCTION_EXISTS(time HAVE_TIME) 473# We can use time() on Macintosh if there is no ftime(). 474 475CHECK_FUNCTION_EXISTS(rdtscll HAVE_RDTSCLL) 476# I doubt that we'll ever reach the check for this. 477 478 479# 480# Tests for symbols 481# 482 483CHECK_SYMBOL_EXISTS(sys_errlist "stdio.h" HAVE_SYS_ERRLIST) 484CHECK_SYMBOL_EXISTS(madvise "sys/mman.h" HAVE_DECL_MADVISE) 485CHECK_SYMBOL_EXISTS(tzname "time.h" HAVE_TZNAME) 486CHECK_SYMBOL_EXISTS(lrand48 "stdlib.h" HAVE_LRAND48) 487CHECK_SYMBOL_EXISTS(getpagesize "unistd.h" HAVE_GETPAGESIZE) 488CHECK_SYMBOL_EXISTS(TIOCGWINSZ "sys/ioctl.h" GWINSZ_IN_SYS_IOCTL) 489CHECK_SYMBOL_EXISTS(FIONREAD "sys/ioctl.h" FIONREAD_IN_SYS_IOCTL) 490CHECK_SYMBOL_EXISTS(TIOCSTAT "sys/ioctl.h" TIOCSTAT_IN_SYS_IOCTL) 491CHECK_SYMBOL_EXISTS(FIONREAD "sys/filio.h" FIONREAD_IN_SYS_FILIO) 492CHECK_SYMBOL_EXISTS(gettimeofday "sys/time.h" HAVE_GETTIMEOFDAY) 493 494CHECK_SYMBOL_EXISTS(finite "math.h" HAVE_FINITE_IN_MATH_H) 495IF(HAVE_FINITE_IN_MATH_H) 496 SET(HAVE_FINITE TRUE CACHE INTERNAL "") 497ELSE() 498 CHECK_SYMBOL_EXISTS(finite "ieeefp.h" HAVE_FINITE) 499ENDIF() 500CHECK_SYMBOL_EXISTS(log2 math.h HAVE_LOG2) 501CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN) 502CHECK_SYMBOL_EXISTS(rint math.h HAVE_RINT) 503 504# isinf() prototype not found on Solaris 505CHECK_CXX_SOURCE_COMPILES( 506"#include <math.h> 507int main() { 508 isinf(0.0); 509 return 0; 510}" HAVE_ISINF) 511 512 513 514# 515# Test for endianess 516# 517INCLUDE(TestBigEndian) 518IF(APPLE) 519 # Cannot run endian test on universal PPC/Intel binaries 520 # would return inconsistent result. 521 # config.h.cmake includes a special #ifdef for Darwin 522ELSE() 523 TEST_BIG_ENDIAN(WORDS_BIGENDIAN) 524ENDIF() 525 526# 527# Tests for type sizes (and presence) 528# 529INCLUDE (CheckTypeSize) 530set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} 531 -D_LARGEFILE_SOURCE -D_LARGE_FILES -D_FILE_OFFSET_BITS=64 532 -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS) 533SET(CMAKE_EXTRA_INCLUDE_FILES signal.h) 534MY_CHECK_TYPE_SIZE(sigset_t SIGSET_T) 535IF(NOT SIZEOF_SIGSET_T) 536 SET(sigset_t int) 537ENDIF() 538MY_CHECK_TYPE_SIZE(mode_t MODE_T) 539IF(NOT SIZEOF_MODE_T) 540 SET(mode_t int) 541ENDIF() 542 543 544IF(HAVE_STDINT_H) 545 SET(CMAKE_EXTRA_INCLUDE_FILES stdint.h) 546ENDIF(HAVE_STDINT_H) 547 548SET(HAVE_VOIDP 1) 549SET(HAVE_CHARP 1) 550SET(HAVE_LONG 1) 551SET(HAVE_SIZE_T 1) 552 553IF(NOT APPLE) 554MY_CHECK_TYPE_SIZE("void *" VOIDP) 555MY_CHECK_TYPE_SIZE("char *" CHARP) 556MY_CHECK_TYPE_SIZE(long LONG) 557MY_CHECK_TYPE_SIZE(size_t SIZE_T) 558ENDIF() 559 560MY_CHECK_TYPE_SIZE(char CHAR) 561MY_CHECK_TYPE_SIZE(short SHORT) 562MY_CHECK_TYPE_SIZE(int INT) 563MY_CHECK_TYPE_SIZE("long long" LONG_LONG) 564SET(CMAKE_EXTRA_INCLUDE_FILES stdio.h sys/types.h time.h) 565MY_CHECK_TYPE_SIZE(off_t OFF_T) 566MY_CHECK_TYPE_SIZE(uchar UCHAR) 567MY_CHECK_TYPE_SIZE(uint UINT) 568MY_CHECK_TYPE_SIZE(ulong ULONG) 569MY_CHECK_TYPE_SIZE(int8 INT8) 570MY_CHECK_TYPE_SIZE(uint8 UINT8) 571MY_CHECK_TYPE_SIZE(int16 INT16) 572MY_CHECK_TYPE_SIZE(uint16 UINT16) 573MY_CHECK_TYPE_SIZE(int32 INT32) 574MY_CHECK_TYPE_SIZE(uint32 UINT32) 575MY_CHECK_TYPE_SIZE(u_int32_t U_INT32_T) 576MY_CHECK_TYPE_SIZE(int64 INT64) 577MY_CHECK_TYPE_SIZE(uint64 UINT64) 578MY_CHECK_TYPE_SIZE(time_t TIME_T) 579MY_CHECK_TYPE_SIZE("struct timespec" STRUCT_TIMESPEC) 580SET (CMAKE_EXTRA_INCLUDE_FILES sys/types.h) 581MY_CHECK_TYPE_SIZE(bool BOOL) 582SET(CMAKE_EXTRA_INCLUDE_FILES) 583IF(HAVE_SYS_SOCKET_H) 584 SET(CMAKE_EXTRA_INCLUDE_FILES sys/socket.h) 585ENDIF(HAVE_SYS_SOCKET_H) 586MY_CHECK_TYPE_SIZE(socklen_t SOCKLEN_T) 587SET(CMAKE_EXTRA_INCLUDE_FILES) 588 589IF(HAVE_IEEEFP_H) 590 SET(CMAKE_EXTRA_INCLUDE_FILES ieeefp.h) 591 MY_CHECK_TYPE_SIZE(fp_except FP_EXCEPT) 592ENDIF() 593 594 595# 596# Code tests 597# 598 599# check whether time_t is unsigned 600CHECK_C_SOURCE_COMPILES(" 601#include <time.h> 602int main() 603{ 604 int array[(((time_t)-1) > 0) ? 1 : -1]; 605 return 0; 606}" 607TIME_T_UNSIGNED) 608 609 610CHECK_C_SOURCE_COMPILES(" 611#ifdef _WIN32 612#include <winsock2.h> 613#include <ws2tcpip.h> 614#else 615#include <sys/types.h> 616#include <sys/socket.h> 617#include <netdb.h> 618#endif 619int main() 620{ 621 getaddrinfo( 0, 0, 0, 0); 622 return 0; 623}" 624HAVE_GETADDRINFO) 625 626CHECK_C_SOURCE_COMPILES(" 627#ifdef _WIN32 628#include <winsock2.h> 629#include <ws2tcpip.h> 630#else 631#include <sys/types.h> 632#include <sys/socket.h> 633#include <netdb.h> 634#endif 635int main() 636{ 637 select(0,0,0,0,0); 638 return 0; 639}" 640HAVE_SELECT) 641 642# 643# Check if timespec has ts_sec and ts_nsec fields 644# 645 646CHECK_C_SOURCE_COMPILES(" 647#include <pthread.h> 648 649int main(int ac, char **av) 650{ 651 struct timespec abstime; 652 abstime.ts_sec = time(NULL)+1; 653 abstime.ts_nsec = 0; 654} 655" HAVE_TIMESPEC_TS_SEC) 656 657 658# 659# Check return type of qsort() 660# 661CHECK_C_SOURCE_COMPILES(" 662#include <stdlib.h> 663#ifdef __cplusplus 664extern \"C\" 665#endif 666void qsort(void *base, size_t nel, size_t width, 667 int (*compar) (const void *, const void *)); 668int main(int ac, char **av) {} 669" QSORT_TYPE_IS_VOID) 670IF(QSORT_TYPE_IS_VOID) 671 SET(RETQSORTTYPE "void") 672ELSE(QSORT_TYPE_IS_VOID) 673 SET(RETQSORTTYPE "int") 674ENDIF(QSORT_TYPE_IS_VOID) 675 676IF(WIN32) 677SET(SOCKET_SIZE_TYPE int) 678ELSE() 679CHECK_CXX_SOURCE_COMPILES(" 680#include <sys/socket.h> 681int main(int argc, char **argv) 682{ 683 getsockname(0,0,(socklen_t *) 0); 684 return 0; 685}" 686HAVE_SOCKET_SIZE_T_AS_socklen_t) 687 688IF(HAVE_SOCKET_SIZE_T_AS_socklen_t) 689 SET(SOCKET_SIZE_TYPE socklen_t) 690ELSE() 691 CHECK_CXX_SOURCE_COMPILES(" 692 #include <sys/socket.h> 693 int main(int argc, char **argv) 694 { 695 getsockname(0,0,(int *) 0); 696 return 0; 697 }" 698 HAVE_SOCKET_SIZE_T_AS_int) 699 IF(HAVE_SOCKET_SIZE_T_AS_int) 700 SET(SOCKET_SIZE_TYPE int) 701 ELSE() 702 CHECK_CXX_SOURCE_COMPILES(" 703 #include <sys/socket.h> 704 int main(int argc, char **argv) 705 { 706 getsockname(0,0,(size_t *) 0); 707 return 0; 708 }" 709 HAVE_SOCKET_SIZE_T_AS_size_t) 710 IF(HAVE_SOCKET_SIZE_T_AS_size_t) 711 SET(SOCKET_SIZE_TYPE size_t) 712 ELSE() 713 SET(SOCKET_SIZE_TYPE int) 714 ENDIF() 715 ENDIF() 716ENDIF() 717ENDIF() 718 719CHECK_CXX_SOURCE_COMPILES(" 720#include <pthread.h> 721int main() 722{ 723 pthread_yield(); 724 return 0; 725} 726" HAVE_PTHREAD_YIELD_ZERO_ARG) 727 728IF(NOT STACK_DIRECTION) 729 IF(CMAKE_CROSSCOMPILING) 730 MESSAGE(FATAL_ERROR 731 "STACK_DIRECTION is not defined. Please specify -DSTACK_DIRECTION=1 " 732 "or -DSTACK_DIRECTION=-1 when calling cmake.") 733 ELSE() 734 TRY_RUN(STACKDIR_RUN_RESULT STACKDIR_COMPILE_RESULT 735 ${CMAKE_BINARY_DIR} 736 ${CMAKE_SOURCE_DIR}/cmake/stack_direction.c 737 ) 738 # Test program returns 0 (down) or 1 (up). 739 # Convert to -1 or 1 740 IF(STACKDIR_RUN_RESULT EQUAL 0) 741 SET(STACK_DIRECTION -1 CACHE INTERNAL "Stack grows direction") 742 ELSE() 743 SET(STACK_DIRECTION 1 CACHE INTERNAL "Stack grows direction") 744 ENDIF() 745 MESSAGE(STATUS "Checking stack direction : ${STACK_DIRECTION}") 746 ENDIF() 747ENDIF() 748 749# 750# Check return type of signal handlers 751# 752CHECK_C_SOURCE_COMPILES(" 753#include <signal.h> 754#ifdef signal 755# undef signal 756#endif 757#ifdef __cplusplus 758extern \"C\" void (*signal (int, void (*)(int)))(int); 759#else 760void (*signal ()) (); 761#endif 762int main(int ac, char **av) {} 763" SIGNAL_RETURN_TYPE_IS_VOID) 764IF(SIGNAL_RETURN_TYPE_IS_VOID) 765 SET(RETSIGTYPE void) 766 SET(VOID_SIGHANDLER 1) 767ELSE(SIGNAL_RETURN_TYPE_IS_VOID) 768 SET(RETSIGTYPE int) 769ENDIF(SIGNAL_RETURN_TYPE_IS_VOID) 770 771 772CHECK_INCLUDE_FILES("time.h;sys/time.h" TIME_WITH_SYS_TIME) 773CHECK_SYMBOL_EXISTS(O_NONBLOCK "unistd.h;fcntl.h" HAVE_FCNTL_NONBLOCK) 774IF(NOT HAVE_FCNTL_NONBLOCK) 775 SET(NO_FCNTL_NONBLOCK 1) 776ENDIF() 777 778# 779# Test for how the C compiler does inline, if at all 780# 781CHECK_C_SOURCE_COMPILES(" 782static inline int foo(){return 0;} 783int main(int argc, char *argv[]){return 0;}" 784 C_HAS_inline) 785IF(NOT C_HAS_inline) 786 CHECK_C_SOURCE_COMPILES(" 787 static __inline int foo(){return 0;} 788 int main(int argc, char *argv[]){return 0;}" 789 C_HAS___inline) 790 SET(C_INLINE __inline) 791ENDIF() 792 793IF(NOT CMAKE_CROSSCOMPILING AND NOT MSVC) 794 STRING(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} processor) 795 IF(processor MATCHES "86" OR processor MATCHES "amd64" OR processor MATCHES "x64") 796 #Check for x86 PAUSE instruction 797 # We have to actually try running the test program, because of a bug 798 # in Solaris on x86_64, where it wrongly reports that PAUSE is not 799 # supported when trying to run an application. See 800 # http://bugs.opensolaris.org/bugdatabase/printableBug.do?bug_id=6478684 801 CHECK_C_SOURCE_RUNS(" 802 int main() 803 { 804 __asm__ __volatile__ (\"pause\"); 805 return 0; 806 }" HAVE_PAUSE_INSTRUCTION) 807 ENDIF() 808 IF (NOT HAVE_PAUSE_INSTRUCTION) 809 CHECK_C_SOURCE_COMPILES(" 810 int main() 811 { 812 __asm__ __volatile__ (\"rep; nop\"); 813 return 0; 814 } 815 " HAVE_FAKE_PAUSE_INSTRUCTION) 816 ENDIF() 817ENDIF() 818 819CHECK_SYMBOL_EXISTS(tcgetattr "termios.h" HAVE_TCGETATTR 1) 820 821# 822# Check type of signal routines (posix, 4.2bsd, 4.1bsd or v7) 823# 824CHECK_C_SOURCE_COMPILES(" 825 #include <signal.h> 826 int main(int ac, char **av) 827 { 828 sigset_t ss; 829 struct sigaction sa; 830 sigemptyset(&ss); sigsuspend(&ss); 831 sigaction(SIGINT, &sa, (struct sigaction *) 0); 832 sigprocmask(SIG_BLOCK, &ss, (sigset_t *) 0); 833 }" 834 HAVE_POSIX_SIGNALS) 835 836IF(NOT HAVE_POSIX_SIGNALS) 837 CHECK_C_SOURCE_COMPILES(" 838 #include <signal.h> 839 int main(int ac, char **av) 840 { 841 int mask = sigmask(SIGINT); 842 sigsetmask(mask); sigblock(mask); sigpause(mask); 843 }" 844 HAVE_BSD_SIGNALS) 845 IF (NOT HAVE_BSD_SIGNALS) 846 CHECK_C_SOURCE_COMPILES(" 847 #include <signal.h> 848 void foo() { } 849 int main(int ac, char **av) 850 { 851 int mask = sigmask(SIGINT); 852 sigset(SIGINT, foo); sigrelse(SIGINT); 853 sighold(SIGINT); sigpause(SIGINT); 854 }" 855 HAVE_SVR3_SIGNALS) 856 IF (NOT HAVE_SVR3_SIGNALS) 857 SET(HAVE_V7_SIGNALS 1) 858 ENDIF(NOT HAVE_SVR3_SIGNALS) 859 ENDIF(NOT HAVE_BSD_SIGNALS) 860ENDIF(NOT HAVE_POSIX_SIGNALS) 861 862# Assume regular sprintf 863SET(SPRINTFS_RETURNS_INT 1) 864 865IF(CMAKE_COMPILER_IS_GNUCXX AND HAVE_CXXABI_H) 866CHECK_CXX_SOURCE_COMPILES(" 867 #include <cxxabi.h> 868 int main(int argc, char **argv) 869 { 870 char *foo= 0; int bar= 0; 871 foo= abi::__cxa_demangle(foo, foo, 0, &bar); 872 return 0; 873 }" 874 HAVE_ABI_CXA_DEMANGLE) 875ENDIF() 876 877CHECK_C_SOURCE_COMPILES(" 878 int main(int argc, char **argv) 879 { 880 extern char *__bss_start; 881 return __bss_start ? 1 : 0; 882 }" 883HAVE_BSS_START) 884 885CHECK_C_SOURCE_COMPILES(" 886 int main() 887 { 888 extern void __attribute__((weak)) foo(void); 889 return 0; 890 }" 891 HAVE_WEAK_SYMBOL 892) 893 894 895CHECK_CXX_SOURCE_COMPILES(" 896 #include <new> 897 int main() 898 { 899 char *c = new char; 900 return 0; 901 }" 902 HAVE_CXX_NEW 903) 904 905CHECK_CXX_SOURCE_COMPILES(" 906 #undef inline 907 #if !defined(SCO) && !defined(__osf__) && !defined(_REENTRANT) 908 #define _REENTRANT 909 #endif 910 #include <pthread.h> 911 #include <sys/types.h> 912 #include <sys/socket.h> 913 #include <netinet/in.h> 914 #include <arpa/inet.h> 915 #include <netdb.h> 916 int main() 917 { 918 919 struct hostent *foo = 920 gethostbyaddr_r((const char *) 0, 921 0, 0, (struct hostent *) 0, (char *) NULL, 0, (int *)0); 922 return 0; 923 } 924 " 925 HAVE_SOLARIS_STYLE_GETHOST) 926 927# Use of ALARMs to wakeup on timeout on sockets 928# 929# This feature makes use of a mutex and is a scalability hog we 930# try to avoid using. However we need support for SO_SNDTIMEO and 931# SO_RCVTIMEO socket options for this to work. So we will check 932# if this feature is supported by a simple TRY_RUN macro. However 933# on some OS's there is support for setting those variables but 934# they are silently ignored. For those OS's we will not attempt 935# to use SO_SNDTIMEO and SO_RCVTIMEO even if it is said to work. 936# See Bug#29093 for the problem with SO_SND/RCVTIMEO on HP/UX. 937# To use alarm is simple, simply avoid setting anything. 938 939IF(WIN32) 940 SET(HAVE_SOCKET_TIMEOUT 1) 941ELSEIF(CMAKE_SYSTEM MATCHES "HP-UX") 942 SET(HAVE_SOCKET_TIMEOUT 0) 943ELSEIF(CMAKE_CROSSCOMPILING) 944 SET(HAVE_SOCKET_TIMEOUT 0) 945ELSE() 946SET(CMAKE_REQUIRED_LIBRARIES ${LIBNSL} ${LIBSOCKET}) 947CHECK_C_SOURCE_RUNS( 948" 949 #include <sys/types.h> 950 #include <sys/socket.h> 951 #include <sys/time.h> 952 953 int main() 954 { 955 int fd = socket(AF_INET, SOCK_STREAM, 0); 956 struct timeval tv; 957 int ret= 0; 958 tv.tv_sec= 2; 959 tv.tv_usec= 0; 960 ret|= setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)); 961 ret|= setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); 962 return !!ret; 963 } 964" HAVE_SOCKET_TIMEOUT) 965ENDIF() 966 967SET(NO_ALARM "${HAVE_SOCKET_TIMEOUT}" CACHE BOOL 968 "No need to use alarm to implement socket timeout") 969SET(SIGNAL_WITH_VIO_CLOSE "${HAVE_SOCKET_TIMEOUT}") 970MARK_AS_ADVANCED(NO_ALARM) 971 972 973IF(CMAKE_COMPILER_IS_GNUCXX) 974IF(WITH_ATOMIC_OPS STREQUAL "up") 975 SET(MY_ATOMIC_MODE_DUMMY 1 CACHE BOOL "Assume single-CPU mode, no concurrency") 976ELSEIF(WITH_ATOMIC_OPS STREQUAL "rwlocks") 977 SET(MY_ATOMIC_MODE_RWLOCK 1 CACHE BOOL "Use pthread rwlocks for atomic ops") 978ELSEIF(WITH_ATOMIC_OPS STREQUAL "smp") 979ELSEIF(NOT WITH_ATOMIC_OPS) 980 CHECK_CXX_SOURCE_COMPILES(" 981 int main() 982 { 983 int foo= -10; int bar= 10; 984 long long int foo64= -10; long long int bar64= 10; 985 if (!__sync_fetch_and_add(&foo, bar) || foo) 986 return -1; 987 bar= __sync_lock_test_and_set(&foo, bar); 988 if (bar || foo != 10) 989 return -1; 990 bar= __sync_val_compare_and_swap(&bar, foo, 15); 991 if (bar) 992 return -1; 993 if (!__sync_fetch_and_add(&foo64, bar64) || foo64) 994 return -1; 995 bar64= __sync_lock_test_and_set(&foo64, bar64); 996 if (bar64 || foo64 != 10) 997 return -1; 998 bar64= __sync_val_compare_and_swap(&bar64, foo, 15); 999 if (bar64) 1000 return -1; 1001 return 0; 1002 }" 1003 HAVE_GCC_ATOMIC_BUILTINS) 1004ELSE() 1005 MESSAGE(FATAL_ERROR "${WITH_ATOMIC_OPS} is not a valid value for WITH_ATOMIC_OPS!") 1006ENDIF() 1007ENDIF() 1008 1009SET(WITH_ATOMIC_LOCKS "${WITH_ATOMIC_LOCKS}" CACHE STRING 1010"Implement atomic operations using pthread rwlocks or atomic CPU 1011instructions for multi-processor or uniprocessor 1012configuration. By default gcc built-in sync functions are used, 1013if available and 'smp' configuration otherwise.") 1014MARK_AS_ADVANCED(WITH_ATOMIC_LOCKS MY_ATOMIC_MODE_RWLOCK MY_ATOMIC_MODE_DUMMY) 1015 1016IF(WITH_VALGRIND) 1017 CHECK_INCLUDE_FILES("valgrind/memcheck.h;valgrind/valgrind.h" 1018 HAVE_VALGRIND_HEADERS) 1019 IF(HAVE_VALGRIND_HEADERS) 1020 SET(HAVE_VALGRIND 1) 1021 ENDIF() 1022ENDIF() 1023 1024#-------------------------------------------------------------------- 1025# Check for IPv6 support 1026#-------------------------------------------------------------------- 1027CHECK_INCLUDE_FILE(netinet/in6.h HAVE_NETINET_IN6_H) 1028 1029IF(UNIX) 1030 SET(CMAKE_EXTRA_INCLUDE_FILES sys/types.h netinet/in.h sys/socket.h) 1031 IF(HAVE_NETINET_IN6_H) 1032 SET(CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_EXTRA_INCLUDE_FILES} netinet/in6.h) 1033 ENDIF() 1034ELSEIF(WIN32) 1035 SET(CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_EXTRA_INCLUDE_FILES} winsock2.h ws2ipdef.h) 1036ENDIF() 1037 1038MY_CHECK_STRUCT_SIZE("sockaddr_in6" SOCKADDR_IN6) 1039MY_CHECK_STRUCT_SIZE("in6_addr" IN6_ADDR) 1040 1041IF(HAVE_STRUCT_SOCKADDR_IN6 OR HAVE_STRUCT_IN6_ADDR) 1042 SET(HAVE_IPV6 TRUE CACHE INTERNAL "") 1043ENDIF() 1044 1045 1046# Check for sockaddr_storage.ss_family 1047# It is called differently under OS400 and older AIX 1048 1049CHECK_STRUCT_HAS_MEMBER("struct sockaddr_storage" 1050 ss_family "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SOCKADDR_STORAGE_SS_FAMILY) 1051IF(NOT HAVE_SOCKADDR_STORAGE_SS_FAMILY) 1052 CHECK_STRUCT_HAS_MEMBER("struct sockaddr_storage" 1053 __ss_family "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SOCKADDR_STORAGE___SS_FAMILY) 1054 IF(HAVE_SOCKADDR_STORAGE___SS_FAMILY) 1055 SET(ss_family __ss_family) 1056 ENDIF() 1057ENDIF() 1058 1059# 1060# Check if struct sockaddr_in::sin_len is available. 1061# 1062 1063CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in" sin_len 1064 "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SOCKADDR_IN_SIN_LEN) 1065 1066# 1067# Check if struct sockaddr_in6::sin6_len is available. 1068# 1069 1070CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in6" sin6_len 1071 "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SOCKADDR_IN6_SIN6_LEN) 1072 1073SET(CMAKE_EXTRA_INCLUDE_FILES) 1074 1075CHECK_STRUCT_HAS_MEMBER("struct dirent" d_ino "dirent.h" STRUCT_DIRENT_HAS_D_INO) 1076CHECK_STRUCT_HAS_MEMBER("struct dirent" d_namlen "dirent.h" STRUCT_DIRENT_HAS_D_NAMLEN) 1077SET(SPRINTF_RETURNS_INT 1) 1078