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