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