1# Copyright (c) 2009, 2013, 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-1335  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
55IF(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang" AND (NOT MSVC))
56  IF (CMAKE_EXE_LINKER_FLAGS MATCHES " -static "
57     OR CMAKE_EXE_LINKER_FLAGS MATCHES " -static$")
58     SET(HAVE_DLOPEN FALSE CACHE "Disable dlopen due to -static flag" FORCE)
59     SET(WITHOUT_DYNAMIC_PLUGINS TRUE)
60  ENDIF()
61ENDIF()
62
63# workaround for old gcc on x86, gcc atomic ops only work under -march=i686
64IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "i686" AND CMAKE_COMPILER_IS_GNUCC AND
65   CMAKE_C_COMPILER_VERSION VERSION_LESS "4.4.0")
66  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
67  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=i686")
68  # query_response_time.cc causes "error: unable to find a register to spill"
69  SET(PLUGIN_QUERY_RESPONSE_TIME NO CACHE BOOL "Disabled, gcc is too old")
70ENDIF()
71
72# use runtime atomic-support detection in aarch64
73IF(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
74  MY_CHECK_AND_SET_COMPILER_FLAG("-moutline-atomics")
75ENDIF()
76
77IF(WITHOUT_DYNAMIC_PLUGINS)
78  MESSAGE("Dynamic plugins are disabled.")
79ENDIF(WITHOUT_DYNAMIC_PLUGINS)
80
81# Large files, common flag
82SET(_LARGEFILE_SOURCE  1)
83
84# If finds the size of a type, set SIZEOF_<type> and HAVE_<type>
85FUNCTION(MY_CHECK_TYPE_SIZE type defbase)
86  CHECK_TYPE_SIZE("${type}" SIZEOF_${defbase})
87  IF(SIZEOF_${defbase})
88    SET(HAVE_${defbase} 1 PARENT_SCOPE)
89  ENDIF()
90ENDFUNCTION()
91
92# Same for structs, setting HAVE_STRUCT_<name> instead
93FUNCTION(MY_CHECK_STRUCT_SIZE type defbase)
94  CHECK_TYPE_SIZE("struct ${type}" SIZEOF_${defbase})
95  IF(SIZEOF_${defbase})
96    SET(HAVE_STRUCT_${defbase} 1 PARENT_SCOPE)
97  ENDIF()
98ENDFUNCTION()
99
100# Searches function in libraries
101# if function is found, sets output parameter result to the name of the library
102# if function is found in libc, result will be empty
103FUNCTION(MY_SEARCH_LIBS func libs result)
104  IF(${${result}})
105    # Library is already found or was predefined
106    RETURN()
107  ENDIF()
108  CHECK_FUNCTION_EXISTS(${func} HAVE_${func}_IN_LIBC)
109  IF(HAVE_${func}_IN_LIBC)
110    SET(${result} "" PARENT_SCOPE)
111    RETURN()
112  ENDIF()
113  FOREACH(lib  ${libs})
114    CHECK_LIBRARY_EXISTS(${lib} ${func} "" HAVE_${func}_IN_${lib})
115    IF(HAVE_${func}_IN_${lib})
116      SET(${result} ${lib} PARENT_SCOPE)
117      SET(HAVE_${result} 1 PARENT_SCOPE)
118      RETURN()
119    ENDIF()
120  ENDFOREACH()
121ENDFUNCTION()
122
123# Find out which libraries to use.
124IF(UNIX)
125  MY_SEARCH_LIBS(floor m LIBM)
126  IF(NOT LIBM)
127    MY_SEARCH_LIBS(__infinity m LIBM)
128  ENDIF()
129  MY_SEARCH_LIBS(gethostbyname_r  "nsl_r;nsl" LIBNSL)
130  MY_SEARCH_LIBS(bind "bind;socket" LIBBIND)
131  MY_SEARCH_LIBS(crypt crypt LIBCRYPT)
132  MY_SEARCH_LIBS(setsockopt socket LIBSOCKET)
133  MY_SEARCH_LIBS(sched_yield rt LIBRT)
134  IF(NOT LIBRT)
135    MY_SEARCH_LIBS(clock_gettime rt LIBRT)
136  ENDIF()
137  set(THREADS_PREFER_PTHREAD_FLAG ON)
138  FIND_PACKAGE(Threads)
139
140  SET(CMAKE_REQUIRED_LIBRARIES
141    ${LIBM} ${LIBNSL} ${LIBBIND} ${LIBCRYPT} ${LIBSOCKET} ${CMAKE_DL_LIBS} ${CMAKE_THREAD_LIBS_INIT} ${LIBRT} ${LIBEXECINFO})
142  # Need explicit pthread for gcc -fsanitize=address
143  IF(CMAKE_USE_PTHREADS_INIT AND CMAKE_C_FLAGS MATCHES "-fsanitize=")
144    SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} pthread)
145  ENDIF()
146
147  IF(CMAKE_REQUIRED_LIBRARIES)
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 <sys/types.h>
159    #include <tcpd.h>
160    int allow_severity = 0;
161    int deny_severity  = 0;
162    int main()
163    {
164      hosts_access(0);
165    }"
166    HAVE_LIBWRAP)
167    SET(CMAKE_REQUIRED_LIBRARIES ${SAVE_CMAKE_REQUIRED_LIBRARIES})
168    IF(HAVE_LIBWRAP)
169      SET(MYSYS_LIBWRAP_SOURCE  ${CMAKE_SOURCE_DIR}/mysys/my_libwrap.c)
170      SET(LIBWRAP "wrap")
171    ENDIF()
172  ENDIF()
173  ADD_FEATURE_INFO(LIBWRAP HAVE_LIBWRAP "Support for tcp wrappers")
174ENDIF()
175
176#
177# Tests for header files
178#
179INCLUDE (CheckIncludeFiles)
180INCLUDE (CheckIncludeFileCXX)
181
182CHECK_INCLUDE_FILES ("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS)
183CHECK_INCLUDE_FILES (sys/types.h HAVE_SYS_TYPES_H)
184CHECK_INCLUDE_FILES (alloca.h HAVE_ALLOCA_H)
185CHECK_INCLUDE_FILES (arpa/inet.h HAVE_ARPA_INET_H)
186CHECK_INCLUDE_FILES (crypt.h HAVE_CRYPT_H)
187CHECK_INCLUDE_FILES (dirent.h HAVE_DIRENT_H)
188CHECK_INCLUDE_FILES (dlfcn.h HAVE_DLFCN_H)
189CHECK_INCLUDE_FILES (execinfo.h HAVE_EXECINFO_H)
190CHECK_INCLUDE_FILES (fcntl.h HAVE_FCNTL_H)
191CHECK_INCLUDE_FILES (fenv.h HAVE_FENV_H)
192CHECK_INCLUDE_FILES (float.h HAVE_FLOAT_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 (link.h HAVE_LINK_H)
199CHECK_INCLUDE_FILES (linux/unistd.h HAVE_LINUX_UNISTD_H)
200CHECK_INCLUDE_FILES (limits.h HAVE_LIMITS_H)
201CHECK_INCLUDE_FILES (locale.h HAVE_LOCALE_H)
202CHECK_INCLUDE_FILES (malloc.h HAVE_MALLOC_H)
203CHECK_INCLUDE_FILES (memory.h HAVE_MEMORY_H)
204CHECK_INCLUDE_FILES (ndir.h HAVE_NDIR_H)
205CHECK_INCLUDE_FILES (netinet/in.h HAVE_NETINET_IN_H)
206CHECK_INCLUDE_FILES (paths.h HAVE_PATHS_H)
207CHECK_INCLUDE_FILES (poll.h HAVE_POLL_H)
208CHECK_INCLUDE_FILES (sys/poll.h HAVE_SYS_POLL_H)
209CHECK_INCLUDE_FILES (pwd.h HAVE_PWD_H)
210CHECK_INCLUDE_FILES (sched.h HAVE_SCHED_H)
211CHECK_INCLUDE_FILES (select.h HAVE_SELECT_H)
212CHECK_INCLUDE_FILES ("sys/types.h;sys/dir.h" HAVE_SYS_DIR_H)
213CHECK_INCLUDE_FILES ("sys/types.h;sys/event.h" HAVE_SYS_EVENT_H)
214CHECK_INCLUDE_FILES (sys/ndir.h HAVE_SYS_NDIR_H)
215CHECK_INCLUDE_FILES (sys/pte.h HAVE_SYS_PTE_H)
216CHECK_INCLUDE_FILES (stddef.h HAVE_STDDEF_H)
217CHECK_INCLUDE_FILES (stdint.h HAVE_STDINT_H)
218CHECK_INCLUDE_FILES (stdlib.h HAVE_STDLIB_H)
219CHECK_INCLUDE_FILES (strings.h HAVE_STRINGS_H)
220CHECK_INCLUDE_FILES (string.h HAVE_STRING_H)
221CHECK_INCLUDE_FILES (synch.h HAVE_SYNCH_H)
222CHECK_INCLUDE_FILES (sysent.h HAVE_SYSENT_H)
223CHECK_INCLUDE_FILES (sys/file.h HAVE_SYS_FILE_H)
224CHECK_INCLUDE_FILES (sys/fpu.h HAVE_SYS_FPU_H)
225CHECK_INCLUDE_FILES (sys/ioctl.h HAVE_SYS_IOCTL_H)
226CHECK_INCLUDE_FILES ("sys/types.h;sys/ipc.h" HAVE_SYS_IPC_H)
227CHECK_INCLUDE_FILES ("sys/types.h;sys/malloc.h" HAVE_SYS_MALLOC_H)
228CHECK_INCLUDE_FILES (sys/mman.h HAVE_SYS_MMAN_H)
229CHECK_INCLUDE_FILES (sys/prctl.h HAVE_SYS_PRCTL_H)
230CHECK_INCLUDE_FILES (sys/resource.h HAVE_SYS_RESOURCE_H)
231CHECK_INCLUDE_FILES (sys/select.h HAVE_SYS_SELECT_H)
232CHECK_INCLUDE_FILES ("sys/types.h;sys/shm.h" HAVE_SYS_SHM_H)
233CHECK_INCLUDE_FILES (sys/socket.h HAVE_SYS_SOCKET_H)
234CHECK_INCLUDE_FILES (sys/stat.h HAVE_SYS_STAT_H)
235CHECK_INCLUDE_FILES (sys/stream.h HAVE_SYS_STREAM_H)
236CHECK_INCLUDE_FILES (sys/syscall.h HAVE_SYS_SYSCALL_H)
237CHECK_INCLUDE_FILES (asm/termbits.h HAVE_ASM_TERMBITS_H)
238CHECK_INCLUDE_FILES (termbits.h HAVE_TERMBITS_H)
239CHECK_INCLUDE_FILES (termios.h HAVE_TERMIOS_H)
240CHECK_INCLUDE_FILES (termio.h HAVE_TERMIO_H)
241CHECK_INCLUDE_FILES (termcap.h HAVE_TERMCAP_H)
242CHECK_INCLUDE_FILES (unistd.h HAVE_UNISTD_H)
243CHECK_INCLUDE_FILES (utime.h HAVE_UTIME_H)
244CHECK_INCLUDE_FILES (varargs.h HAVE_VARARGS_H)
245CHECK_INCLUDE_FILES (sys/time.h HAVE_SYS_TIME_H)
246CHECK_INCLUDE_FILES (sys/utime.h HAVE_SYS_UTIME_H)
247CHECK_INCLUDE_FILES (sys/wait.h HAVE_SYS_WAIT_H)
248CHECK_INCLUDE_FILES (sys/param.h HAVE_SYS_PARAM_H)
249CHECK_INCLUDE_FILES (sys/vadvise.h HAVE_SYS_VADVISE_H)
250CHECK_INCLUDE_FILES (fnmatch.h HAVE_FNMATCH_H)
251CHECK_INCLUDE_FILES (stdarg.h  HAVE_STDARG_H)
252CHECK_INCLUDE_FILES ("stdlib.h;sys/un.h" HAVE_SYS_UN_H)
253CHECK_INCLUDE_FILES (wchar.h HAVE_WCHAR_H)
254CHECK_INCLUDE_FILES (wctype.h HAVE_WCTYPE_H)
255CHECK_INCLUDE_FILES (sys/sockio.h HAVE_SYS_SOCKIO_H)
256CHECK_INCLUDE_FILES (sys/utsname.h HAVE_SYS_UTSNAME_H)
257CHECK_INCLUDE_FILES (sys/statvfs.h HAVE_SYS_STATVFS_H)
258
259SET(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -DPACKAGE=test) # bfd.h is picky
260CHECK_INCLUDE_FILES (bfd.h BFD_H_EXISTS)
261IF(BFD_H_EXISTS)
262  IF(NOT_FOR_DISTRIBUTION)
263    SET(NON_DISTRIBUTABLE_WARNING "GPLv3" CACHE INTERNAL "")
264    SET(HAVE_BFD_H 1)
265  ENDIF()
266ENDIF()
267
268IF(HAVE_SYS_STREAM_H)
269  # Needs sys/stream.h on Solaris
270  CHECK_INCLUDE_FILES ("sys/stream.h;sys/ptem.h" HAVE_SYS_PTEM_H)
271ELSE()
272  CHECK_INCLUDE_FILES (sys/ptem.h HAVE_SYS_PTEM_H)
273ENDIF()
274
275# Figure out threading library
276#
277FIND_PACKAGE (Threads)
278
279FUNCTION(MY_CHECK_PTHREAD_ONCE_INIT)
280  MY_CHECK_C_COMPILER_FLAG("-Werror")
281  IF(NOT have_C__Werror)
282    RETURN()
283  ENDIF()
284  SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror")
285  CHECK_C_SOURCE_COMPILES("
286    #include <pthread.h>
287    void foo(void) {}
288    int main()
289    {
290      pthread_once_t once_control = PTHREAD_ONCE_INIT;
291      pthread_once(&once_control, foo);
292      return 0;
293    }"
294    HAVE_PTHREAD_ONCE_INIT
295  )
296  # http://bugs.opensolaris.org/bugdatabase/printableBug.do?bug_id=6611808
297  IF(NOT HAVE_PTHREAD_ONCE_INIT)
298    CHECK_C_SOURCE_COMPILES("
299      #include <pthread.h>
300      void foo(void) {}
301      int main()
302      {
303        pthread_once_t once_control = { PTHREAD_ONCE_INIT };
304        pthread_once(&once_control, foo);
305        return 0;
306      }"
307      HAVE_ARRAY_PTHREAD_ONCE_INIT
308    )
309  ENDIF()
310  IF(HAVE_PTHREAD_ONCE_INIT)
311    SET(PTHREAD_ONCE_INITIALIZER "PTHREAD_ONCE_INIT" PARENT_SCOPE)
312  ENDIF()
313  IF(HAVE_ARRAY_PTHREAD_ONCE_INIT)
314    SET(PTHREAD_ONCE_INITIALIZER "{ PTHREAD_ONCE_INIT }" PARENT_SCOPE)
315  ENDIF()
316ENDFUNCTION()
317
318IF(CMAKE_USE_PTHREADS_INIT)
319  MY_CHECK_PTHREAD_ONCE_INIT()
320ENDIF()
321
322#
323# Tests for functions
324#
325CHECK_FUNCTION_EXISTS (accept4 HAVE_ACCEPT4)
326CHECK_FUNCTION_EXISTS (access HAVE_ACCESS)
327#CHECK_FUNCTION_EXISTS (aiowait HAVE_AIOWAIT)
328CHECK_FUNCTION_EXISTS (alarm HAVE_ALARM)
329SET(HAVE_ALLOCA 1)
330CHECK_FUNCTION_EXISTS (backtrace HAVE_BACKTRACE)
331CHECK_FUNCTION_EXISTS (backtrace_symbols HAVE_BACKTRACE_SYMBOLS)
332CHECK_FUNCTION_EXISTS (backtrace_symbols_fd HAVE_BACKTRACE_SYMBOLS_FD)
333CHECK_FUNCTION_EXISTS (printstack HAVE_PRINTSTACK)
334CHECK_FUNCTION_EXISTS (bfill HAVE_BFILL)
335CHECK_FUNCTION_EXISTS (index HAVE_INDEX)
336CHECK_FUNCTION_EXISTS (clock_gettime HAVE_CLOCK_GETTIME)
337CHECK_FUNCTION_EXISTS (cuserid HAVE_CUSERID)
338CHECK_FUNCTION_EXISTS (ftruncate HAVE_FTRUNCATE)
339CHECK_FUNCTION_EXISTS (compress HAVE_COMPRESS)
340CHECK_FUNCTION_EXISTS (crypt HAVE_CRYPT)
341CHECK_FUNCTION_EXISTS (dladdr HAVE_DLADDR)
342CHECK_FUNCTION_EXISTS (dlerror HAVE_DLERROR)
343CHECK_FUNCTION_EXISTS (dlopen HAVE_DLOPEN)
344CHECK_FUNCTION_EXISTS (fchmod HAVE_FCHMOD)
345CHECK_FUNCTION_EXISTS (fcntl HAVE_FCNTL)
346CHECK_FUNCTION_EXISTS (fdatasync HAVE_FDATASYNC)
347CHECK_SYMBOL_EXISTS(fdatasync "unistd.h" HAVE_DECL_FDATASYNC)
348CHECK_FUNCTION_EXISTS (fesetround HAVE_FESETROUND)
349CHECK_FUNCTION_EXISTS (fedisableexcept HAVE_FEDISABLEEXCEPT)
350CHECK_FUNCTION_EXISTS (fseeko HAVE_FSEEKO)
351CHECK_FUNCTION_EXISTS (fsync HAVE_FSYNC)
352CHECK_FUNCTION_EXISTS (getcwd HAVE_GETCWD)
353CHECK_FUNCTION_EXISTS (gethostbyaddr_r HAVE_GETHOSTBYADDR_R)
354CHECK_FUNCTION_EXISTS (gethrtime HAVE_GETHRTIME)
355CHECK_FUNCTION_EXISTS (getpass HAVE_GETPASS)
356CHECK_FUNCTION_EXISTS (getpassphrase HAVE_GETPASSPHRASE)
357CHECK_FUNCTION_EXISTS (getpwnam HAVE_GETPWNAM)
358CHECK_FUNCTION_EXISTS (getpwuid HAVE_GETPWUID)
359CHECK_FUNCTION_EXISTS (getrlimit HAVE_GETRLIMIT)
360CHECK_FUNCTION_EXISTS (getifaddrs HAVE_GETIFADDRS)
361CHECK_FUNCTION_EXISTS (getrusage HAVE_GETRUSAGE)
362CHECK_FUNCTION_EXISTS (getwd HAVE_GETWD)
363CHECK_FUNCTION_EXISTS (gmtime_r HAVE_GMTIME_R)
364CHECK_FUNCTION_EXISTS (initgroups HAVE_INITGROUPS)
365CHECK_FUNCTION_EXISTS (ldiv HAVE_LDIV)
366CHECK_FUNCTION_EXISTS (localtime_r HAVE_LOCALTIME_R)
367CHECK_FUNCTION_EXISTS (lstat HAVE_LSTAT)
368CHECK_FUNCTION_EXISTS (madvise HAVE_MADVISE)
369CHECK_FUNCTION_EXISTS (mallinfo HAVE_MALLINFO)
370CHECK_FUNCTION_EXISTS (mallinfo2 HAVE_MALLINFO2)
371CHECK_FUNCTION_EXISTS (memcpy HAVE_MEMCPY)
372CHECK_FUNCTION_EXISTS (memmove HAVE_MEMMOVE)
373CHECK_FUNCTION_EXISTS (mkstemp HAVE_MKSTEMP)
374CHECK_FUNCTION_EXISTS (mkostemp HAVE_MKOSTEMP)
375CHECK_FUNCTION_EXISTS (mlock HAVE_MLOCK)
376CHECK_FUNCTION_EXISTS (mlockall HAVE_MLOCKALL)
377CHECK_FUNCTION_EXISTS (mmap HAVE_MMAP)
378CHECK_FUNCTION_EXISTS (mmap64 HAVE_MMAP64)
379CHECK_FUNCTION_EXISTS (perror HAVE_PERROR)
380CHECK_FUNCTION_EXISTS (poll HAVE_POLL)
381CHECK_FUNCTION_EXISTS (posix_fallocate HAVE_POSIX_FALLOCATE)
382CHECK_FUNCTION_EXISTS (pread HAVE_PREAD)
383CHECK_FUNCTION_EXISTS (pthread_attr_create HAVE_PTHREAD_ATTR_CREATE)
384CHECK_FUNCTION_EXISTS (pthread_attr_getstacksize HAVE_PTHREAD_ATTR_GETSTACKSIZE)
385CHECK_FUNCTION_EXISTS (pthread_attr_setscope HAVE_PTHREAD_ATTR_SETSCOPE)
386CHECK_FUNCTION_EXISTS (pthread_attr_getguardsize HAVE_PTHREAD_ATTR_GETGUARDSIZE)
387CHECK_FUNCTION_EXISTS (pthread_attr_setstacksize HAVE_PTHREAD_ATTR_SETSTACKSIZE)
388CHECK_FUNCTION_EXISTS (pthread_condattr_create HAVE_PTHREAD_CONDATTR_CREATE)
389CHECK_FUNCTION_EXISTS (pthread_getaffinity_np HAVE_PTHREAD_GETAFFINITY_NP)
390CHECK_FUNCTION_EXISTS (pthread_key_delete HAVE_PTHREAD_KEY_DELETE)
391CHECK_FUNCTION_EXISTS (pthread_rwlock_rdlock HAVE_PTHREAD_RWLOCK_RDLOCK)
392CHECK_FUNCTION_EXISTS (pthread_sigmask HAVE_PTHREAD_SIGMASK)
393CHECK_FUNCTION_EXISTS (pthread_yield_np HAVE_PTHREAD_YIELD_NP)
394CHECK_FUNCTION_EXISTS (putenv HAVE_PUTENV)
395CHECK_FUNCTION_EXISTS (readlink HAVE_READLINK)
396CHECK_FUNCTION_EXISTS (realpath HAVE_REALPATH)
397CHECK_FUNCTION_EXISTS (rename HAVE_RENAME)
398CHECK_FUNCTION_EXISTS (rwlock_init HAVE_RWLOCK_INIT)
399CHECK_FUNCTION_EXISTS (sched_yield HAVE_SCHED_YIELD)
400CHECK_FUNCTION_EXISTS (setenv HAVE_SETENV)
401CHECK_FUNCTION_EXISTS (setlocale HAVE_SETLOCALE)
402CHECK_FUNCTION_EXISTS (sigaction HAVE_SIGACTION)
403CHECK_FUNCTION_EXISTS (sigthreadmask HAVE_SIGTHREADMASK)
404CHECK_FUNCTION_EXISTS (sigwait HAVE_SIGWAIT)
405CHECK_FUNCTION_EXISTS (sigwaitinfo HAVE_SIGWAITINFO)
406CHECK_FUNCTION_EXISTS (sigset HAVE_SIGSET)
407CHECK_FUNCTION_EXISTS (sleep HAVE_SLEEP)
408CHECK_FUNCTION_EXISTS (snprintf HAVE_SNPRINTF)
409CHECK_FUNCTION_EXISTS (stpcpy HAVE_STPCPY)
410CHECK_FUNCTION_EXISTS (strcoll HAVE_STRCOLL)
411CHECK_FUNCTION_EXISTS (strerror HAVE_STRERROR)
412CHECK_FUNCTION_EXISTS (strnlen HAVE_STRNLEN)
413CHECK_FUNCTION_EXISTS (strpbrk HAVE_STRPBRK)
414CHECK_FUNCTION_EXISTS (strtok_r HAVE_STRTOK_R)
415CHECK_FUNCTION_EXISTS (strtoll HAVE_STRTOLL)
416CHECK_FUNCTION_EXISTS (strtoul HAVE_STRTOUL)
417CHECK_FUNCTION_EXISTS (strtoull HAVE_STRTOULL)
418CHECK_FUNCTION_EXISTS (strcasecmp HAVE_STRCASECMP)
419CHECK_FUNCTION_EXISTS (tell HAVE_TELL)
420CHECK_FUNCTION_EXISTS (thr_setconcurrency HAVE_THR_SETCONCURRENCY)
421CHECK_FUNCTION_EXISTS (thr_yield HAVE_THR_YIELD)
422CHECK_FUNCTION_EXISTS (vasprintf HAVE_VASPRINTF)
423CHECK_FUNCTION_EXISTS (vsnprintf HAVE_VSNPRINTF)
424CHECK_FUNCTION_EXISTS (memalign HAVE_MEMALIGN)
425CHECK_FUNCTION_EXISTS (nl_langinfo HAVE_NL_LANGINFO)
426
427IF(HAVE_SYS_EVENT_H)
428CHECK_FUNCTION_EXISTS (kqueue HAVE_KQUEUE)
429ENDIF()
430
431# readdir_r might exist, but be marked deprecated
432SET(CMAKE_REQUIRED_FLAGS -Werror)
433CHECK_CXX_SOURCE_COMPILES(
434"#include  <dirent.h>
435int main() {
436  readdir_r(0,0,0);
437  return 0;
438  }" HAVE_READDIR_R)
439SET(CMAKE_REQUIRED_FLAGS)
440
441#--------------------------------------------------------------------
442# Support for WL#2373 (Use cycle counter for timing)
443#--------------------------------------------------------------------
444
445CHECK_INCLUDE_FILES(time.h HAVE_TIME_H)
446CHECK_INCLUDE_FILES(sys/time.h HAVE_SYS_TIME_H)
447CHECK_INCLUDE_FILES(sys/times.h HAVE_SYS_TIMES_H)
448
449CHECK_INCLUDE_FILES(ia64intrin.h HAVE_IA64INTRIN_H)
450
451CHECK_FUNCTION_EXISTS(times HAVE_TIMES)
452CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
453CHECK_FUNCTION_EXISTS(read_real_time HAVE_READ_REAL_TIME)
454# This should work on AIX.
455
456CHECK_FUNCTION_EXISTS(ftime HAVE_FTIME)
457# This is still a normal call for milliseconds.
458
459CHECK_FUNCTION_EXISTS(time HAVE_TIME)
460# We can use time() on Macintosh if there is no ftime().
461
462
463#
464# Tests for symbols
465#
466
467#CHECK_SYMBOL_EXISTS(sys_errlist "stdio.h" HAVE_SYS_ERRLIST)
468CHECK_SYMBOL_EXISTS(madvise "sys/mman.h" HAVE_DECL_MADVISE)
469CHECK_SYMBOL_EXISTS(tzname "time.h" HAVE_TZNAME)
470CHECK_SYMBOL_EXISTS(lrand48 "stdlib.h" HAVE_LRAND48)
471CHECK_SYMBOL_EXISTS(getpagesize "unistd.h" HAVE_GETPAGESIZE)
472CHECK_SYMBOL_EXISTS(TIOCGWINSZ "sys/ioctl.h" GWINSZ_IN_SYS_IOCTL)
473CHECK_SYMBOL_EXISTS(FIONREAD "sys/ioctl.h" FIONREAD_IN_SYS_IOCTL)
474CHECK_SYMBOL_EXISTS(TIOCSTAT "sys/ioctl.h" TIOCSTAT_IN_SYS_IOCTL)
475CHECK_SYMBOL_EXISTS(FIONREAD "sys/filio.h" FIONREAD_IN_SYS_FILIO)
476CHECK_SYMBOL_EXISTS(gettimeofday "sys/time.h" HAVE_GETTIMEOFDAY)
477
478#
479# Test for endianness
480#
481INCLUDE(TestBigEndian)
482IF(APPLE)
483  # Cannot run endian test on universal PPC/Intel binaries
484  # would return inconsistent result.
485  # config.h.cmake includes a special #ifdef for Darwin
486ELSE()
487  TEST_BIG_ENDIAN(WORDS_BIGENDIAN)
488ENDIF()
489
490#
491# Tests for type sizes (and presence)
492#
493INCLUDE (CheckTypeSize)
494set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
495        -D_LARGEFILE_SOURCE -D_LARGE_FILES -D_FILE_OFFSET_BITS=64
496        -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS)
497SET(CMAKE_EXTRA_INCLUDE_FILES signal.h)
498MY_CHECK_TYPE_SIZE(sigset_t SIGSET_T)
499IF(NOT SIZEOF_SIGSET_T)
500 SET(sigset_t int)
501ENDIF()
502MY_CHECK_TYPE_SIZE(mode_t MODE_T)
503IF(NOT SIZEOF_MODE_T)
504 SET(mode_t int)
505ENDIF()
506MY_CHECK_TYPE_SIZE(sighandler_t SIGHANDLER_T)
507
508IF(HAVE_NETINET_IN_H)
509  SET(CMAKE_EXTRA_INCLUDE_FILES netinet/in.h)
510  MY_CHECK_TYPE_SIZE(in_addr_t IN_ADDR_T)
511ENDIF(HAVE_NETINET_IN_H)
512
513IF(HAVE_STDINT_H)
514  SET(CMAKE_EXTRA_INCLUDE_FILES stdint.h)
515ENDIF(HAVE_STDINT_H)
516
517SET(HAVE_VOIDP 1)
518SET(HAVE_CHARP 1)
519SET(HAVE_LONG 1)
520
521IF(NOT APPLE)
522MY_CHECK_TYPE_SIZE("void *" VOIDP)
523MY_CHECK_TYPE_SIZE("char *" CHARP)
524MY_CHECK_TYPE_SIZE(long LONG)
525MY_CHECK_TYPE_SIZE(size_t SIZE_T)
526ENDIF()
527
528MY_CHECK_TYPE_SIZE(short SHORT)
529MY_CHECK_TYPE_SIZE(int INT)
530MY_CHECK_TYPE_SIZE("long long" LONG_LONG)
531SET(CMAKE_EXTRA_INCLUDE_FILES stdio.h sys/types.h)
532MY_CHECK_TYPE_SIZE(off_t OFF_T)
533MY_CHECK_TYPE_SIZE(uchar UCHAR)
534MY_CHECK_TYPE_SIZE(uint UINT)
535MY_CHECK_TYPE_SIZE(ulong ULONG)
536MY_CHECK_TYPE_SIZE(int8 INT8)
537MY_CHECK_TYPE_SIZE(uint8 UINT8)
538MY_CHECK_TYPE_SIZE(int16 INT16)
539MY_CHECK_TYPE_SIZE(uint16 UINT16)
540MY_CHECK_TYPE_SIZE(int32 INT32)
541MY_CHECK_TYPE_SIZE(uint32 UINT32)
542MY_CHECK_TYPE_SIZE(int64 INT64)
543MY_CHECK_TYPE_SIZE(uint64 UINT64)
544MY_CHECK_TYPE_SIZE(time_t TIME_T)
545SET (CMAKE_EXTRA_INCLUDE_FILES sys/types.h)
546SET(CMAKE_EXTRA_INCLUDE_FILES)
547IF(HAVE_SYS_SOCKET_H)
548  SET(CMAKE_EXTRA_INCLUDE_FILES sys/socket.h)
549ENDIF(HAVE_SYS_SOCKET_H)
550SET(CMAKE_EXTRA_INCLUDE_FILES)
551
552IF(HAVE_IEEEFP_H)
553  SET(CMAKE_EXTRA_INCLUDE_FILES ieeefp.h)
554  MY_CHECK_TYPE_SIZE(fp_except FP_EXCEPT)
555ENDIF()
556
557
558#
559# Code tests
560#
561
562# check whether time_t is unsigned
563CHECK_C_SOURCE_COMPILES("
564#include <time.h>
565int main()
566{
567  int array[(((time_t)-1) > 0) ? 1 : -1];
568  return 0;
569}"
570TIME_T_UNSIGNED)
571
572CHECK_C_SOURCE_COMPILES("
573#ifdef _WIN32
574#include <winsock2.h>
575#include <ws2tcpip.h>
576#else
577#include <sys/types.h>
578#include <sys/socket.h>
579#include <netdb.h>
580#endif
581int main()
582{
583  select(0,0,0,0,0);
584  return 0;
585}"
586HAVE_SELECT)
587
588#
589# Check if timespec has ts_sec and ts_nsec fields
590#
591
592CHECK_C_SOURCE_COMPILES("
593#include <pthread.h>
594
595int main(int ac, char **av)
596{
597  struct timespec abstime;
598  abstime.ts_sec = time(NULL)+1;
599  abstime.ts_nsec = 0;
600}
601" HAVE_TIMESPEC_TS_SEC)
602
603
604#
605# Check return type of qsort()
606#
607CHECK_C_SOURCE_COMPILES("
608#include <stdlib.h>
609#ifdef __cplusplus
610extern \"C\"
611#endif
612void qsort(void *base, size_t nel, size_t width,
613  int (*compar) (const void *, const void *));
614int main(int ac, char **av) {}
615" QSORT_TYPE_IS_VOID)
616IF(QSORT_TYPE_IS_VOID)
617  SET(RETQSORTTYPE "void")
618ELSE(QSORT_TYPE_IS_VOID)
619  SET(RETQSORTTYPE "int")
620ENDIF(QSORT_TYPE_IS_VOID)
621
622IF(WIN32)
623SET(SOCKET_SIZE_TYPE int)
624ELSE()
625CHECK_CXX_SOURCE_COMPILES("
626#include <sys/socket.h>
627int main(int argc, char **argv)
628{
629  getsockname(0,0,(socklen_t *) 0);
630  return 0;
631}"
632HAVE_SOCKET_SIZE_T_AS_socklen_t)
633
634IF(HAVE_SOCKET_SIZE_T_AS_socklen_t)
635  SET(SOCKET_SIZE_TYPE socklen_t)
636ELSE()
637  CHECK_CXX_SOURCE_COMPILES("
638  #include <sys/socket.h>
639  int main(int argc, char **argv)
640  {
641    getsockname(0,0,(int *) 0);
642    return 0;
643  }"
644  HAVE_SOCKET_SIZE_T_AS_int)
645  IF(HAVE_SOCKET_SIZE_T_AS_int)
646    SET(SOCKET_SIZE_TYPE int)
647  ELSE()
648    CHECK_CXX_SOURCE_COMPILES("
649    #include <sys/socket.h>
650    int main(int argc, char **argv)
651    {
652      getsockname(0,0,(size_t *) 0);
653      return 0;
654    }"
655    HAVE_SOCKET_SIZE_T_AS_size_t)
656    IF(HAVE_SOCKET_SIZE_T_AS_size_t)
657      SET(SOCKET_SIZE_TYPE size_t)
658    ELSE()
659      SET(SOCKET_SIZE_TYPE int)
660    ENDIF()
661  ENDIF()
662ENDIF()
663ENDIF()
664
665CHECK_CXX_SOURCE_COMPILES("
666#include <pthread.h>
667int main()
668{
669  pthread_yield();
670  return 0;
671}
672" HAVE_PTHREAD_YIELD_ZERO_ARG)
673
674IF(NOT STACK_DIRECTION)
675  IF(CMAKE_CROSSCOMPILING)
676   MESSAGE(FATAL_ERROR
677   "STACK_DIRECTION is not defined.  Please specify -DSTACK_DIRECTION=1 "
678   "or -DSTACK_DIRECTION=-1 when calling cmake.")
679  ELSE()
680    TRY_RUN(STACKDIR_RUN_RESULT STACKDIR_COMPILE_RESULT
681     ${CMAKE_BINARY_DIR}
682     ${CMAKE_SOURCE_DIR}/cmake/stack_direction.c
683     )
684     # Test program returns 0 (down) or 1 (up).
685     # Convert to -1 or 1
686     IF(STACKDIR_RUN_RESULT EQUAL 0)
687       SET(STACK_DIRECTION -1 CACHE INTERNAL "Stack grows direction")
688     ELSE()
689       SET(STACK_DIRECTION 1 CACHE INTERNAL "Stack grows direction")
690     ENDIF()
691     MESSAGE(STATUS "Checking stack direction : ${STACK_DIRECTION}")
692   ENDIF()
693ENDIF()
694
695#
696# Check return type of signal handlers
697#
698CHECK_C_SOURCE_COMPILES("
699#include <signal.h>
700#ifdef signal
701# undef signal
702#endif
703#ifdef __cplusplus
704extern \"C\" void (*signal (int, void (*)(int)))(int);
705#else
706void (*signal ()) ();
707#endif
708int main(int ac, char **av) {}
709" SIGNAL_RETURN_TYPE_IS_VOID)
710IF(SIGNAL_RETURN_TYPE_IS_VOID)
711  SET(RETSIGTYPE void)
712  SET(VOID_SIGHANDLER 1)
713ELSE(SIGNAL_RETURN_TYPE_IS_VOID)
714  SET(RETSIGTYPE int)
715ENDIF(SIGNAL_RETURN_TYPE_IS_VOID)
716
717
718CHECK_INCLUDE_FILES("time.h;sys/time.h" TIME_WITH_SYS_TIME)
719CHECK_SYMBOL_EXISTS(O_NONBLOCK "unistd.h;fcntl.h" HAVE_FCNTL_NONBLOCK)
720IF(NOT HAVE_FCNTL_NONBLOCK)
721 SET(NO_FCNTL_NONBLOCK 1)
722ENDIF()
723
724#
725# Test for how the C compiler does inline, if at all
726#
727# SunPro is weird, apparently it only supports inline at -xO3 or -xO4.
728# And if CMAKE_C_FLAGS has -xO4 but CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE} has -xO2
729# then CHECK_C_SOURCE_COMPILES will succeed but the built will fail.
730# We must test all flags here.
731# XXX actually, we can do this for all compilers, not only SunPro
732IF (CMAKE_CXX_COMPILER_ID MATCHES "SunPro" AND
733    CMAKE_GENERATOR MATCHES "Makefiles")
734  STRING(TOUPPER "CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}" flags)
735  SET(CMAKE_REQUIRED_FLAGS "${${flags}}")
736ENDIF()
737CHECK_C_SOURCE_COMPILES("
738extern int bar(int x);
739static inline int foo(){return bar(1);}
740int main(int argc, char *argv[]){return 0;}"
741                            C_HAS_inline)
742IF(NOT C_HAS_inline)
743  CHECK_C_SOURCE_COMPILES("
744  extern int bar(int x);
745  static __inline int foo(){return bar(1);}
746  int main(int argc, char *argv[]){return 0;}"
747                            C_HAS___inline)
748  IF(C_HAS___inline)
749    SET(C_INLINE __inline)
750  ElSE()
751    SET(C_INLINE)
752    MESSAGE(WARNING "C compiler does not support funcion inlining")
753    IF(NOT NOINLINE)
754      MESSAGE(FATAL_ERROR "Use -DNOINLINE=TRUE to allow compilation without inlining")
755    ENDIF()
756  ENDIF()
757ENDIF()
758
759CHECK_SYMBOL_EXISTS(tcgetattr "termios.h" HAVE_TCGETATTR 1)
760
761#
762# Check type of signal routines (posix, 4.2bsd, 4.1bsd or v7)
763#
764CHECK_C_SOURCE_COMPILES("
765  #include <signal.h>
766  int main(int ac, char **av)
767  {
768    sigset_t ss;
769    struct sigaction sa;
770    sigemptyset(&ss); sigsuspend(&ss);
771    sigaction(SIGINT, &sa, (struct sigaction *) 0);
772    sigprocmask(SIG_BLOCK, &ss, (sigset_t *) 0);
773  }"
774  HAVE_POSIX_SIGNALS)
775
776IF(NOT HAVE_POSIX_SIGNALS)
777 CHECK_C_SOURCE_COMPILES("
778  #include <signal.h>
779  int main(int ac, char **av)
780  {
781    int mask = sigmask(SIGINT);
782    sigsetmask(mask); sigblock(mask); sigpause(mask);
783  }"
784  HAVE_BSD_SIGNALS)
785ENDIF(NOT HAVE_POSIX_SIGNALS)
786
787# Assume regular sprintf
788SET(SPRINTFS_RETURNS_INT 1)
789
790IF(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
791CHECK_CXX_SOURCE_COMPILES("
792 #include <cxxabi.h>
793 int main(int argc, char **argv)
794  {
795    char *foo= 0; int bar= 0;
796    foo= abi::__cxa_demangle(foo, foo, 0, &bar);
797    return 0;
798  }"
799  HAVE_ABI_CXA_DEMANGLE)
800ENDIF()
801
802CHECK_C_SOURCE_COMPILES("
803    int main()
804    {
805      extern void __attribute__((weak)) foo(void);
806      return 0;
807    }"
808    HAVE_WEAK_SYMBOL
809)
810
811CHECK_C_SOURCE_COMPILES("
812    void foo(int *x) { }
813    int main() {
814      int a __attribute__((cleanup(foo)));
815      return 0;
816    }"
817    HAVE_ATTRIBUTE_CLEANUP
818)
819
820CHECK_CXX_SOURCE_COMPILES("
821    #include <new>
822    int main()
823    {
824     char *c = new char;
825     return 0;
826    }"
827    HAVE_CXX_NEW
828)
829
830CHECK_CXX_SOURCE_COMPILES("
831    #undef inline
832    #if !defined(SCO) && !defined(__osf__) && !defined(_REENTRANT)
833    #define _REENTRANT
834    #endif
835    #include <pthread.h>
836    #include <sys/types.h>
837    #include <sys/socket.h>
838    #include <netinet/in.h>
839    #include <arpa/inet.h>
840    #include <netdb.h>
841    int main()
842    {
843
844       struct hostent *foo =
845       gethostbyaddr_r((const char *) 0,
846          0, 0, (struct hostent *) 0, (char *) NULL,  0, (int *)0);
847       return 0;
848    }
849  "
850  HAVE_SOLARIS_STYLE_GETHOST)
851
852SET(NO_ALARM 1 CACHE BOOL  "No need to use alarm to implement timeout")
853
854# As a consequence of ALARMs no longer being used, thread
855# notification for KILL must close the socket to wake up
856# other threads.
857SET(SIGNAL_WITH_VIO_CLOSE 1)
858
859MARK_AS_ADVANCED(NO_ALARM)
860
861
862CHECK_CXX_SOURCE_COMPILES("
863int main()
864{
865  char x=1;
866  short y=1;
867  int z=1;
868  long w = 1;
869  long long s = 1;
870  x = __atomic_add_fetch(&x, 1, __ATOMIC_SEQ_CST);
871  y = __atomic_add_fetch(&y, 1, __ATOMIC_SEQ_CST);
872  z = __atomic_add_fetch(&z, 1, __ATOMIC_SEQ_CST);
873  w = __atomic_add_fetch(&w, 1, __ATOMIC_SEQ_CST);
874  return (int)__atomic_load_n(&s, __ATOMIC_SEQ_CST);
875}"
876HAVE_GCC_C11_ATOMICS_WITHOUT_LIBATOMIC)
877IF (HAVE_GCC_C11_ATOMICS_WITHOUT_LIBATOMIC)
878  SET(HAVE_GCC_C11_ATOMICS True)
879ELSE()
880  SET(OLD_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
881  LIST(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
882  CHECK_CXX_SOURCE_COMPILES("
883  int main()
884  {
885    char x=1;
886    short y=1;
887    int z=1;
888    long w = 1;
889    long long s = 1;
890    x = __atomic_add_fetch(&x, 1, __ATOMIC_SEQ_CST);
891    y = __atomic_add_fetch(&y, 1, __ATOMIC_SEQ_CST);
892    z = __atomic_add_fetch(&z, 1, __ATOMIC_SEQ_CST);
893    w = __atomic_add_fetch(&w, 1, __ATOMIC_SEQ_CST);
894    return (int)__atomic_load_n(&s, __ATOMIC_SEQ_CST);
895  }"
896  HAVE_GCC_C11_ATOMICS_WITH_LIBATOMIC)
897  IF(HAVE_GCC_C11_ATOMICS_WITH_LIBATOMIC)
898    SET(HAVE_GCC_C11_ATOMICS True)
899  ENDIF()
900  SET(CMAKE_REQUIRED_LIBRARIES ${OLD_CMAKE_REQUIRED_LIBRARIES})
901ENDIF()
902
903IF(WITH_VALGRIND)
904  SET(HAVE_valgrind 1)
905ENDIF()
906
907CHECK_INCLUDE_FILES("valgrind/memcheck.h;valgrind/valgrind.h"
908  HAVE_VALGRIND_MEMCHECK_H)
909
910#--------------------------------------------------------------------
911# Check for IPv6 support
912#--------------------------------------------------------------------
913CHECK_INCLUDE_FILE(netinet/in6.h HAVE_NETINET_IN6_H)
914
915IF(UNIX)
916  SET(CMAKE_EXTRA_INCLUDE_FILES sys/types.h netinet/in.h sys/socket.h)
917  IF(HAVE_NETINET_IN6_H)
918    SET(CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_EXTRA_INCLUDE_FILES} netinet/in6.h)
919  ENDIF()
920ELSEIF(WIN32)
921  SET(CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_EXTRA_INCLUDE_FILES} winsock2.h ws2ipdef.h)
922ENDIF()
923
924MY_CHECK_STRUCT_SIZE("sockaddr_in6" SOCKADDR_IN6)
925MY_CHECK_STRUCT_SIZE("in6_addr" IN6_ADDR)
926
927IF(HAVE_STRUCT_SOCKADDR_IN6 OR HAVE_STRUCT_IN6_ADDR)
928  SET(HAVE_IPV6 TRUE CACHE INTERNAL "")
929ENDIF()
930
931
932# Check for sockaddr_storage.ss_family
933# It is called differently under OS400 and older AIX
934
935CHECK_STRUCT_HAS_MEMBER("struct sockaddr_storage"
936 ss_family "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SOCKADDR_STORAGE_SS_FAMILY)
937IF(NOT HAVE_SOCKADDR_STORAGE_SS_FAMILY)
938  CHECK_STRUCT_HAS_MEMBER("struct sockaddr_storage"
939  __ss_family "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SOCKADDR_STORAGE___SS_FAMILY)
940  IF(HAVE_SOCKADDR_STORAGE___SS_FAMILY)
941    SET(ss_family __ss_family)
942  ENDIF()
943ENDIF()
944
945#
946# Check if struct sockaddr_in::sin_len is available.
947#
948
949CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in" sin_len
950  "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SOCKADDR_IN_SIN_LEN)
951
952#
953# Check if struct sockaddr_in6::sin6_len is available.
954#
955
956CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in6" sin6_len
957  "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SOCKADDR_IN6_SIN6_LEN)
958
959SET(CMAKE_EXTRA_INCLUDE_FILES)
960
961CHECK_STRUCT_HAS_MEMBER("struct dirent" d_ino "dirent.h"  STRUCT_DIRENT_HAS_D_INO)
962CHECK_STRUCT_HAS_MEMBER("struct dirent" d_namlen "dirent.h"  STRUCT_DIRENT_HAS_D_NAMLEN)
963SET(SPRINTF_RETURNS_INT 1)
964CHECK_INCLUDE_FILE(ucontext.h HAVE_FILE_UCONTEXT_H)
965IF(NOT HAVE_FILE_UCONTEXT_H)
966  CHECK_INCLUDE_FILE(sys/ucontext.h HAVE_FILE_UCONTEXT_H)
967ENDIF()
968IF(HAVE_FILE_UCONTEXT_H)
969  CHECK_FUNCTION_EXISTS(makecontext HAVE_UCONTEXT_H)
970ENDIF()
971
972CHECK_STRUCT_HAS_MEMBER("struct timespec" tv_sec "time.h" STRUCT_TIMESPEC_HAS_TV_SEC)
973CHECK_STRUCT_HAS_MEMBER("struct timespec" tv_nsec "time.h" STRUCT_TIMESPEC_HAS_TV_NSEC)
974
975IF(NOT MSVC)
976  CHECK_C_SOURCE_COMPILES(
977  "
978  #define _GNU_SOURCE
979  #include <fcntl.h>
980  #include <linux/falloc.h>
981  int main()
982  {
983    /* Ignore the return value for now. Check if the flags exist.
984    The return value is checked  at runtime. */
985    fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0);
986
987    return(0);
988  }"
989  HAVE_FALLOC_PUNCH_HOLE_AND_KEEP_SIZE
990  )
991ENDIF()
992