1# Copyright (c) 2009, 2017, 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, version 2.0, 5# as published by the Free Software Foundation. 6# 7# This program is also distributed with certain software (including 8# but not limited to OpenSSL) that is licensed under separate terms, 9# as designated in a particular file or component or in included license 10# documentation. The authors of MySQL hereby grant you an additional 11# permission to link the program and your derivative works with the 12# separately licensed software that they have included with MySQL. 13# 14# This program is distributed in the hope that it will be useful, 15# but WITHOUT ANY WARRANTY; without even the implied warranty of 16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17# GNU General Public License, version 2.0, for more details. 18# 19# You should have received a copy of the GNU General Public License 20# along with this program; if not, write to the Free Software 21# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 22# 23 24INCLUDE (CheckCSourceCompiles) 25INCLUDE (CheckCXXSourceCompiles) 26INCLUDE (CheckStructHasMember) 27INCLUDE (CheckLibraryExists) 28INCLUDE (CheckFunctionExists) 29INCLUDE (CheckCCompilerFlag) 30INCLUDE (CheckCSourceRuns) 31INCLUDE (CheckCXXSourceRuns) 32INCLUDE (CheckSymbolExists) 33 34 35# WITH_PIC options.Not of much use, PIC is taken care of on platforms 36# where it makes sense anyway. 37IF(UNIX) 38 IF(APPLE) 39 # OSX executable are always PIC 40 SET(WITH_PIC ON) 41 ELSE() 42 OPTION(WITH_PIC "Generate PIC objects" OFF) 43 IF(WITH_PIC) 44 SET(CMAKE_C_FLAGS 45 "${CMAKE_C_FLAGS} ${CMAKE_SHARED_LIBRARY_C_FLAGS}") 46 SET(CMAKE_CXX_FLAGS 47 "${CMAKE_CXX_FLAGS} ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}") 48 ENDIF() 49 ENDIF() 50ENDIF() 51 52 53IF(CMAKE_SYSTEM_NAME MATCHES "SunOS" AND CMAKE_COMPILER_IS_GNUCXX) 54 ## We will be using gcc to generate .so files 55 ## Add C flags (e.g. -m64) to CMAKE_SHARED_LIBRARY_C_FLAGS 56 SET(CMAKE_SHARED_LIBRARY_C_FLAGS 57 "${CMAKE_SHARED_LIBRARY_C_FLAGS} ${CMAKE_C_FLAGS}") 58ENDIF() 59 60 61# System type affects version_compile_os variable 62IF(NOT SYSTEM_TYPE) 63 IF(PLATFORM) 64 SET(SYSTEM_TYPE ${PLATFORM}) 65 ELSE() 66 SET(SYSTEM_TYPE ${CMAKE_SYSTEM_NAME}) 67 ENDIF() 68ENDIF() 69 70# As a consequence of ALARMs no longer being used, thread 71# notification for KILL must close the socket to wake up 72# other threads. 73SET(SIGNAL_WITH_VIO_SHUTDOWN 1) 74 75# The default C++ library for SunPro is really old, and not standards compliant. 76# http://www.oracle.com/technetwork/server-storage/solaris10/cmp-stlport-libcstd-142559.html 77# Use stlport rather than Rogue Wave, 78# unless otherwise specified on command line. 79IF(CMAKE_SYSTEM_NAME MATCHES "SunOS") 80 IF(CMAKE_CXX_COMPILER_ID MATCHES "SunPro") 81 IF(CMAKE_CXX_FLAGS MATCHES "-std=") 82 ADD_DEFINITIONS(-D__MATHERR_RENAME_EXCEPTION) 83 SET(CMAKE_SHARED_LIBRARY_C_FLAGS 84 "${CMAKE_SHARED_LIBRARY_C_FLAGS} -lc") 85 SET(CMAKE_SHARED_LIBRARY_CXX_FLAGS 86 "${CMAKE_SHARED_LIBRARY_CXX_FLAGS} -lstdc++ -lgcc_s -lCrunG3 -lc") 87 SET(QUOTED_CMAKE_CXX_LINK_FLAGS "-lstdc++ -lgcc_s -lCrunG3 -lc") 88 ELSE() 89 IF(SUNPRO_CXX_LIBRARY) 90 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -library=${SUNPRO_CXX_LIBRARY}") 91 IF(SUNPRO_CXX_LIBRARY STREQUAL "stdcxx4") 92 ADD_DEFINITIONS(-D__MATHERR_RENAME_EXCEPTION) 93 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -template=extdef") 94 ENDIF() 95 ELSE() 96 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -library=stlport4") 97 ENDIF() 98 ENDIF() 99 ENDIF() 100ENDIF() 101 102# Check to see if we are using LLVM's libc++ rather than e.g. libstd++ 103# Can then check HAVE_LLBM_LIBCPP later without including e.g. ciso646. 104CHECK_CXX_SOURCE_RUNS(" 105#include <ciso646> 106int main() 107{ 108#ifdef _LIBCPP_VERSION 109 return 0; 110#else 111 return 1; 112#endif 113}" HAVE_LLVM_LIBCPP) 114 115MACRO(DIRNAME IN OUT) 116 GET_FILENAME_COMPONENT(${OUT} ${IN} PATH) 117ENDMACRO() 118 119MACRO(FIND_REAL_LIBRARY SOFTLINK_NAME REALNAME) 120 # We re-distribute libstlport.so/libstdc++.so which are both symlinks. 121 # There is no 'readlink' on solaris, so we use perl to follow links: 122 SET(PERLSCRIPT 123 "my $link= $ARGV[0]; use Cwd qw(abs_path); my $file = abs_path($link); print $file;") 124 EXECUTE_PROCESS( 125 COMMAND perl -e "${PERLSCRIPT}" ${SOFTLINK_NAME} 126 RESULT_VARIABLE result 127 OUTPUT_VARIABLE real_library 128 ) 129 SET(REALNAME ${real_library}) 130ENDMACRO() 131 132MACRO(EXTEND_CXX_LINK_FLAGS LIBRARY_PATH) 133 # Using the $ORIGIN token with the -R option to locate the libraries 134 # on a path relative to the executable: 135 # We need an extra backslash to pass $ORIGIN to the mysql_config script... 136 SET(QUOTED_CMAKE_CXX_LINK_FLAGS 137 "${CMAKE_CXX_LINK_FLAGS} -R'\\$ORIGIN/../lib' -R${LIBRARY_PATH}") 138 SET(CMAKE_CXX_LINK_FLAGS 139 "${CMAKE_CXX_LINK_FLAGS} -R'\$ORIGIN/../lib' -R${LIBRARY_PATH}") 140 MESSAGE(STATUS "CMAKE_CXX_LINK_FLAGS ${CMAKE_CXX_LINK_FLAGS}") 141ENDMACRO() 142 143MACRO(EXTEND_C_LINK_FLAGS LIBRARY_PATH) 144 SET(QUOTED_CMAKE_C_LINK_FLAGS 145 "${CMAKE_C_LINK_FLAGS} -R'\\$ORIGIN/../lib' -R${LIBRARY_PATH}") 146 SET(CMAKE_C_LINK_FLAGS 147 "${CMAKE_C_LINK_FLAGS} -R'\$ORIGIN/../lib' -R${LIBRARY_PATH}") 148 MESSAGE(STATUS "CMAKE_C_LINK_FLAGS ${CMAKE_C_LINK_FLAGS}") 149 SET(CMAKE_SHARED_LIBRARY_C_FLAGS 150 "${CMAKE_SHARED_LIBRARY_C_FLAGS} -R'\$ORIGIN/..' -R'\$ORIGIN/../lib' -R${LIBRARY_PATH}") 151ENDMACRO() 152 153IF(CMAKE_SYSTEM_NAME MATCHES "SunOS" AND 154 CMAKE_C_COMPILER_ID MATCHES "SunPro" AND 155 CMAKE_CXX_FLAGS MATCHES "stlport4") 156 DIRNAME(${CMAKE_CXX_COMPILER} CXX_PATH) 157 # Also extract real path to the compiler(which is normally 158 # in <install_path>/prod/bin) and try to find the 159 # stlport libs relative to that location as well. 160 GET_FILENAME_COMPONENT(CXX_REALPATH ${CMAKE_CXX_COMPILER} REALPATH) 161 162 # CC -V yields 163 # CC: Studio 12.6 Sun C++ 5.15 SunOS_sparc Beta 2016/12/19 164 # CC: Studio 12.5 Sun C++ 5.14 SunOS_sparc Dodona 2016/04/04 165 # CC: Sun C++ 5.13 SunOS_sparc Beta 2014/03/11 166 # CC: Sun C++ 5.11 SunOS_sparc 2010/08/13 167 168 EXECUTE_PROCESS( 169 COMMAND ${CMAKE_CXX_COMPILER} "-V" 170 OUTPUT_VARIABLE stdout 171 ERROR_VARIABLE stderr 172 RESULT_VARIABLE result 173 ) 174 IF(result) 175 MESSAGE(FATAL_ERROR "Failed to execute ${CMAKE_CXX_COMPILER} -V") 176 ENDIF() 177 178 STRING(REGEX MATCH "CC: Sun C\\+\\+ 5\\.([0-9]+)" VERSION_STRING ${stderr}) 179 IF (NOT CMAKE_MATCH_1 OR CMAKE_MATCH_1 STREQUAL "") 180 STRING(REGEX MATCH "CC: Studio 12\\.[56] Sun C\\+\\+ 5\\.([0-9]+)" 181 VERSION_STRING ${stderr}) 182 ENDIF() 183 SET(CC_MINOR_VERSION ${CMAKE_MATCH_1}) 184 185 IF(${CC_MINOR_VERSION} GREATER 12) 186 SET(STLPORT_SUFFIX "lib/compilers/stlport4") 187 IF(SIZEOF_VOIDP EQUAL 8 AND CMAKE_SYSTEM_PROCESSOR MATCHES "sparc") 188 SET(STLPORT_SUFFIX "lib/compilers/stlport4/sparcv9") 189 ENDIF() 190 IF(SIZEOF_VOIDP EQUAL 8 AND CMAKE_SYSTEM_PROCESSOR MATCHES "i386") 191 SET(STLPORT_SUFFIX "lib/compilers/stlport4/amd64") 192 ENDIF() 193 ELSE() 194 SET(STLPORT_SUFFIX "lib/stlport4") 195 IF(SIZEOF_VOIDP EQUAL 8 AND CMAKE_SYSTEM_PROCESSOR MATCHES "sparc") 196 SET(STLPORT_SUFFIX "lib/stlport4/v9") 197 ENDIF() 198 IF(SIZEOF_VOIDP EQUAL 8 AND CMAKE_SYSTEM_PROCESSOR MATCHES "i386") 199 SET(STLPORT_SUFFIX "lib/stlport4/amd64") 200 ENDIF() 201 ENDIF() 202 203 FIND_LIBRARY(STL_LIBRARY_NAME 204 NAMES "stlport" 205 PATHS ${CXX_PATH}/../${STLPORT_SUFFIX} 206 ${CXX_REALPATH}/../../${STLPORT_SUFFIX} 207 ) 208 MESSAGE(STATUS "STL_LIBRARY_NAME ${STL_LIBRARY_NAME}") 209 IF(STL_LIBRARY_NAME) 210 DIRNAME(${STL_LIBRARY_NAME} STLPORT_PATH) 211 FIND_REAL_LIBRARY(${STL_LIBRARY_NAME} real_library) 212 MESSAGE(STATUS "INSTALL ${STL_LIBRARY_NAME} ${real_library}") 213 INSTALL(FILES ${STL_LIBRARY_NAME} ${real_library} 214 DESTINATION ${INSTALL_LIBDIR} COMPONENT SharedLibraries) 215 EXTEND_C_LINK_FLAGS(${STLPORT_PATH}) 216 EXTEND_CXX_LINK_FLAGS(${STLPORT_PATH}) 217 ELSE() 218 MESSAGE(STATUS "Failed to find the required stlport library, print some" 219 "variables to help debugging and bail out") 220 MESSAGE(STATUS "CMAKE_CXX_COMPILER ${CMAKE_CXX_COMPILER}") 221 MESSAGE(STATUS "CXX_PATH ${CXX_PATH}") 222 MESSAGE(STATUS "CXX_REALPATH ${CXX_REALPATH}") 223 MESSAGE(STATUS "STLPORT_SUFFIX ${STLPORT_SUFFIX}") 224 MESSAGE(STATUS "PATH: ${CXX_PATH}/../${STLPORT_SUFFIX}") 225 MESSAGE(STATUS "PATH: ${CXX_REALPATH}/../../${STLPORT_SUFFIX}") 226 MESSAGE(FATAL_ERROR 227 "Could not find the required stlport library.") 228 ENDIF() 229ENDIF() 230 231IF(CMAKE_COMPILER_IS_GNUCXX) 232 IF (CMAKE_EXE_LINKER_FLAGS MATCHES " -static " 233 OR CMAKE_EXE_LINKER_FLAGS MATCHES " -static$") 234 SET(HAVE_DLOPEN FALSE CACHE "Disable dlopen due to -static flag" FORCE) 235 SET(WITHOUT_DYNAMIC_PLUGINS TRUE) 236 ENDIF() 237ENDIF() 238 239IF(WITHOUT_DYNAMIC_PLUGINS) 240 MESSAGE("Dynamic plugins are disabled.") 241ENDIF(WITHOUT_DYNAMIC_PLUGINS) 242 243# Large files, common flag 244SET(_LARGEFILE_SOURCE 1) 245 246# If finds the size of a type, set SIZEOF_<type> and HAVE_<type> 247FUNCTION(MY_CHECK_TYPE_SIZE type defbase) 248 CHECK_TYPE_SIZE("${type}" SIZEOF_${defbase}) 249 IF(SIZEOF_${defbase}) 250 SET(HAVE_${defbase} 1 PARENT_SCOPE) 251 ENDIF() 252ENDFUNCTION() 253 254# Same for structs, setting HAVE_STRUCT_<name> instead 255FUNCTION(MY_CHECK_STRUCT_SIZE type defbase) 256 CHECK_TYPE_SIZE("struct ${type}" SIZEOF_${defbase}) 257 IF(SIZEOF_${defbase}) 258 SET(HAVE_STRUCT_${defbase} 1 PARENT_SCOPE) 259 ENDIF() 260ENDFUNCTION() 261 262# Searches function in libraries 263# if function is found, sets output parameter result to the name of the library 264# if function is found in libc, result will be empty 265FUNCTION(MY_SEARCH_LIBS func libs result) 266 IF(${${result}}) 267 # Library is already found or was predefined 268 RETURN() 269 ENDIF() 270 CHECK_FUNCTION_EXISTS(${func} HAVE_${func}_IN_LIBC) 271 IF(HAVE_${func}_IN_LIBC) 272 SET(${result} "" PARENT_SCOPE) 273 RETURN() 274 ENDIF() 275 FOREACH(lib ${libs}) 276 CHECK_LIBRARY_EXISTS(${lib} ${func} "" HAVE_${func}_IN_${lib}) 277 IF(HAVE_${func}_IN_${lib}) 278 SET(${result} ${lib} PARENT_SCOPE) 279 SET(HAVE_${result} 1 PARENT_SCOPE) 280 RETURN() 281 ENDIF() 282 ENDFOREACH() 283ENDFUNCTION() 284 285# Find out which libraries to use. 286IF(UNIX) 287 MY_SEARCH_LIBS(floor m LIBM) 288 IF(NOT LIBM) 289 MY_SEARCH_LIBS(__infinity m LIBM) 290 ENDIF() 291 MY_SEARCH_LIBS(gethostbyname_r "nsl_r;nsl" LIBNSL) 292 MY_SEARCH_LIBS(bind "bind;socket" LIBBIND) 293 MY_SEARCH_LIBS(crypt crypt LIBCRYPT) 294 MY_SEARCH_LIBS(setsockopt socket LIBSOCKET) 295 MY_SEARCH_LIBS(dlopen dl LIBDL) 296 MY_SEARCH_LIBS(sched_yield rt LIBRT) 297 IF(NOT LIBRT) 298 MY_SEARCH_LIBS(clock_gettime rt LIBRT) 299 ENDIF() 300 MY_SEARCH_LIBS(backtrace execinfo LIBEXECINFO) 301 302 FIND_PACKAGE(Threads) 303 304 SET(CMAKE_REQUIRED_LIBRARIES 305 ${LIBM} ${LIBNSL} ${LIBBIND} ${LIBCRYPT} ${LIBSOCKET} ${LIBDL} 306 ${CMAKE_THREAD_LIBS_INIT} ${LIBRT} ${LIBEXECINFO} 307 ) 308 # Need explicit pthread for gcc -fsanitize=address 309 IF(CMAKE_USE_PTHREADS_INIT AND CMAKE_C_FLAGS MATCHES "-fsanitize=") 310 SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} pthread) 311 ENDIF() 312 313 LIST(LENGTH CMAKE_REQUIRED_LIBRARIES required_libs_length) 314 IF(${required_libs_length} GREATER 0) 315 LIST(REMOVE_DUPLICATES CMAKE_REQUIRED_LIBRARIES) 316 ENDIF() 317 LINK_LIBRARIES(${CMAKE_THREAD_LIBS_INIT}) 318 319 OPTION(WITH_LIBWRAP "Compile with tcp wrappers support" OFF) 320 IF(WITH_LIBWRAP) 321 SET(SAVE_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) 322 SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} wrap) 323 CHECK_C_SOURCE_COMPILES( 324 " 325 #include <tcpd.h> 326 int allow_severity = 0; 327 int deny_severity = 0; 328 int main() 329 { 330 hosts_access(0); 331 }" 332 HAVE_LIBWRAP) 333 SET(CMAKE_REQUIRED_LIBRARIES ${SAVE_CMAKE_REQUIRED_LIBRARIES}) 334 IF(HAVE_LIBWRAP) 335 SET(MYSYS_LIBWRAP_SOURCE ${CMAKE_SOURCE_DIR}/mysys/my_libwrap.c) 336 SET(LIBWRAP "wrap") 337 ELSE() 338 MESSAGE(FATAL_ERROR 339 "WITH_LIBWRAP is defined, but can not find a working libwrap. " 340 "Make sure both the header files (tcpd.h) " 341 "and the library (libwrap) are installed.") 342 ENDIF() 343 ENDIF() 344ENDIF() 345 346# 347# Tests for header files 348# 349INCLUDE (CheckIncludeFiles) 350 351CHECK_INCLUDE_FILES ("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS) 352CHECK_INCLUDE_FILES (sys/types.h HAVE_SYS_TYPES_H) 353CHECK_INCLUDE_FILES (alloca.h HAVE_ALLOCA_H) 354CHECK_INCLUDE_FILES (aio.h HAVE_AIO_H) 355CHECK_INCLUDE_FILES (arpa/inet.h HAVE_ARPA_INET_H) 356CHECK_INCLUDE_FILES (crypt.h HAVE_CRYPT_H) 357CHECK_INCLUDE_FILES (cxxabi.h HAVE_CXXABI_H) 358CHECK_INCLUDE_FILES (dlfcn.h HAVE_DLFCN_H) 359CHECK_INCLUDE_FILES (execinfo.h HAVE_EXECINFO_H) 360CHECK_INCLUDE_FILES (fcntl.h HAVE_FCNTL_H) 361CHECK_INCLUDE_FILES (fenv.h HAVE_FENV_H) 362CHECK_INCLUDE_FILES (float.h HAVE_FLOAT_H) 363CHECK_INCLUDE_FILES (floatingpoint.h HAVE_FLOATINGPOINT_H) 364CHECK_INCLUDE_FILES (fpu_control.h HAVE_FPU_CONTROL_H) 365CHECK_INCLUDE_FILES (grp.h HAVE_GRP_H) 366CHECK_INCLUDE_FILES (ieeefp.h HAVE_IEEEFP_H) 367CHECK_INCLUDE_FILES (inttypes.h HAVE_INTTYPES_H) 368CHECK_INCLUDE_FILES (langinfo.h HAVE_LANGINFO_H) 369CHECK_INCLUDE_FILES (limits.h HAVE_LIMITS_H) 370CHECK_INCLUDE_FILES (locale.h HAVE_LOCALE_H) 371CHECK_INCLUDE_FILES (malloc.h HAVE_MALLOC_H) 372CHECK_INCLUDE_FILES (memory.h HAVE_MEMORY_H) 373CHECK_INCLUDE_FILES (ndir.h HAVE_NDIR_H) 374CHECK_INCLUDE_FILES (netinet/in.h HAVE_NETINET_IN_H) 375CHECK_INCLUDE_FILES (paths.h HAVE_PATHS_H) 376CHECK_INCLUDE_FILES (port.h HAVE_PORT_H) 377CHECK_INCLUDE_FILES (poll.h HAVE_POLL_H) 378CHECK_INCLUDE_FILES (pwd.h HAVE_PWD_H) 379CHECK_INCLUDE_FILES (sched.h HAVE_SCHED_H) 380CHECK_INCLUDE_FILES (select.h HAVE_SELECT_H) 381CHECK_INCLUDE_FILES (semaphore.h HAVE_SEMAPHORE_H) 382CHECK_INCLUDE_FILES ("sys/types.h;sys/dir.h" HAVE_SYS_DIR_H) 383CHECK_INCLUDE_FILES (sys/ndir.h HAVE_SYS_NDIR_H) 384CHECK_INCLUDE_FILES (sys/pte.h HAVE_SYS_PTE_H) 385CHECK_INCLUDE_FILES (stddef.h HAVE_STDDEF_H) 386CHECK_INCLUDE_FILES (stdint.h HAVE_STDINT_H) 387CHECK_INCLUDE_FILES (stdlib.h HAVE_STDLIB_H) 388CHECK_INCLUDE_FILES (strings.h HAVE_STRINGS_H) 389CHECK_INCLUDE_FILES (string.h HAVE_STRING_H) 390CHECK_INCLUDE_FILES (synch.h HAVE_SYNCH_H) 391CHECK_INCLUDE_FILES (sysent.h HAVE_SYSENT_H) 392CHECK_INCLUDE_FILES (sys/cdefs.h HAVE_SYS_CDEFS_H) 393CHECK_INCLUDE_FILES (sys/file.h HAVE_SYS_FILE_H) 394CHECK_INCLUDE_FILES (sys/fpu.h HAVE_SYS_FPU_H) 395CHECK_INCLUDE_FILES (sys/ioctl.h HAVE_SYS_IOCTL_H) 396CHECK_INCLUDE_FILES (sys/ipc.h HAVE_SYS_IPC_H) 397CHECK_INCLUDE_FILES (sys/malloc.h HAVE_SYS_MALLOC_H) 398CHECK_INCLUDE_FILES (sys/mman.h HAVE_SYS_MMAN_H) 399CHECK_INCLUDE_FILES (sys/prctl.h HAVE_SYS_PRCTL_H) 400CHECK_INCLUDE_FILES (sys/resource.h HAVE_SYS_RESOURCE_H) 401CHECK_INCLUDE_FILES (sys/select.h HAVE_SYS_SELECT_H) 402CHECK_INCLUDE_FILES (sys/shm.h HAVE_SYS_SHM_H) 403CHECK_INCLUDE_FILES (sys/socket.h HAVE_SYS_SOCKET_H) 404CHECK_INCLUDE_FILES (sys/stat.h HAVE_SYS_STAT_H) 405CHECK_INCLUDE_FILES (sys/stream.h HAVE_SYS_STREAM_H) 406CHECK_INCLUDE_FILES (sys/termcap.h HAVE_SYS_TERMCAP_H) 407CHECK_INCLUDE_FILES ("time.h;sys/timeb.h" HAVE_SYS_TIMEB_H) 408CHECK_INCLUDE_FILES ("curses.h;term.h" HAVE_TERM_H) 409CHECK_INCLUDE_FILES (asm/termbits.h HAVE_ASM_TERMBITS_H) 410CHECK_INCLUDE_FILES (termbits.h HAVE_TERMBITS_H) 411CHECK_INCLUDE_FILES (termios.h HAVE_TERMIOS_H) 412CHECK_INCLUDE_FILES (termio.h HAVE_TERMIO_H) 413CHECK_INCLUDE_FILES (termcap.h HAVE_TERMCAP_H) 414CHECK_INCLUDE_FILES (unistd.h HAVE_UNISTD_H) 415CHECK_INCLUDE_FILES (utime.h HAVE_UTIME_H) 416CHECK_INCLUDE_FILES (varargs.h HAVE_VARARGS_H) 417CHECK_INCLUDE_FILES (sys/time.h HAVE_SYS_TIME_H) 418CHECK_INCLUDE_FILES (sys/utime.h HAVE_SYS_UTIME_H) 419CHECK_INCLUDE_FILES (sys/wait.h HAVE_SYS_WAIT_H) 420CHECK_INCLUDE_FILES (sys/param.h HAVE_SYS_PARAM_H) 421CHECK_INCLUDE_FILES (sys/vadvise.h HAVE_SYS_VADVISE_H) 422CHECK_INCLUDE_FILES (fnmatch.h HAVE_FNMATCH_H) 423CHECK_INCLUDE_FILES (stdarg.h HAVE_STDARG_H) 424CHECK_INCLUDE_FILES ("stdlib.h;sys/un.h" HAVE_SYS_UN_H) 425CHECK_INCLUDE_FILES (vis.h HAVE_VIS_H) 426CHECK_INCLUDE_FILES (wchar.h HAVE_WCHAR_H) 427CHECK_INCLUDE_FILES (wctype.h HAVE_WCTYPE_H) 428CHECK_INCLUDE_FILES (sasl/sasl.h HAVE_SASL_SASL_H) 429 430# For libevent 431CHECK_INCLUDE_FILES(sys/devpoll.h HAVE_DEVPOLL) 432CHECK_INCLUDE_FILES(signal.h HAVE_SIGNAL_H) 433CHECK_INCLUDE_FILES(sys/devpoll.h HAVE_SYS_DEVPOLL_H) 434CHECK_INCLUDE_FILES(sys/epoll.h HAVE_SYS_EPOLL_H) 435CHECK_INCLUDE_FILES(sys/event.h HAVE_SYS_EVENT_H) 436CHECK_INCLUDE_FILES(sys/queue.h HAVE_SYS_QUEUE_H) 437CHECK_SYMBOL_EXISTS (TAILQ_FOREACH "sys/queue.h" HAVE_TAILQFOREACH) 438 439IF(HAVE_SYS_STREAM_H) 440 # Needs sys/stream.h on Solaris 441 CHECK_INCLUDE_FILES ("sys/stream.h;sys/ptem.h" HAVE_SYS_PTEM_H) 442ELSE() 443 CHECK_INCLUDE_FILES (sys/ptem.h HAVE_SYS_PTEM_H) 444ENDIF() 445 446# Figure out threading library 447# Defines CMAKE_USE_PTHREADS_INIT and CMAKE_THREAD_LIBS_INIT. 448FIND_PACKAGE (Threads) 449 450FUNCTION(MY_CHECK_PTHREAD_ONCE_INIT) 451 CHECK_C_COMPILER_FLAG("-Werror" HAVE_WERROR_FLAG) 452 IF(HAVE_WERROR_FLAG) 453 SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror") 454 ENDIF() 455 CHECK_C_SOURCE_COMPILES(" 456 #include <pthread.h> 457 void foo(void) {} 458 int main() 459 { 460 pthread_once_t once_control = PTHREAD_ONCE_INIT; 461 pthread_once(&once_control, foo); 462 return 0; 463 }" 464 HAVE_PTHREAD_ONCE_INIT 465 ) 466 # http://bugs.opensolaris.org/bugdatabase/printableBug.do?bug_id=6611808 467 IF(NOT HAVE_PTHREAD_ONCE_INIT) 468 CHECK_C_SOURCE_COMPILES(" 469 #include <pthread.h> 470 void foo(void) {} 471 int main() 472 { 473 pthread_once_t once_control = { PTHREAD_ONCE_INIT }; 474 pthread_once(&once_control, foo); 475 return 0; 476 }" 477 HAVE_ARRAY_PTHREAD_ONCE_INIT 478 ) 479 ENDIF() 480 IF(HAVE_PTHREAD_ONCE_INIT) 481 SET(PTHREAD_ONCE_INITIALIZER "PTHREAD_ONCE_INIT" PARENT_SCOPE) 482 ENDIF() 483 IF(HAVE_ARRAY_PTHREAD_ONCE_INIT) 484 SET(PTHREAD_ONCE_INITIALIZER "{ PTHREAD_ONCE_INIT }" PARENT_SCOPE) 485 ENDIF() 486ENDFUNCTION() 487 488IF(CMAKE_USE_PTHREADS_INIT) 489 MY_CHECK_PTHREAD_ONCE_INIT() 490ENDIF() 491 492# 493# Tests for functions 494# 495CHECK_FUNCTION_EXISTS (_aligned_malloc HAVE_ALIGNED_MALLOC) 496CHECK_FUNCTION_EXISTS (_aligned_free HAVE_ALIGNED_FREE) 497#CHECK_FUNCTION_EXISTS (aiowait HAVE_AIOWAIT) 498CHECK_FUNCTION_EXISTS (aio_read HAVE_AIO_READ) 499CHECK_FUNCTION_EXISTS (alarm HAVE_ALARM) 500SET(HAVE_ALLOCA 1) 501CHECK_FUNCTION_EXISTS (backtrace HAVE_BACKTRACE) 502CHECK_FUNCTION_EXISTS (backtrace_symbols HAVE_BACKTRACE_SYMBOLS) 503CHECK_FUNCTION_EXISTS (backtrace_symbols_fd HAVE_BACKTRACE_SYMBOLS_FD) 504CHECK_FUNCTION_EXISTS (printstack HAVE_PRINTSTACK) 505CHECK_FUNCTION_EXISTS (bmove HAVE_BMOVE) 506CHECK_FUNCTION_EXISTS (bsearch HAVE_BSEARCH) 507CHECK_FUNCTION_EXISTS (index HAVE_INDEX) 508CHECK_FUNCTION_EXISTS (clock_gettime HAVE_CLOCK_GETTIME) 509CHECK_FUNCTION_EXISTS (cuserid HAVE_CUSERID) 510CHECK_FUNCTION_EXISTS (directio HAVE_DIRECTIO) 511CHECK_FUNCTION_EXISTS (_doprnt HAVE_DOPRNT) 512CHECK_FUNCTION_EXISTS (flockfile HAVE_FLOCKFILE) 513CHECK_FUNCTION_EXISTS (ftruncate HAVE_FTRUNCATE) 514CHECK_FUNCTION_EXISTS (getline HAVE_GETLINE) 515CHECK_FUNCTION_EXISTS (compress HAVE_COMPRESS) 516CHECK_FUNCTION_EXISTS (crypt HAVE_CRYPT) 517CHECK_FUNCTION_EXISTS (dlerror HAVE_DLERROR) 518CHECK_FUNCTION_EXISTS (dlopen HAVE_DLOPEN) 519CHECK_FUNCTION_EXISTS (fchmod HAVE_FCHMOD) 520CHECK_FUNCTION_EXISTS (fcntl HAVE_FCNTL) 521CHECK_FUNCTION_EXISTS (fconvert HAVE_FCONVERT) 522CHECK_FUNCTION_EXISTS (fdatasync HAVE_FDATASYNC) 523CHECK_SYMBOL_EXISTS(fdatasync "unistd.h" HAVE_DECL_FDATASYNC) 524CHECK_FUNCTION_EXISTS (fedisableexcept HAVE_FEDISABLEEXCEPT) 525CHECK_FUNCTION_EXISTS (fpsetmask HAVE_FPSETMASK) 526CHECK_FUNCTION_EXISTS (fseeko HAVE_FSEEKO) 527CHECK_FUNCTION_EXISTS (fsync HAVE_FSYNC) 528CHECK_FUNCTION_EXISTS (getcwd HAVE_GETCWD) 529CHECK_FUNCTION_EXISTS (gethostbyaddr_r HAVE_GETHOSTBYADDR_R) 530CHECK_FUNCTION_EXISTS (gethrtime HAVE_GETHRTIME) 531CHECK_FUNCTION_EXISTS (getnameinfo HAVE_GETNAMEINFO) 532CHECK_FUNCTION_EXISTS (getpass HAVE_GETPASS) 533CHECK_FUNCTION_EXISTS (getpassphrase HAVE_GETPASSPHRASE) 534CHECK_FUNCTION_EXISTS (getpwnam HAVE_GETPWNAM) 535CHECK_FUNCTION_EXISTS (getpwuid HAVE_GETPWUID) 536CHECK_FUNCTION_EXISTS (getrlimit HAVE_GETRLIMIT) 537CHECK_FUNCTION_EXISTS (getrusage HAVE_GETRUSAGE) 538CHECK_FUNCTION_EXISTS (getwd HAVE_GETWD) 539CHECK_FUNCTION_EXISTS (gmtime_r HAVE_GMTIME_R) 540CHECK_FUNCTION_EXISTS (initgroups HAVE_INITGROUPS) 541CHECK_FUNCTION_EXISTS (issetugid HAVE_ISSETUGID) 542CHECK_FUNCTION_EXISTS (getuid HAVE_GETUID) 543CHECK_FUNCTION_EXISTS (geteuid HAVE_GETEUID) 544CHECK_FUNCTION_EXISTS (getgid HAVE_GETGID) 545CHECK_FUNCTION_EXISTS (getegid HAVE_GETEGID) 546CHECK_FUNCTION_EXISTS (ldiv HAVE_LDIV) 547CHECK_FUNCTION_EXISTS (localtime_r HAVE_LOCALTIME_R) 548CHECK_FUNCTION_EXISTS (longjmp HAVE_LONGJMP) 549CHECK_FUNCTION_EXISTS (lstat HAVE_LSTAT) 550CHECK_FUNCTION_EXISTS (madvise HAVE_MADVISE) 551CHECK_FUNCTION_EXISTS (malloc_info HAVE_MALLOC_INFO) 552CHECK_FUNCTION_EXISTS (memcpy HAVE_MEMCPY) 553CHECK_FUNCTION_EXISTS (memmove HAVE_MEMMOVE) 554CHECK_FUNCTION_EXISTS (mkstemp HAVE_MKSTEMP) 555CHECK_FUNCTION_EXISTS (mlock HAVE_MLOCK) 556CHECK_FUNCTION_EXISTS (mlockall HAVE_MLOCKALL) 557CHECK_FUNCTION_EXISTS (mmap HAVE_MMAP) 558CHECK_FUNCTION_EXISTS (mmap64 HAVE_MMAP64) 559CHECK_FUNCTION_EXISTS (perror HAVE_PERROR) 560CHECK_FUNCTION_EXISTS (poll HAVE_POLL) 561CHECK_FUNCTION_EXISTS (port_create HAVE_PORT_CREATE) 562CHECK_FUNCTION_EXISTS (posix_fallocate HAVE_POSIX_FALLOCATE) 563CHECK_FUNCTION_EXISTS (posix_memalign HAVE_POSIX_MEMALIGN) 564CHECK_FUNCTION_EXISTS (pread HAVE_PREAD) 565CHECK_FUNCTION_EXISTS (pthread_attr_create HAVE_PTHREAD_ATTR_CREATE) 566CHECK_FUNCTION_EXISTS (pthread_attr_getguardsize HAVE_PTHREAD_ATTR_GETGUARDSIZE) 567CHECK_FUNCTION_EXISTS (pthread_attr_getstacksize HAVE_PTHREAD_ATTR_GETSTACKSIZE) 568CHECK_FUNCTION_EXISTS (pthread_attr_setscope HAVE_PTHREAD_ATTR_SETSCOPE) 569CHECK_FUNCTION_EXISTS (pthread_attr_setstacksize HAVE_PTHREAD_ATTR_SETSTACKSIZE) 570CHECK_FUNCTION_EXISTS (pthread_condattr_create HAVE_PTHREAD_CONDATTR_CREATE) 571CHECK_FUNCTION_EXISTS (pthread_condattr_setclock HAVE_PTHREAD_CONDATTR_SETCLOCK) 572CHECK_FUNCTION_EXISTS (pthread_key_delete HAVE_PTHREAD_KEY_DELETE) 573CHECK_FUNCTION_EXISTS (pthread_rwlock_rdlock HAVE_PTHREAD_RWLOCK_RDLOCK) 574CHECK_FUNCTION_EXISTS (pthread_sigmask HAVE_PTHREAD_SIGMASK) 575CHECK_FUNCTION_EXISTS (pthread_threadmask HAVE_PTHREAD_THREADMASK) 576CHECK_FUNCTION_EXISTS (pthread_yield_np HAVE_PTHREAD_YIELD_NP) 577CHECK_FUNCTION_EXISTS (putenv HAVE_PUTENV) 578CHECK_FUNCTION_EXISTS (readlink HAVE_READLINK) 579CHECK_FUNCTION_EXISTS (re_comp HAVE_RE_COMP) 580CHECK_FUNCTION_EXISTS (regcomp HAVE_REGCOMP) 581CHECK_FUNCTION_EXISTS (realpath HAVE_REALPATH) 582CHECK_FUNCTION_EXISTS (rename HAVE_RENAME) 583CHECK_FUNCTION_EXISTS (rwlock_init HAVE_RWLOCK_INIT) 584CHECK_FUNCTION_EXISTS (sched_yield HAVE_SCHED_YIELD) 585CHECK_FUNCTION_EXISTS (setenv HAVE_SETENV) 586CHECK_FUNCTION_EXISTS (setlocale HAVE_SETLOCALE) 587CHECK_FUNCTION_EXISTS (setfd HAVE_SETFD) 588CHECK_FUNCTION_EXISTS (sigaction HAVE_SIGACTION) 589CHECK_FUNCTION_EXISTS (sigthreadmask HAVE_SIGTHREADMASK) 590CHECK_FUNCTION_EXISTS (sigwait HAVE_SIGWAIT) 591CHECK_FUNCTION_EXISTS (sigaddset HAVE_SIGADDSET) 592CHECK_FUNCTION_EXISTS (sigemptyset HAVE_SIGEMPTYSET) 593CHECK_FUNCTION_EXISTS (sighold HAVE_SIGHOLD) 594CHECK_FUNCTION_EXISTS (sigset HAVE_SIGSET) 595CHECK_FUNCTION_EXISTS (sleep HAVE_SLEEP) 596CHECK_FUNCTION_EXISTS (snprintf HAVE_SNPRINTF) 597CHECK_FUNCTION_EXISTS (stpcpy HAVE_STPCPY) 598CHECK_FUNCTION_EXISTS (strcoll HAVE_STRCOLL) 599CHECK_FUNCTION_EXISTS (strerror HAVE_STRERROR) 600CHECK_FUNCTION_EXISTS (strlcpy HAVE_STRLCPY) 601CHECK_FUNCTION_EXISTS (strnlen HAVE_STRNLEN) 602CHECK_FUNCTION_EXISTS (strlcat HAVE_STRLCAT) 603CHECK_FUNCTION_EXISTS (strsignal HAVE_STRSIGNAL) 604CHECK_FUNCTION_EXISTS (fgetln HAVE_FGETLN) 605CHECK_FUNCTION_EXISTS (strpbrk HAVE_STRPBRK) 606CHECK_FUNCTION_EXISTS (strsep HAVE_STRSEP) 607CHECK_FUNCTION_EXISTS (strstr HAVE_STRSTR) 608CHECK_FUNCTION_EXISTS (strtok_r HAVE_STRTOK_R) 609CHECK_FUNCTION_EXISTS (strtol HAVE_STRTOL) 610CHECK_FUNCTION_EXISTS (strtoll HAVE_STRTOLL) 611CHECK_FUNCTION_EXISTS (strtoul HAVE_STRTOUL) 612CHECK_FUNCTION_EXISTS (strtoull HAVE_STRTOULL) 613CHECK_FUNCTION_EXISTS (strcasecmp HAVE_STRCASECMP) 614CHECK_FUNCTION_EXISTS (strncasecmp HAVE_STRNCASECMP) 615CHECK_FUNCTION_EXISTS (strdup HAVE_STRDUP) 616CHECK_FUNCTION_EXISTS (shmat HAVE_SHMAT) 617CHECK_FUNCTION_EXISTS (shmctl HAVE_SHMCTL) 618CHECK_FUNCTION_EXISTS (shmdt HAVE_SHMDT) 619CHECK_FUNCTION_EXISTS (shmget HAVE_SHMGET) 620CHECK_FUNCTION_EXISTS (tell HAVE_TELL) 621CHECK_FUNCTION_EXISTS (tempnam HAVE_TEMPNAM) 622CHECK_FUNCTION_EXISTS (thr_setconcurrency HAVE_THR_SETCONCURRENCY) 623CHECK_FUNCTION_EXISTS (thr_yield HAVE_THR_YIELD) 624CHECK_FUNCTION_EXISTS (vasprintf HAVE_VASPRINTF) 625CHECK_FUNCTION_EXISTS (vsnprintf HAVE_VSNPRINTF) 626CHECK_FUNCTION_EXISTS (vprintf HAVE_VPRINTF) 627CHECK_FUNCTION_EXISTS (valloc HAVE_VALLOC) 628CHECK_FUNCTION_EXISTS (memalign HAVE_MEMALIGN) 629CHECK_FUNCTION_EXISTS (chown HAVE_CHOWN) 630CHECK_FUNCTION_EXISTS (nl_langinfo HAVE_NL_LANGINFO) 631CHECK_FUNCTION_EXISTS (ntohll HAVE_HTONLL) 632 633CHECK_FUNCTION_EXISTS (clock_gettime DNS_USE_CPU_CLOCK_FOR_ID) 634CHECK_FUNCTION_EXISTS (epoll_create HAVE_EPOLL) 635CHECK_FUNCTION_EXISTS (epoll_ctl HAVE_EPOLL_CTL) 636# Temperarily Quote event port out as we encounter error in port_getn 637# on solaris x86 638# CHECK_FUNCTION_EXISTS (port_create HAVE_EVENT_PORTS) 639CHECK_FUNCTION_EXISTS (inet_ntop HAVE_INET_NTOP) 640CHECK_FUNCTION_EXISTS (kqueue HAVE_KQUEUE) 641CHECK_FUNCTION_EXISTS (kqueue HAVE_WORKING_KQUEUE) 642CHECK_FUNCTION_EXISTS (signal HAVE_SIGNAL) 643CHECK_SYMBOL_EXISTS (timeradd "sys/time.h" HAVE_TIMERADD) 644CHECK_SYMBOL_EXISTS (timerclear "sys/time.h" HAVE_TIMERCLEAR) 645CHECK_SYMBOL_EXISTS (timercmp "sys/time.h" HAVE_TIMERCMP) 646CHECK_SYMBOL_EXISTS (timerisset "sys/time.h" HAVE_TIMERISSET) 647 648 649#-------------------------------------------------------------------- 650# Support for WL#2373 (Use cycle counter for timing) 651#-------------------------------------------------------------------- 652 653CHECK_INCLUDE_FILES(time.h HAVE_TIME_H) 654CHECK_INCLUDE_FILES(sys/time.h HAVE_SYS_TIME_H) 655CHECK_INCLUDE_FILES(sys/times.h HAVE_SYS_TIMES_H) 656CHECK_INCLUDE_FILES(asm/msr.h HAVE_ASM_MSR_H) 657#msr.h has rdtscll() 658 659CHECK_INCLUDE_FILES(ia64intrin.h HAVE_IA64INTRIN_H) 660 661CHECK_FUNCTION_EXISTS(times HAVE_TIMES) 662CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY) 663CHECK_FUNCTION_EXISTS(read_real_time HAVE_READ_REAL_TIME) 664# This should work on AIX. 665 666CHECK_FUNCTION_EXISTS(ftime HAVE_FTIME) 667# This is still a normal call for milliseconds. 668 669CHECK_FUNCTION_EXISTS(time HAVE_TIME) 670# We can use time() on Macintosh if there is no ftime(). 671 672CHECK_FUNCTION_EXISTS(rdtscll HAVE_RDTSCLL) 673# I doubt that we'll ever reach the check for this. 674 675 676# 677# Tests for symbols 678# 679 680CHECK_SYMBOL_EXISTS(madvise "sys/mman.h" HAVE_DECL_MADVISE) 681CHECK_SYMBOL_EXISTS(tzname "time.h" HAVE_TZNAME) 682CHECK_SYMBOL_EXISTS(lrand48 "stdlib.h" HAVE_LRAND48) 683CHECK_SYMBOL_EXISTS(getpagesize "unistd.h" HAVE_GETPAGESIZE) 684CHECK_SYMBOL_EXISTS(TIOCGWINSZ "sys/ioctl.h" GWINSZ_IN_SYS_IOCTL) 685CHECK_SYMBOL_EXISTS(FIONREAD "sys/ioctl.h" FIONREAD_IN_SYS_IOCTL) 686CHECK_SYMBOL_EXISTS(TIOCSTAT "sys/ioctl.h" TIOCSTAT_IN_SYS_IOCTL) 687CHECK_SYMBOL_EXISTS(FIONREAD "sys/filio.h" FIONREAD_IN_SYS_FILIO) 688CHECK_SYMBOL_EXISTS(gettimeofday "sys/time.h" HAVE_GETTIMEOFDAY) 689 690CHECK_SYMBOL_EXISTS(finite "math.h" HAVE_FINITE_IN_MATH_H) 691IF(HAVE_FINITE_IN_MATH_H) 692 SET(HAVE_FINITE TRUE CACHE INTERNAL "") 693ELSE() 694 CHECK_SYMBOL_EXISTS(finite "ieeefp.h" HAVE_FINITE) 695ENDIF() 696CHECK_SYMBOL_EXISTS(log2 math.h HAVE_LOG2) 697CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN) 698CHECK_SYMBOL_EXISTS(rint math.h HAVE_RINT) 699 700# isinf() prototype not found on Solaris 701CHECK_CXX_SOURCE_COMPILES( 702"#include <math.h> 703int main() { 704 isinf(0.0); 705 return 0; 706}" HAVE_ISINF) 707 708 709# fesetround() prototype not found in gcc compatibility file fenv.h 710CHECK_CXX_SOURCE_COMPILES( 711"#include <fenv.h> 712int main() { 713 fesetround(FE_TONEAREST); 714 return 0; 715}" HAVE_FESETROUND) 716 717 718 719# 720# Test for endianess 721# 722INCLUDE(TestBigEndian) 723IF(APPLE) 724 # Cannot run endian test on universal PPC/Intel binaries 725 # would return inconsistent result. 726 # config.h.cmake includes a special #ifdef for Darwin 727ELSE() 728 TEST_BIG_ENDIAN(WORDS_BIGENDIAN) 729ENDIF() 730 731# 732# Tests for type sizes (and presence) 733# 734INCLUDE (CheckTypeSize) 735set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} 736 -D_LARGEFILE_SOURCE -D_LARGE_FILES -D_FILE_OFFSET_BITS=64 737 -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS) 738SET(CMAKE_EXTRA_INCLUDE_FILES signal.h) 739MY_CHECK_TYPE_SIZE(sigset_t SIGSET_T) 740IF(NOT SIZEOF_SIGSET_T) 741 SET(sigset_t int) 742ENDIF() 743MY_CHECK_TYPE_SIZE(mode_t MODE_T) 744IF(NOT SIZEOF_MODE_T) 745 SET(mode_t int) 746ENDIF() 747 748 749IF(HAVE_STDINT_H) 750 SET(CMAKE_EXTRA_INCLUDE_FILES stdint.h) 751ENDIF(HAVE_STDINT_H) 752 753SET(HAVE_VOIDP 1) 754SET(HAVE_CHARP 1) 755SET(HAVE_LONG 1) 756SET(HAVE_SIZE_T 1) 757 758IF(NOT APPLE) 759MY_CHECK_TYPE_SIZE("void *" VOIDP) 760MY_CHECK_TYPE_SIZE("char *" CHARP) 761MY_CHECK_TYPE_SIZE(long LONG) 762MY_CHECK_TYPE_SIZE(size_t SIZE_T) 763ENDIF() 764 765MY_CHECK_TYPE_SIZE(char CHAR) 766MY_CHECK_TYPE_SIZE(short SHORT) 767MY_CHECK_TYPE_SIZE(int INT) 768MY_CHECK_TYPE_SIZE("long long" LONG_LONG) 769SET(CMAKE_EXTRA_INCLUDE_FILES stdio.h sys/types.h time.h) 770MY_CHECK_TYPE_SIZE(off_t OFF_T) 771MY_CHECK_TYPE_SIZE(uchar UCHAR) 772MY_CHECK_TYPE_SIZE(uint UINT) 773MY_CHECK_TYPE_SIZE(ulong ULONG) 774MY_CHECK_TYPE_SIZE(int8 INT8) 775MY_CHECK_TYPE_SIZE(uint8 UINT8) 776MY_CHECK_TYPE_SIZE(int16 INT16) 777MY_CHECK_TYPE_SIZE(uint16 UINT16) 778MY_CHECK_TYPE_SIZE(int32 INT32) 779MY_CHECK_TYPE_SIZE(uint32 UINT32) 780MY_CHECK_TYPE_SIZE(u_int32_t U_INT32_T) 781MY_CHECK_TYPE_SIZE(int64 INT64) 782MY_CHECK_TYPE_SIZE(uint64 UINT64) 783MY_CHECK_TYPE_SIZE(time_t TIME_T) 784MY_CHECK_TYPE_SIZE("struct timespec" STRUCT_TIMESPEC) 785SET (CMAKE_EXTRA_INCLUDE_FILES sys/types.h) 786MY_CHECK_TYPE_SIZE(bool BOOL) 787SET(CMAKE_EXTRA_INCLUDE_FILES) 788IF(HAVE_SYS_SOCKET_H) 789 SET(CMAKE_EXTRA_INCLUDE_FILES sys/socket.h) 790ENDIF(HAVE_SYS_SOCKET_H) 791MY_CHECK_TYPE_SIZE(socklen_t SOCKLEN_T) 792SET(CMAKE_EXTRA_INCLUDE_FILES) 793 794IF(HAVE_IEEEFP_H) 795 SET(CMAKE_EXTRA_INCLUDE_FILES ieeefp.h) 796 MY_CHECK_TYPE_SIZE(fp_except FP_EXCEPT) 797ENDIF() 798 799 800# 801# Code tests 802# 803 804# check whether time_t is unsigned 805CHECK_C_SOURCE_COMPILES(" 806#include <time.h> 807int main() 808{ 809 int array[(((time_t)-1) > 0) ? 1 : -1]; 810 return 0; 811}" 812TIME_T_UNSIGNED) 813 814 815CHECK_C_SOURCE_COMPILES(" 816#ifdef _WIN32 817#include <winsock2.h> 818#include <ws2tcpip.h> 819#else 820#include <sys/types.h> 821#include <sys/socket.h> 822#include <netdb.h> 823#endif 824int main() 825{ 826 getaddrinfo( 0, 0, 0, 0); 827 return 0; 828}" 829HAVE_GETADDRINFO) 830 831CHECK_C_SOURCE_COMPILES(" 832#ifdef _WIN32 833#include <winsock2.h> 834#include <ws2tcpip.h> 835#else 836#include <sys/types.h> 837#include <sys/socket.h> 838#include <netdb.h> 839#endif 840int main() 841{ 842 select(0,0,0,0,0); 843 return 0; 844}" 845HAVE_SELECT) 846 847# 848# Check if timespec has ts_sec and ts_nsec fields 849# 850 851CHECK_C_SOURCE_COMPILES(" 852#include <pthread.h> 853 854int main(int ac, char **av) 855{ 856 struct timespec abstime; 857 abstime.ts_sec = time(NULL)+1; 858 abstime.ts_nsec = 0; 859} 860" HAVE_TIMESPEC_TS_SEC) 861 862 863# 864# Check return type of qsort() 865# 866CHECK_C_SOURCE_COMPILES(" 867#include <stdlib.h> 868#ifdef __cplusplus 869extern \"C\" 870#endif 871void qsort(void *base, size_t nel, size_t width, 872 int (*compar) (const void *, const void *)); 873int main(int ac, char **av) {} 874" QSORT_TYPE_IS_VOID) 875IF(QSORT_TYPE_IS_VOID) 876 SET(RETQSORTTYPE "void") 877ELSE(QSORT_TYPE_IS_VOID) 878 SET(RETQSORTTYPE "int") 879ENDIF(QSORT_TYPE_IS_VOID) 880 881IF(WIN32) 882SET(SOCKET_SIZE_TYPE int) 883ELSE() 884CHECK_CXX_SOURCE_COMPILES(" 885#include <sys/socket.h> 886int main(int argc, char **argv) 887{ 888 getsockname(0,0,(socklen_t *) 0); 889 return 0; 890}" 891HAVE_SOCKET_SIZE_T_AS_socklen_t) 892 893IF(HAVE_SOCKET_SIZE_T_AS_socklen_t) 894 SET(SOCKET_SIZE_TYPE socklen_t) 895ELSE() 896 CHECK_CXX_SOURCE_COMPILES(" 897 #include <sys/socket.h> 898 int main(int argc, char **argv) 899 { 900 getsockname(0,0,(int *) 0); 901 return 0; 902 }" 903 HAVE_SOCKET_SIZE_T_AS_int) 904 IF(HAVE_SOCKET_SIZE_T_AS_int) 905 SET(SOCKET_SIZE_TYPE int) 906 ELSE() 907 CHECK_CXX_SOURCE_COMPILES(" 908 #include <sys/socket.h> 909 int main(int argc, char **argv) 910 { 911 getsockname(0,0,(size_t *) 0); 912 return 0; 913 }" 914 HAVE_SOCKET_SIZE_T_AS_size_t) 915 IF(HAVE_SOCKET_SIZE_T_AS_size_t) 916 SET(SOCKET_SIZE_TYPE size_t) 917 ELSE() 918 SET(SOCKET_SIZE_TYPE int) 919 ENDIF() 920 ENDIF() 921ENDIF() 922ENDIF() 923 924CHECK_CXX_SOURCE_COMPILES(" 925#include <pthread.h> 926int main() 927{ 928 pthread_yield(); 929 return 0; 930} 931" HAVE_PTHREAD_YIELD_ZERO_ARG) 932 933IF(NOT STACK_DIRECTION) 934 IF(CMAKE_CROSSCOMPILING) 935 MESSAGE(FATAL_ERROR 936 "STACK_DIRECTION is not defined. Please specify -DSTACK_DIRECTION=1 " 937 "or -DSTACK_DIRECTION=-1 when calling cmake.") 938 ELSE() 939 TRY_RUN(STACKDIR_RUN_RESULT STACKDIR_COMPILE_RESULT 940 ${CMAKE_BINARY_DIR} 941 ${CMAKE_SOURCE_DIR}/cmake/stack_direction.c 942 ) 943 # Test program returns 0 (down) or 1 (up). 944 # Convert to -1 or 1 945 IF(STACKDIR_RUN_RESULT EQUAL 0) 946 SET(STACK_DIRECTION -1 CACHE INTERNAL "Stack grows direction") 947 ELSE() 948 SET(STACK_DIRECTION 1 CACHE INTERNAL "Stack grows direction") 949 ENDIF() 950 MESSAGE(STATUS "Checking stack direction : ${STACK_DIRECTION}") 951 ENDIF() 952ENDIF() 953 954# 955# Check return type of signal handlers 956# 957CHECK_C_SOURCE_COMPILES(" 958#include <signal.h> 959#ifdef signal 960# undef signal 961#endif 962#ifdef __cplusplus 963extern \"C\" void (*signal (int, void (*)(int)))(int); 964#else 965void (*signal ()) (); 966#endif 967int main(int ac, char **av) {} 968" SIGNAL_RETURN_TYPE_IS_VOID) 969IF(SIGNAL_RETURN_TYPE_IS_VOID) 970 SET(RETSIGTYPE void) 971 SET(VOID_SIGHANDLER 1) 972ELSE(SIGNAL_RETURN_TYPE_IS_VOID) 973 SET(RETSIGTYPE int) 974ENDIF(SIGNAL_RETURN_TYPE_IS_VOID) 975 976 977CHECK_INCLUDE_FILES("time.h;sys/time.h" TIME_WITH_SYS_TIME) 978CHECK_SYMBOL_EXISTS(O_NONBLOCK "unistd.h;fcntl.h" HAVE_FCNTL_NONBLOCK) 979IF(NOT HAVE_FCNTL_NONBLOCK) 980 SET(NO_FCNTL_NONBLOCK 1) 981ENDIF() 982 983# 984# Test for how the C compiler does inline. 985# If both of these tests fail, then there is probably something wrong 986# in the environment (flags and/or compiling and/or linking). 987# 988CHECK_C_SOURCE_COMPILES(" 989static inline int foo(){return 0;} 990int main(int argc, char *argv[]){return 0;}" 991 C_HAS_inline) 992IF(NOT C_HAS_inline) 993 CHECK_C_SOURCE_COMPILES(" 994 static __inline int foo(){return 0;} 995 int main(int argc, char *argv[]){return 0;}" 996 C_HAS___inline) 997 SET(C_INLINE __inline) 998ENDIF() 999 1000IF(NOT C_HAS_inline AND NOT C_HAS___inline) 1001 MESSAGE(FATAL_ERROR "It seems like ${CMAKE_C_COMPILER} does not support " 1002 "inline or __inline. Please verify compiler and flags. " 1003 "See CMakeFiles/CMakeError.log for why the test failed to compile/link.") 1004ENDIF() 1005 1006IF(NOT CMAKE_CROSSCOMPILING AND NOT MSVC) 1007 STRING(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} processor) 1008 IF(processor MATCHES "86" OR processor MATCHES "amd64" OR processor MATCHES "x64") 1009 #Check for x86 PAUSE instruction 1010 # We have to actually try running the test program, because of a bug 1011 # in Solaris on x86_64, where it wrongly reports that PAUSE is not 1012 # supported when trying to run an application. See 1013 # http://bugs.opensolaris.org/bugdatabase/printableBug.do?bug_id=6478684 1014 CHECK_C_SOURCE_RUNS(" 1015 int main() 1016 { 1017 __asm__ __volatile__ (\"pause\"); 1018 return 0; 1019 }" HAVE_PAUSE_INSTRUCTION) 1020 ENDIF() 1021 IF (NOT HAVE_PAUSE_INSTRUCTION) 1022 CHECK_C_SOURCE_COMPILES(" 1023 int main() 1024 { 1025 __asm__ __volatile__ (\"rep; nop\"); 1026 return 0; 1027 } 1028 " HAVE_FAKE_PAUSE_INSTRUCTION) 1029 ENDIF() 1030ENDIF() 1031 1032CHECK_SYMBOL_EXISTS(tcgetattr "termios.h" HAVE_TCGETATTR 1) 1033 1034# 1035# Check type of signal routines (posix, 4.2bsd, 4.1bsd or v7) 1036# 1037CHECK_C_SOURCE_COMPILES(" 1038 #include <signal.h> 1039 int main(int ac, char **av) 1040 { 1041 sigset_t ss; 1042 struct sigaction sa; 1043 sigemptyset(&ss); sigsuspend(&ss); 1044 sigaction(SIGINT, &sa, (struct sigaction *) 0); 1045 sigprocmask(SIG_BLOCK, &ss, (sigset_t *) 0); 1046 }" 1047 HAVE_POSIX_SIGNALS) 1048 1049IF(NOT HAVE_POSIX_SIGNALS) 1050 CHECK_C_SOURCE_COMPILES(" 1051 #include <signal.h> 1052 int main(int ac, char **av) 1053 { 1054 int mask = sigmask(SIGINT); 1055 sigsetmask(mask); sigblock(mask); sigpause(mask); 1056 }" 1057 HAVE_BSD_SIGNALS) 1058 IF (NOT HAVE_BSD_SIGNALS) 1059 CHECK_C_SOURCE_COMPILES(" 1060 #include <signal.h> 1061 void foo() { } 1062 int main(int ac, char **av) 1063 { 1064 int mask = sigmask(SIGINT); 1065 sigset(SIGINT, foo); sigrelse(SIGINT); 1066 sighold(SIGINT); sigpause(SIGINT); 1067 }" 1068 HAVE_SVR3_SIGNALS) 1069 IF (NOT HAVE_SVR3_SIGNALS) 1070 SET(HAVE_V7_SIGNALS 1) 1071 ENDIF(NOT HAVE_SVR3_SIGNALS) 1072 ENDIF(NOT HAVE_BSD_SIGNALS) 1073ENDIF(NOT HAVE_POSIX_SIGNALS) 1074 1075# Assume regular sprintf 1076SET(SPRINTFS_RETURNS_INT 1) 1077 1078IF(CMAKE_COMPILER_IS_GNUCXX AND HAVE_CXXABI_H) 1079CHECK_CXX_SOURCE_COMPILES(" 1080 #include <cxxabi.h> 1081 int main(int argc, char **argv) 1082 { 1083 char *foo= 0; int bar= 0; 1084 foo= abi::__cxa_demangle(foo, foo, 0, &bar); 1085 return 0; 1086 }" 1087 HAVE_ABI_CXA_DEMANGLE) 1088ENDIF() 1089 1090CHECK_C_SOURCE_COMPILES(" 1091 int main() 1092 { 1093 extern void __attribute__((weak)) foo(void); 1094 return 0; 1095 }" 1096 HAVE_WEAK_SYMBOL 1097) 1098 1099 1100CHECK_CXX_SOURCE_COMPILES(" 1101 #undef inline 1102 #if !defined(SCO) && !defined(__osf__) && !defined(_REENTRANT) 1103 #define _REENTRANT 1104 #endif 1105 #include <pthread.h> 1106 #include <sys/types.h> 1107 #include <sys/socket.h> 1108 #include <netinet/in.h> 1109 #include <arpa/inet.h> 1110 #include <netdb.h> 1111 int main() 1112 { 1113 1114 struct hostent *foo = 1115 gethostbyaddr_r((const char *) 0, 1116 0, 0, (struct hostent *) 0, (char *) NULL, 0, (int *)0); 1117 return 0; 1118 } 1119 " 1120 HAVE_SOLARIS_STYLE_GETHOST) 1121 1122IF(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") 1123IF(WITH_ATOMIC_OPS STREQUAL "up") 1124 SET(MY_ATOMIC_MODE_DUMMY 1 CACHE BOOL "Assume single-CPU mode, no concurrency") 1125ELSEIF(WITH_ATOMIC_OPS STREQUAL "rwlocks") 1126 SET(MY_ATOMIC_MODE_RWLOCK 1 CACHE BOOL "Use pthread rwlocks for atomic ops") 1127ELSEIF(WITH_ATOMIC_OPS STREQUAL "smp") 1128ELSEIF(NOT WITH_ATOMIC_OPS) 1129 CHECK_CXX_SOURCE_COMPILES(" 1130 int main() 1131 { 1132 int foo= -10; int bar= 10; 1133 long long int foo64= -10; long long int bar64= 10; 1134 if (!__sync_fetch_and_add(&foo, bar) || foo) 1135 return -1; 1136 bar= __sync_lock_test_and_set(&foo, bar); 1137 if (bar || foo != 10) 1138 return -1; 1139 bar= __sync_val_compare_and_swap(&bar, foo, 15); 1140 if (bar) 1141 return -1; 1142 if (!__sync_fetch_and_add(&foo64, bar64) || foo64) 1143 return -1; 1144 bar64= __sync_lock_test_and_set(&foo64, bar64); 1145 if (bar64 || foo64 != 10) 1146 return -1; 1147 bar64= __sync_val_compare_and_swap(&bar64, foo, 15); 1148 if (bar64) 1149 return -1; 1150 return 0; 1151 }" 1152 HAVE_GCC_ATOMIC_BUILTINS) 1153 IF(NOT HAVE_GCC_ATOMIC_BUILTINS) 1154 MESSAGE(WARNING 1155 "Unsupported version of GCC/Clang is used which does not support Atomic " 1156 "Builtins. Using pthread rwlocks instead.") 1157 ENDIF(NOT HAVE_GCC_ATOMIC_BUILTINS) 1158ELSE() 1159 MESSAGE(FATAL_ERROR "${WITH_ATOMIC_OPS} is not a valid value for WITH_ATOMIC_OPS!") 1160ENDIF() 1161ENDIF() 1162 1163SET(WITH_ATOMIC_LOCKS "${WITH_ATOMIC_LOCKS}" CACHE STRING 1164"Implement atomic operations using pthread rwlocks or atomic CPU 1165instructions for multi-processor or uniprocessor 1166configuration. By default gcc built-in sync functions are used, 1167if available and 'smp' configuration otherwise.") 1168MARK_AS_ADVANCED(WITH_ATOMIC_LOCKS MY_ATOMIC_MODE_RWLOCK MY_ATOMIC_MODE_DUMMY) 1169 1170IF(WITH_VALGRIND) 1171 SET(VALGRIND_HEADERS "valgrind/memcheck.h;valgrind/valgrind.h") 1172 CHECK_INCLUDE_FILES("${VALGRIND_HEADERS}" HAVE_VALGRIND_HEADERS) 1173 IF(HAVE_VALGRIND_HEADERS) 1174 SET(HAVE_VALGRIND 1) 1175 ELSE() 1176 MESSAGE(FATAL_ERROR "Unable to find Valgrind header files ${VALGRIND_HEADERS}. Make sure you have them in your include path.") 1177 ENDIF() 1178ENDIF() 1179 1180#-------------------------------------------------------------------- 1181# Check for IPv6 support 1182#-------------------------------------------------------------------- 1183CHECK_INCLUDE_FILE(netinet/in6.h HAVE_NETINET_IN6_H) 1184 1185IF(UNIX) 1186 SET(CMAKE_EXTRA_INCLUDE_FILES sys/types.h netinet/in.h sys/socket.h) 1187 IF(HAVE_NETINET_IN6_H) 1188 SET(CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_EXTRA_INCLUDE_FILES} netinet/in6.h) 1189 ENDIF() 1190ELSEIF(WIN32) 1191 SET(CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_EXTRA_INCLUDE_FILES} winsock2.h ws2ipdef.h) 1192ENDIF() 1193 1194MY_CHECK_STRUCT_SIZE("sockaddr_in6" SOCKADDR_IN6) 1195MY_CHECK_STRUCT_SIZE("in6_addr" IN6_ADDR) 1196 1197IF(HAVE_STRUCT_SOCKADDR_IN6 OR HAVE_STRUCT_IN6_ADDR) 1198 SET(HAVE_IPV6 TRUE CACHE INTERNAL "") 1199ENDIF() 1200 1201 1202# Check for sockaddr_storage.ss_family 1203# It is called differently under OS400 and older AIX 1204 1205CHECK_STRUCT_HAS_MEMBER("struct sockaddr_storage" 1206 ss_family "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SOCKADDR_STORAGE_SS_FAMILY) 1207IF(NOT HAVE_SOCKADDR_STORAGE_SS_FAMILY) 1208 CHECK_STRUCT_HAS_MEMBER("struct sockaddr_storage" 1209 __ss_family "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SOCKADDR_STORAGE___SS_FAMILY) 1210 IF(HAVE_SOCKADDR_STORAGE___SS_FAMILY) 1211 SET(ss_family __ss_family) 1212 ENDIF() 1213ENDIF() 1214 1215# 1216# Check if struct sockaddr_in::sin_len is available. 1217# 1218 1219CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in" sin_len 1220 "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SOCKADDR_IN_SIN_LEN) 1221 1222# 1223# Check if struct sockaddr_in6::sin6_len is available. 1224# 1225 1226CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in6" sin6_len 1227 "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SOCKADDR_IN6_SIN6_LEN) 1228 1229SET(CMAKE_EXTRA_INCLUDE_FILES) 1230 1231CHECK_STRUCT_HAS_MEMBER("struct dirent" d_ino "dirent.h" STRUCT_DIRENT_HAS_D_INO) 1232CHECK_STRUCT_HAS_MEMBER("struct dirent" d_namlen "dirent.h" STRUCT_DIRENT_HAS_D_NAMLEN) 1233SET(SPRINTF_RETURNS_INT 1) 1234 1235CHECK_INCLUDE_FILES (numaif.h HAVE_NUMAIF_H) 1236OPTION(WITH_NUMA "Explicitly set NUMA memory allocation policy" ON) 1237IF(HAVE_NUMAIF_H AND WITH_NUMA) 1238 SET(SAVE_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) 1239 SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} numa) 1240 CHECK_C_SOURCE_COMPILES( 1241 " 1242 #include <numa.h> 1243 #include <numaif.h> 1244 int main() 1245 { 1246 struct bitmask *all_nodes= numa_all_nodes_ptr; 1247 set_mempolicy(MPOL_DEFAULT, 0, 0); 1248 return all_nodes != NULL; 1249 }" 1250 HAVE_LIBNUMA) 1251 SET(CMAKE_REQUIRED_LIBRARIES ${SAVE_CMAKE_REQUIRED_LIBRARIES}) 1252ENDIF() 1253