summaryrefslogtreecommitdiff
path: root/3rdparty/plibsys/src/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/plibsys/src/CMakeLists.txt')
-rw-r--r--3rdparty/plibsys/src/CMakeLists.txt996
1 files changed, 996 insertions, 0 deletions
diff --git a/3rdparty/plibsys/src/CMakeLists.txt b/3rdparty/plibsys/src/CMakeLists.txt
new file mode 100644
index 0000000..2f13fbf
--- /dev/null
+++ b/3rdparty/plibsys/src/CMakeLists.txt
@@ -0,0 +1,996 @@
+# The MIT License
+#
+# Copyright (C) 2018-2019 Alexander Saprykin <saprykin.spb@gmail.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# 'Software'), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+if (POLICY CMP0075)
+ cmake_policy (SET CMP0075 NEW)
+endif()
+
+include (CheckCSourceCompiles)
+include (CheckTypeSize)
+include (CheckIncludeFile)
+include (TestBigEndian)
+
+# First of all, detect size of the pointer for the target machine.
+# We can't rely on CMAKE_SIZEOF_VOID_P when building universal
+# binaries.
+
+check_type_size ("void *" PLIBSYS_SIZEOF_VOID_P)
+check_type_size ("size_t" PLIBSYS_SIZEOF_SIZE_T)
+check_type_size ("long" PLIBSYS_SIZEOF_LONG)
+
+# Without generated code multi-arch builds are not supported anyway,
+# so the best we can do is to fallback to detected size values
+
+if (CMAKE_VERSION VERSION_LESS 2.8.1)
+ set (PLIBSYS_SIZEOF_VOID_P_CODE "#define PLIBSYS_SIZEOF_VOID_P ${PLIBSYS_SIZEOF_VOID_P}")
+ set (PLIBSYS_SIZEOF_SIZE_T_CODE "#define PLIBSYS_SIZEOF_SIZE_T ${PLIBSYS_SIZEOF_SIZE_T}")
+ set (PLIBSYS_SIZEOF_LONG_CODE "#define PLIBSYS_SIZEOF_LONG ${PLIBSYS_SIZEOF_LONG}")
+endif()
+
+include (${PROJECT_SOURCE_DIR}/cmake/PlatformDetect.cmake)
+include (${PROJECT_SOURCE_DIR}/cmake/VisibilityDetect.cmake)
+include (${PROJECT_SOURCE_DIR}/cmake/StdargDetect.cmake)
+include (${PROJECT_SOURCE_DIR}/cmake/ThreadNameDetect.cmake)
+set (OUTPUT_DIR ${CMAKE_BINARY_DIR})
+
+# Try to detect target platform
+plibsys_detect_target_platform (PLIBSYS_TARGET_PLATFORM)
+plibsys_detect_c_compiler (PLIBSYS_C_COMPILER)
+plibsys_detect_target_os (PLIBSYS_TARGET_OS)
+plibsys_detect_os_bits (PLIBSYS_OS_BITS)
+
+if (PLIBSYS_OS_BITS STREQUAL "unknown")
+ message (FATAL_ERROR "Failed to detect bitness of the target system")
+endif()
+
+if ((PLIBSYS_TARGET_OS STREQUAL windows) AND NOT (PLIBSYS_TARGET_OS STREQUAL cygwin)
+ AND NOT (PLIBSYS_TARGET_OS STREQUAL msys))
+ set (PLIBSYS_NATIVE_WINDOWS TRUE)
+endif()
+
+if (PLIBSYS_COVERAGE)
+ if (PLIBSYS_C_COMPILER MATCHES "gcc|clang")
+ set (CMAKE_BUILD_TYPE "Debug")
+ list (APPEND CMAKE_C_FLAGS "--coverage")
+ endif()
+endif()
+
+# CMP0042, see http://www.cmake.org/Wiki/CMake_RPATH_handling
+if (PLIBSYS_TARGET_OS STREQUAL darwin)
+ if (POLICY CMP0068)
+ cmake_policy (SET CMP0068 NEW)
+ endif()
+
+ set (CMAKE_MACOSX_RPATH TRUE)
+ set (CMAKE_SKIP_BUILD_RPATH FALSE)
+
+ # Fix runtime paths on macOS 10.5 and less
+ if (CMAKE_SYSTEM_VERSION VERSION_LESS "10.0.0")
+ set (CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
+ else()
+ set (CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
+ endif()
+
+ set (CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
+ set (CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
+
+ list (FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir)
+
+ if ("${isSystemDir}" STREQUAL "-1")
+ set (CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
+ endif ("${isSystemDir}" STREQUAL "-1")
+endif()
+
+if (NOT EXISTS "${PROJECT_SOURCE_DIR}/platforms/${PLIBSYS_TARGET_PLATFORM}/")
+ message (FATAL_ERROR "plibsys doesn't support unknown platform ${PLIBSYS_TARGET_PLATFORM}")
+endif()
+
+include (${PROJECT_SOURCE_DIR}/platforms/${PLIBSYS_TARGET_PLATFORM}/platform.cmake)
+
+set (PLIBSYS_INCLUDE_DIRS
+ ${PROJECT_SOURCE_DIR}/src
+ ${CMAKE_BINARY_DIR}
+)
+
+set (PLIBSYS_PUBLIC_HDRS
+ patomic.h
+ ptypes.h
+ pmacros.h
+ pmacroscompiler.h
+ pmacroscpu.h
+ pmacrosos.h
+ pcondvariable.h
+ pcryptohash.h
+ perror.h
+ perrortypes.h
+ pdir.h
+ pfile.h
+ phashtable.h
+ pinifile.h
+ plibsys.h
+ plibraryloader.h
+ plist.h
+ pmain.h
+ pmem.h
+ pmutex.h
+ pprocess.h
+ prwlock.h
+ psemaphore.h
+ pshm.h
+ pshmbuffer.h
+ psocket.h
+ psocketaddress.h
+ pspinlock.h
+ pstdarg.h
+ pstring.h
+ ptimeprofiler.h
+ ptree.h
+ puthread.h
+)
+
+set (PLIBSYS_PRIVATE_HDRS
+ pcryptohash-gost3411.h
+ pcryptohash-md5.h
+ pcryptohash-sha1.h
+ pcryptohash-sha2-256.h
+ pcryptohash-sha2-512.h
+ pcryptohash-sha3.h
+ perror-private.h
+ plibsys-private.h
+ psysclose-private.h
+ ptimeprofiler-private.h
+ ptree-avl.h
+ ptree-bst.h
+ ptree-rb.h
+ ptree-private.h
+ puthread-private.h
+ ${CMAKE_BINARY_DIR}/plibsysconfig.h
+)
+
+set (PLIBSYS_SRCS
+ pcryptohash.c
+ pcryptohash-gost3411.c
+ pcryptohash-md5.c
+ pcryptohash-sha1.c
+ pcryptohash-sha2-256.c
+ pcryptohash-sha2-512.c
+ pcryptohash-sha3.c
+ pdir.c
+ perror.c
+ pfile.c
+ phashtable.c
+ pinifile.c
+ plist.c
+ pmain.c
+ pmem.c
+ pprocess.c
+ pshmbuffer.c
+ psocket.c
+ psocketaddress.c
+ pstring.c
+ ptimeprofiler.c
+ ptree.c
+ ptree-avl.c
+ ptree-bst.c
+ ptree-rb.c
+ puthread.c
+)
+
+if (PLIBSYS_NATIVE_WINDOWS)
+ set (PLIBSYS_CLOSE_MODEL win)
+elseif (PLIBSYS_TARGET_OS STREQUAL darwin)
+ set (PLIBSYS_CLOSE_MODEL darwin)
+else()
+ set (PLIBSYS_CLOSE_MODEL unix)
+endif()
+
+if (PLIBSYS_THREAD_MODEL STREQUAL "")
+ set (PLIBSYS_THREAD_MODEL none)
+endif()
+
+if (PLIBSYS_IPC_MODEL STREQUAL "")
+ set (PLIBSYS_IPC_MODEL none)
+endif()
+
+if (PLIBSYS_TIME_PROFILER_MODEL STREQUAL "")
+ set (PLIBSYS_TIME_PROFILER_MODEL generic)
+endif()
+
+if (PLIBSYS_DIR_MODEL STREQUAL "")
+ set (PLIBSYS_DIR_MODEL none)
+endif()
+
+if (PLIBSYS_LIBRARYLOADER_MODEL STREQUAL "")
+ set (PLIBSYS_LIBRARYLOADER_MODEL none)
+endif()
+
+set (PLIBSYS_PLATFORM_SRCS
+ pcondvariable-${PLIBSYS_THREAD_MODEL}.c
+ pmutex-${PLIBSYS_THREAD_MODEL}.c
+ psemaphore-${PLIBSYS_IPC_MODEL}.c
+ pshm-${PLIBSYS_IPC_MODEL}.c
+ psysclose-${PLIBSYS_CLOSE_MODEL}.c
+ puthread-${PLIBSYS_THREAD_MODEL}.c
+ ptimeprofiler-${PLIBSYS_TIME_PROFILER_MODEL}.c
+ pdir-${PLIBSYS_DIR_MODEL}.c
+ plibraryloader-${PLIBSYS_LIBRARYLOADER_MODEL}.c
+)
+
+if (NOT PLIBSYS_IPC_MODEL STREQUAL none)
+ list (APPEND PLIBSYS_PRIVATE_HDRS pipc-private.h)
+ list (APPEND PLIBSYS_SRCS pipc.c)
+endif()
+
+# Save compiler flags
+set (SAVED_CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS})
+set (SAVED_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
+set (SAVED_CMAKE_REQUIRED_FLAGS ${SAVED_CMAKE_REQUIRED_FLAGS})
+
+list (APPEND CMAKE_REQUIRED_DEFINITIONS ${PLIBSYS_PLATFORM_DEFINES})
+list (APPEND CMAKE_REQUIRED_LIBRARIES ${PLIBSYS_PLATFORM_LINK_LIBRARIES})
+list (APPEND CMAKE_REQUIRED_FLAGS ${PLIBSYS_PLATFORM_LDFLAGS})
+
+set (PLIBSYS_ATOMIC_LOCK_FREE FALSE)
+
+if (NOT PLIBSYS_ATOMIC_MODEL)
+ message (STATUS "Checking for lock-free atomic intrinsics")
+
+ if (NOT PLIBSYS_C_COMPILER STREQUAL clang)
+ # GCC __atomic* intrinsics
+ check_c_source_compiles (
+ "int main () {
+ int i, tmp_int = 0;
+ void *ptr, *tmp_ptr = 0;
+ __atomic_store_4 (&i, 0, __ATOMIC_SEQ_CST);
+ __atomic_compare_exchange_n (&i, &tmp_int, 1, 0,
+ __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
+ __atomic_compare_exchange_n ((unsigned long long *) &ptr,
+ (unsigned long long *) &tmp_ptr,
+ (unsigned long long) 1, 0,
+ __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
+ __atomic_fetch_add (&i, 1, __ATOMIC_SEQ_CST);
+ return 0;
+ }"
+ PLIBSYS_ATOMIC_IMPL_GCCATOMIC
+ )
+
+ if (PLIBSYS_ATOMIC_IMPL_GCCATOMIC)
+ set (PLIBSYS_ATOMIC_LOCK_FREE yes)
+ set (PLIBSYS_ATOMIC_MODEL "c11")
+ endif()
+ endif()
+
+ # GCC __sync* intinsics
+ if (NOT PLIBSYS_ATOMIC_LOCK_FREE)
+ check_c_source_compiles (
+ "int main () {
+ int i;
+ __sync_synchronize ();
+ __sync_val_compare_and_swap (&i, 0, 1);
+ __sync_fetch_and_add (&i, 1);
+ return 0;
+ }"
+ PLIBSYS_ATOMIC_IMPL_GCCSYNC
+ )
+
+ if (PLIBSYS_ATOMIC_IMPL_GCCSYNC)
+ set (PLIBSYS_ATOMIC_LOCK_FREE yes)
+ set (PLIBSYS_ATOMIC_MODEL "sync")
+ endif()
+ endif()
+
+ if (NOT PLIBSYS_ATOMIC_LOCK_FREE)
+ if (PLIBSYS_TARGET_OS STREQUAL windows AND (PLIBSYS_C_COMPILER STREQUAL borland OR
+ PLIBSYS_C_COMPILER STREQUAL watcom OR
+ PLIBSYS_C_COMPILER STREQUAL icc OR
+ PLIBSYS_C_COMPILER STREQUAL msvc))
+ set (PLIBSYS_ATOMIC_LOCK_FREE TRUE)
+ set (PLIBSYS_ATOMIC_MODEL "win")
+ else()
+ set (PLIBSYS_ATOMIC_LOCK_FREE FALSE)
+ set (PLIBSYS_ATOMIC_MODEL "sim")
+ endif()
+ endif()
+
+ if (PLIBSYS_ATOMIC_LOCK_FREE)
+ message (STATUS "Checking for lock-free atomic intrinsics - works")
+ else()
+ message (STATUS "Checking for lock-free atomic intrinsics - not works")
+ endif()
+endif()
+
+list (APPEND PLIBSYS_SRCS
+ patomic-${PLIBSYS_ATOMIC_MODEL}.c
+ pspinlock-${PLIBSYS_ATOMIC_MODEL}.c
+)
+
+if (EXISTS PLIBSYS_CONFIG_FILE)
+ file (REMOVE ${PLIBSYS_CONFIG_FILE})
+endif()
+
+test_big_endian (PLIBSYS_IS_BIGENDIAN)
+
+check_include_file ("float.h" PLIBSYS_HAVE_FLOAT_H)
+check_include_file ("values.h" PLIBSYS_HAVE_VALUES_H)
+check_include_file ("limits.h" PLIBSYS_HAVE_LIMITS_H)
+
+if (PLIBSYS_HAVE_FLOAT_H)
+ set (PLIBSYS_NEED_FLOAT_H TRUE)
+ set (PLIBSYS_FLOAT_MIN FLT_MIN)
+ set (PLIBSYS_FLOAT_MAX FLT_MAX)
+ set (PLIBSYS_DOUBLE_MIN DBL_MIN)
+ set (PLIBSYS_DOUBLE_MAX DBL_MAX)
+elseif (PLIBSYS_HAVE_VALUES_H)
+ set (PLIBSYS_NEED_VALUES_H TRUE)
+ set (PLIBSYS_FLOAT_MIN MINFLOAT)
+ set (PLIBSYS_FLOAT_MAX MAXFLOAT)
+ set (PLIBSYS_DOUBLE_MIN MINDOUBLE)
+ set (PLIBSYS_DOUBLE_MAX MAXDOUBLE)
+endif()
+
+if (PLIBSYS_HAVE_LIMITS_H)
+ set (PLIBSYS_NEED_LIMITS_H TRUE)
+ set (PLIBSYS_SHORT_MIN SHRT_MIN)
+ set (PLIBSYS_SHORT_MAX SHRT_MAX)
+ set (PLIBSYS_USHORT_MAX USHRT_MAX)
+ set (PLIBSYS_INT_MIN INT_MIN)
+ set (PLIBSYS_INT_MAX INT_MAX)
+ set (PLIBSYS_UINT_MAX UINT_MAX)
+ set (PLIBSYS_LONG_MIN LONG_MIN)
+ set (PLIBSYS_LONG_MAX LONG_MAX)
+ set (PLIBSYS_ULONG_MAX ULONG_MAX)
+elseif (PLIBSYS_HAVE_VALUES_H)
+ set (PLIBSYS_NEED_VALUES_H TRUE)
+ set (PLIBSYS_SHORT_MIN MINSHORT)
+ set (PLIBSYS_SHORT_MAX MAXSHORT)
+ set (PLIBSYS_USHORT_MAX "(((pushort) P_MAXSHORT) * 2 + 1)")
+ set (PLIBSYS_INT_MIN MININT)
+ set (PLIBSYS_INT_MAX MAXINT)
+ set (PLIBSYS_UINT_MAX "(((puint) P_MAXINT) * 2 + 1)")
+ set (PLIBSYS_LONG_MIN MINLONG)
+ set (PLIBSYS_LONG_MAX MAXLONG)
+ set (PLIBSYS_ULONG_MAX "(((pulong) P_MAXLONG) * 2 + 1)")
+endif()
+
+if (PLIBSYS_NATIVE_WINDOWS)
+ set (PLIBSYS_NEED_WINDOWS_H TRUE)
+endif()
+
+if (NOT PLIBSYS_NATIVE_WINDOWS)
+ # Check for anonymous mmap()
+ message (STATUS "Checking whether mmap has anonymous mapping")
+
+ check_c_source_compiles (
+ "#include <sys/types.h>
+ #include <sys/mman.h>
+ int main () {
+ mmap (0, 1024, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
+ return 0;
+ }"
+ PLIBSYS_MMAP_HAS_MAP_ANON
+ )
+
+ check_c_source_compiles (
+ "#include <sys/types.h>
+ #include <sys/mman.h>
+ int main () {
+ mmap (0, 1024, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
+ return 0;
+ }"
+ PLIBSYS_MMAP_HAS_MAP_ANONYMOUS
+ )
+
+ if (PLIBSYS_MMAP_HAS_MAP_ANONYMOUS OR PLIBSYS_MMAP_HAS_MAP_ANON)
+ message (STATUS "Checking whether mmap has anonymous mapping - yes")
+ else()
+ message (STATUS "Checking whether mmap has anonymous mapping - no")
+ endif()
+
+ if (PLIBSYS_MMAP_HAS_MAP_ANONYMOUS)
+ list (APPEND PLIBSYS_COMPILE_DEFS -DPLIBSYS_MMAP_HAS_MAP_ANONYMOUS)
+ elseif (PLIBSYS_MMAP_HAS_MAP_ANON)
+ list (APPEND PLIBSYS_COMPILE_DEFS -DPLIBSYS_MMAP_HAS_MAP_ANON)
+ endif()
+
+ # Check for clock_nanosleep() call
+ message (STATUS "Checking whether clock_nanosleep() presents")
+
+ check_c_source_compiles (
+ "#include <time.h>
+ int main () {
+ struct timespec time_sp = {0, 500000000L};
+ clock_nanosleep (CLOCK_MONOTONIC, 0, &time_sp, NULL);
+ return 0;
+ }"
+ PLIBSYS_HAS_CLOCKNANOSLEEP
+ )
+
+ if (PLIBSYS_HAS_CLOCKNANOSLEEP)
+ message (STATUS "Checking whether clock_nanosleep() presents - yes")
+ else()
+ message (STATUS "Checking whether clock_nanosleep() presents - no")
+ endif()
+
+ # Check for nanosleep() call
+ message (STATUS "Checking whether nanosleep() presents")
+
+ check_c_source_compiles (
+ "#include <time.h>
+ int main () {
+ struct timespec time_sp = {0, 500000000L};
+ nanosleep (&time_sp, NULL);
+ return 0;
+ }"
+ PLIBSYS_HAS_NANOSLEEP
+ )
+
+ if (PLIBSYS_HAS_NANOSLEEP)
+ message (STATUS "Checking whether nanosleep() presents - yes")
+ list (APPEND PLIBSYS_COMPILE_DEFS -DPLIBSYS_HAS_NANOSLEEP)
+ else()
+ message (STATUS "Checking whether nanosleep() presents - no")
+ endif()
+
+ # Prefere clock_nanosleep() over nanosleep() for power consumption
+ if (PLIBSYS_HAS_CLOCKNANOSLEEP)
+ list (APPEND PLIBSYS_COMPILE_DEFS -DPLIBSYS_HAS_CLOCKNANOSLEEP)
+ elseif(PLIBSYS_HAS_NANOSLEEP)
+ list (APPEND PLIBSYS_COMPILE_DEFS -DPLIBSYS_HAS_NANOSLEEP)
+ endif()
+
+ # Check for getaddrinfo() call
+ message (STATUS "Checking whether getaddrinfo() presents")
+
+ check_c_source_compiles (
+ "#include <sys/socket.h>
+ #include <netdb.h>
+ int main () {
+ getaddrinfo (0, 0, 0, 0);
+ freeaddrinfo (0);
+
+ return 0;
+ }"
+ PLIBSYS_HAS_GETADDRINFO
+ )
+
+ if (PLIBSYS_HAS_GETADDRINFO)
+ message (STATUS "Checking whether getaddrinfo() presents - yes")
+ list (APPEND PLIBSYS_COMPILE_DEFS -DPLIBSYS_HAS_GETADDRINFO)
+ else()
+ message (STATUS "Checking whether getaddrinfo() presents - no")
+ endif()
+endif()
+
+if (NOT PLIBSYS_RWLOCK_MODEL)
+ set (PLIBSYS_RWLOCK_MODEL ${PLIBSYS_THREAD_MODEL})
+else()
+ if (NOT PLIBSYS_RWLOCK_MODEL STREQUAL general AND
+ NOT PLIBSYS_RWLOCK_MODEL STREQUAL none)
+ message (WARNING "It's not recommended to mix threading and read-write lock models")
+ endif()
+endif()
+
+if (PLIBSYS_THREAD_MODEL STREQUAL posix)
+ # Some systems only need the difinition to be available
+ if (PLIBSYS_TARGET_OS MATCHES "darwin|aix")
+ set (PLIBSYS_SCHED_CHECK "defined (_POSIX_THREAD_PRIORITY_SCHEDULING)")
+ elseif (PLIBSYS_TARGET_OS STREQUAL android)
+ set (PLIBSYS_SCHED_CHECK "0")
+ else()
+ set (PLIBSYS_SCHED_CHECK "defined (_POSIX_THREAD_PRIORITY_SCHEDULING) && (_POSIX_THREAD_PRIORITY_SCHEDULING - 0 >= 0)")
+ endif()
+
+ # Check for thread scheduling
+ message (STATUS "Checking whether POSIX thread scheduling presents")
+
+ check_c_source_compiles (
+ "#include <unistd.h>
+ #include <pthread.h>
+ #include <sched.h>
+
+ int main () {
+ #if ${PLIBSYS_SCHED_CHECK}
+ sched_get_priority_min (0);
+ sched_get_priority_max (0);
+ #else
+ stop_compile_here
+ #endif
+ return 0;
+ }"
+ PLIBSYS_HAS_POSIX_SCHEDULING
+ )
+
+ if (PLIBSYS_HAS_POSIX_SCHEDULING)
+ message (STATUS "Checking whether POSIX thread scheduling presents - yes")
+ list (APPEND PLIBSYS_COMPILE_DEFS -DPLIBSYS_HAS_POSIX_SCHEDULING)
+ else()
+ message (STATUS "Checking whether POSIX thread scheduling presents - no")
+ endif()
+
+ # Check for thread stack size
+ message (STATUS "Checking whether POSIX thread stack size is supported")
+
+ check_c_source_compiles (
+ "#include <pthread.h>
+
+ int main () {
+ pthread_attr_t attr;
+
+ pthread_attr_setstacksize (&attr, 0);
+ return 0;
+ }"
+ PLIBSYS_HAS_POSIX_STACKSIZE
+ )
+
+ if (PLIBSYS_HAS_POSIX_STACKSIZE)
+ message (STATUS "Checking whether POSIX thread stack size is supported - yes")
+ list (APPEND PLIBSYS_COMPILE_DEFS -DPLIBSYS_HAS_POSIX_STACKSIZE)
+ else()
+ message (STATUS "Checking whether POSIX thread stack size is supported - no")
+ endif()
+endif()
+
+# Some platforms may have headers, but lack actual implementation,
+# thus we can let platform to override read-write lock model with
+# general implementation
+if (PLIBSYS_THREAD_MODEL STREQUAL posix AND
+ PLIBSYS_RWLOCK_MODEL STREQUAL posix)
+ # Check for read-write lock support
+ message (STATUS "Checking whether POSIX read-write locks are supported")
+
+ check_c_source_compiles (
+ "#include <pthread.h>
+
+ int main () {
+ pthread_rwlock_t rwl;
+
+ pthread_rwlock_init (&rwl, 0);
+ pthread_rwlock_destroy (&rwl);
+ return 0;
+ }"
+ PLIBSYS_HAS_POSIX_RWLOCK
+ )
+
+ if (PLIBSYS_HAS_POSIX_RWLOCK)
+ message (STATUS "Checking whether POSIX read-write locks are supported - yes")
+ else()
+ message (STATUS "Checking whether POSIX read-write locks are supported - no")
+ set (PLIBSYS_RWLOCK_MODEL "general")
+ endif()
+endif()
+
+list (APPEND PLIBSYS_PLATFORM_SRCS prwlock-${PLIBSYS_RWLOCK_MODEL}.c)
+
+# POSIX thread naming functions
+check_c_source_compiles (
+ "#include <pthread.h>
+ #include <pthread_np.h>
+
+ int main () {return 0;}"
+ PLIBSYS_HAS_PTHREAD_NP
+ )
+
+if(PLIBSYS_HAS_PTHREAD_NP)
+ set (PLIBSYS_NEED_PTHREAD_NP_H TRUE)
+else()
+ set (PLIBSYS_NEED_PTHREAD_NP_H FALSE)
+endif()
+
+message (STATUS "Checking whether POSIX thread names are supported")
+
+plibsys_detect_thread_name (PLIBSYS_NEED_PTHREAD_NP_H PLIBSYS_THREADNAME_DEF)
+
+if (NOT PLIBSYS_THREADNAME_DEF STREQUAL "NONE")
+ list (APPEND PLIBSYS_COMPILE_DEFS -D${PLIBSYS_THREADNAME_DEF})
+endif()
+
+if (PLIBSYS_THREADNAME_DEF STREQUAL "NONE")
+ message (STATUS "Checking whether POSIX thread names are supported - no")
+else()
+ message (STATUS "Checking whether POSIX thread names are supported - yes")
+endif()
+
+# Windows sockets
+if (PLIBSYS_NATIVE_WINDOWS)
+ set (PLIBSYS_SOCKET_INCLUDES "#include <winsock2.h>
+ #include <ws2tcpip.h>
+ #include <windows.h>")
+else()
+ set (PLIBSYS_SOCKET_INCLUDES "#include <sys/types.h>
+ #include <sys/socket.h>
+ #include <netinet/in.h>")
+endif()
+
+# Check for socklen_t definition
+message (STATUS "Checking whether socklen_t is defined")
+
+check_c_source_compiles (
+ "${PLIBSYS_SOCKET_INCLUDES}
+ int main () {
+ socklen_t len = sizeof (socklen_t);
+ return len > 0 ? 0 : -1;
+ }"
+ PLIBSYS_HAS_SOCKLEN_T
+ )
+
+if (PLIBSYS_HAS_SOCKLEN_T)
+ message (STATUS "Checking whether socklen_t is defined - yes")
+ list (APPEND PLIBSYS_COMPILE_DEFS -DPLIBSYS_HAS_SOCKLEN_T)
+else()
+ message (STATUS "Checking whether socklen_t is defined - no")
+endif()
+
+# Check for sockaddr_storage structure
+message (STATUS "Checking whether struct sockaddr_storage is defined")
+
+check_c_source_compiles (
+ "${PLIBSYS_SOCKET_INCLUDES}
+ int main () {
+ struct sockaddr_storage sock_addr;
+ sock_addr.ss_family = AF_INET;
+
+ return 0;
+ }"
+ PLIBSYS_HAS_SOCKADDR_STORAGE
+ )
+
+if (PLIBSYS_HAS_SOCKADDR_STORAGE)
+ message (STATUS "Checking whether struct sockaddr_storage is defined - yes")
+ list (APPEND PLIBSYS_COMPILE_DEFS -DPLIBSYS_HAS_SOCKADDR_STORAGE)
+else()
+ message (STATUS "Checking whether struct sockaddr_storage is defined - no")
+endif()
+
+# Check sa_len field in struct sockaddr
+message (STATUS "Checking whether struct sockaddr has sa_len")
+
+check_c_source_compiles (
+ "${PLIBSYS_SOCKET_INCLUDES}
+ int main () {
+ struct sockaddr sock_addr;
+ sock_addr.sa_len = 0;
+
+ return 0;
+ }"
+ PLIBSYS_SOCKADDR_HAS_SA_LEN
+ )
+
+if (PLIBSYS_SOCKADDR_HAS_SA_LEN)
+ message (STATUS "Checking whether struct sockaddr has sa_len - yes")
+ list (APPEND PLIBSYS_COMPILE_DEFS -DPLIBSYS_SOCKADDR_HAS_SA_LEN)
+else()
+ message (STATUS "Checking whether struct sockaddr has sa_len - no")
+endif()
+
+# Check sin6_scope_id field in struct sockaddr_in6
+message (STATUS "Checking whether struct sockaddr_in6 has sin6_scope_id")
+
+check_c_source_compiles (
+ "${PLIBSYS_SOCKET_INCLUDES}
+ int main () {
+ struct sockaddr_in6 sock_addr;
+ sock_addr.sin6_scope_id = 0;
+
+ return 0;
+ }"
+ PLIBSYS_SOCKADDR_IN6_HAS_SCOPEID
+ )
+
+if (PLIBSYS_SOCKADDR_IN6_HAS_SCOPEID)
+ message (STATUS "Checking whether struct sockaddr_in6 has sin6_scope_id - yes")
+ list (APPEND PLIBSYS_COMPILE_DEFS -DPLIBSYS_SOCKADDR_IN6_HAS_SCOPEID)
+else()
+ message (STATUS "Checking whether struct sockaddr_in6 has sin6_scope_id - no")
+endif()
+
+# Check sin6_flowinfo field in struct sockaddr_in6
+message (STATUS "Checking whether struct sockaddr_in6 has sin6_flowinfo")
+
+check_c_source_compiles (
+ "${PLIBSYS_SOCKET_INCLUDES}
+ int main () {
+ struct sockaddr_in6 sock_addr;
+ sock_addr.sin6_flowinfo = 0;
+
+ return 0;
+ }"
+ PLIBSYS_SOCKADDR_IN6_HAS_FLOWINFO
+ )
+
+if (PLIBSYS_SOCKADDR_IN6_HAS_FLOWINFO)
+ message (STATUS "Checking whether struct sockaddr_in6 has sin6_flowinfo - yes")
+ list (APPEND PLIBSYS_COMPILE_DEFS -DPLIBSYS_SOCKADDR_IN6_HAS_FLOWINFO)
+else()
+ message (STATUS "Checking whether struct sockaddr_in6 has sin6_flowinfo - no")
+endif()
+
+# Check sa_family_t type size in struct sockaddr
+set (CMAKE_EXTRA_INCLUDE_FILES_OLD ${CMAKE_EXTRA_INCLUDE_FILES})
+
+if (PLIBSYS_NATIVE_WINDOWS)
+ set (CMAKE_EXTRA_INCLUDE_FILES
+ winsock2.h
+ ws2tcpip.h
+ windows.h
+ )
+else()
+ set (CMAKE_EXTRA_INCLUDE_FILES
+ sys/types.h
+ sys/socket.h
+ netinet/in.h
+ )
+endif()
+
+check_type_size ("((struct sockaddr *) 0)->sa_family" PLIBSYS_SIZEOF_SAFAMILY_T LANGUAGE C)
+
+set (CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_EXTRA_INCLUDE_FILES_OLD})
+
+# Check for lldiv() call
+message (STATUS "Checking whether lldiv() presents")
+
+check_c_source_compiles (
+ "#define __USE_ISOC99
+ #include <stdlib.h>
+ int main () {
+ lldiv_t res = lldiv (100LL, 13LL);
+ res.quot = 0;
+ res.rem = 0;
+
+ return 0;
+ }"
+ PLIBSYS_HAS_LLDIV
+ )
+
+if (PLIBSYS_HAS_LLDIV)
+ message (STATUS "Checking whether lldiv() presents - yes")
+ list (APPEND PLIBSYS_COMPILE_DEFS -DPLIBSYS_HAS_LLDIV)
+else()
+ message (STATUS "Checking whether lldiv() presents - no")
+endif()
+
+# Symbols visibility attributes
+if (PLIBSYS_VISIBILITY)
+ message (STATUS "Checking whether compiler supports visibility")
+ plibsys_detect_visibility (PLIBSYS_VISIBILITY_CFLAGS PLIBSYS_VISIBILITY_LDFLAGS)
+
+ if (NOT PLIBSYS_VISIBILITY_CFLAGS AND NOT PLIBSYS_VISIBILITY_LDFLAGS)
+ message (STATUS "Checking whether compiler supports visibility - no")
+ set (PLIBSYS_VISIBILITY OFF)
+ else()
+ message (STATUS "Checking whether compiler supports visibility - yes")
+
+ if (PLIBSYS_VISIBILITY_CFLAGS)
+ list (APPEND PLIBSYS_PLATFORM_CFLAGS ${PLIBSYS_VISIBILITY_CFLAGS})
+ endif()
+
+ if (PLIBSYS_VISIBILITY_LDFLAGS)
+ list (APPEND PLIBSYS_PLATFORM_LDFLAGS ${PLIBSYS_VISIBILITY_LDFLAGS})
+ endif()
+ endif()
+endif()
+
+# Variable arguments
+check_include_file ("stdarg.h" PLIBSYS_HAVE_STDARG_H)
+
+if (NOT PLIBSYS_HAVE_STDARG_H)
+ message (FATAL_ERROR "Support for <stdarg.h> is required for target plarform, not found")
+endif()
+
+plibsys_detect_va_copy (PLIBSYS_VA_COPY)
+
+configure_file (${CMAKE_CURRENT_SOURCE_DIR}/plibsysconfig.h.in ${CMAKE_BINARY_DIR}/plibsysconfig.h)
+
+# Restore compiler flags
+set (CMAKE_REQUIRED_DEFINITIONS ${SAVED_CMAKE_REQUIRED_DEFINITIONS})
+set (CMAKE_REQUIRED_LIBRARIES ${SAVED_CMAKE_REQUIRED_LIBRARIES})
+set (SAVED_CMAKE_REQUIRED_FLAGS ${SAVED_CMAKE_REQUIRED_FLAGS})
+
+# Disable useless warnings
+if (MSVC)
+ list (APPEND PLIBSYS_COMPILE_DEFS -D_CRT_SECURE_NO_WARNINGS)
+ list (APPEND PLIBSYS_COMPILE_DEFS -D_WINSOCK_DEPRECATED_NO_WARNINGS)
+endif()
+
+# Prepare compile definitions
+list (APPEND PLIBSYS_COMPILE_DEFS -DPLIBSYS_COMPILATION)
+
+if (PLIBSYS_PLATFORM_DEFINES)
+ list (APPEND PLIBSYS_COMPILE_DEFS ${PLIBSYS_PLATFORM_DEFINES})
+endif()
+
+# Add targets
+add_library (plibsys SHARED ${PLIBSYS_SRCS} ${PLIBSYS_PLATFORM_SRCS} ${PLIBSYS_PUBLIC_HDRS} ${PLIBSYS_PRIVATE_HDRS})
+
+if (PLIBSYS_BUILD_STATIC)
+ add_library (plibsysstatic STATIC ${PLIBSYS_SRCS} ${PLIBSYS_PLATFORM_SRCS} ${PLIBSYS_PUBLIC_HDRS} ${PLIBSYS_PRIVATE_HDRS})
+endif()
+
+# Add include directories
+if (COMMAND target_include_directories)
+ target_include_directories (plibsys PUBLIC ${PLIBSYS_INCLUDE_DIRS})
+
+ if (PLIBSYS_BUILD_STATIC)
+ target_include_directories (plibsysstatic PUBLIC ${PLIBSYS_INCLUDE_DIRS})
+ endif()
+else()
+ include_directories (${PLIBSYS_INCLUDE_DIRS})
+endif()
+
+# Add compile definitions
+if (COMMAND target_compile_definitions)
+ target_compile_definitions (plibsys PRIVATE ${PLIBSYS_COMPILE_DEFS})
+
+ if (PLIBSYS_BUILD_STATIC)
+ target_compile_definitions (plibsysstatic PRIVATE ${PLIBSYS_COMPILE_DEFS})
+ endif()
+else()
+ add_definitions (${PLIBSYS_COMPILE_DEFS})
+endif()
+
+set_target_properties (plibsys PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_DIR})
+set_target_properties (plibsys PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${OUTPUT_DIR})
+set_target_properties (plibsys PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${OUTPUT_DIR})
+
+# OpenBSD uses a bit different library versioning
+if (PLIBSYS_TARGET_OS STREQUAL openbsd)
+ set (PLIBSYS_SOVERSION ${PLIBSYS_VERSION_MAJOR}.${PLIBSYS_VERSION_MINOR})
+endif()
+
+if (NOT PLIBSYS_TARGET_OS STREQUAL os2 AND NOT PLIBSYS_TARGET_OS STREQUAL amigaos)
+ set_target_properties (plibsys PROPERTIES SOVERSION ${PLIBSYS_SOVERSION})
+endif()
+
+if (PLIBSYS_BUILD_STATIC)
+ set_target_properties (plibsysstatic PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${OUTPUT_DIR})
+
+ if (NOT PLIBSYS_TARGET_OS STREQUAL os2)
+ set_target_properties (plibsysstatic PROPERTIES SOVERSION ${PLIBSYS_SOVERSION})
+ endif()
+endif()
+
+if (PLIBSYS_PLATFORM_CFLAGS)
+ foreach (PLATFORM_CFLAG ${PLIBSYS_PLATFORM_CFLAGS})
+ set (PLIBSYS_PLATFORM_CFLAGS_STR "${PLIBSYS_PLATFORM_CFLAGS_STR} ${PLATFORM_CFLAG}")
+ endforeach()
+
+ set_target_properties (plibsys PROPERTIES COMPILE_FLAGS "${PLIBSYS_PLATFORM_CFLAGS_STR}")
+
+ if (PLIBSYS_BUILD_STATIC)
+ set_target_properties (plibsysstatic PROPERTIES COMPILE_FLAGS "${PLIBSYS_PLATFORM_CFLAGS_STR}")
+ endif()
+endif()
+
+if (PLIBSYS_PLATFORM_LDFLAGS)
+ foreach (PLATFORM_LDFLAG ${PLIBSYS_PLATFORM_LDFLAGS})
+ set (PLIBSYS_PLATFORM_LDFLAGS_STR "${PLIBSYS_PLATFORM_LDFLAGS_STR} ${PLATFORM_LDFLAG}")
+ endforeach()
+
+ set_target_properties (plibsys PROPERTIES LINK_FLAGS "${PLIBSYS_PLATFORM_LDFLAGS_STR}")
+
+ if (PLIBSYS_BUILD_STATIC)
+ set_target_properties (plibsysstatic PROPERTIES LINK_FLAGS "${PLIBSYS_PLATFORM_LDFLAGS_STR}")
+ endif()
+endif()
+
+target_link_libraries (plibsys ${PLIBSYS_PLATFORM_LINK_LIBRARIES})
+
+if (PLIBSYS_BUILD_STATIC)
+ target_link_libraries (plibsysstatic ${PLIBSYS_PLATFORM_LINK_LIBRARIES})
+endif()
+
+if (PLIBSYS_BUILD_STATIC)
+ set (PLIBSYS_INSTALL_TARGETS plibsys plibsysstatic)
+else()
+ set (PLIBSYS_INSTALL_TARGETS plibsys)
+endif()
+
+if (PLIBSYS_NATIVE_WINDOWS)
+ install (TARGETS ${PLIBSYS_INSTALL_TARGETS}
+ DESTINATION lib
+ RUNTIME DESTINATION lib
+ COMPONENT Core
+ )
+
+ if (NOT DEFINED CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS)
+ set (CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS TRUE)
+ endif()
+
+ set (CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE)
+ include (InstallRequiredSystemLibraries)
+
+ install (PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS}
+ DESTINATION lib
+ COMPONENT Core
+ )
+endif()
+
+# Prepare installation dirs
+if (NOT CMAKE_INSTALL_LIBDIR)
+ set (CMAKE_INSTALL_LIBDIR "lib")
+endif()
+
+if (NOT CMAKE_INSTALL_INCLUDEDIR)
+ set (CMAKE_INSTALL_INCLUDEDIR "include")
+endif()
+
+install (TARGETS ${PLIBSYS_INSTALL_TARGETS} EXPORT plibsys-targets
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ COMPONENT Core
+)
+install (TARGETS ${PLIBSYS_INSTALL_TARGETS}
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ COMPONENT Core
+)
+install (FILES
+ ${PLIBSYS_PUBLIC_HDRS}
+ ${CMAKE_BINARY_DIR}/plibsysconfig.h
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/plibsys
+ COMPONENT Core
+)
+
+if (PLIBSYS_VA_COPY)
+ set(PLIBSYS_VA_COPY_STATUS "YES")
+else()
+ set(PLIBSYS_VA_COPY_STATUS "NO")
+endif()
+
+if (PLIBSYS_OS_BITS STREQUAL "universal")
+ set (PLIBSYS_ADDRESS_MODEL "universal")
+else()
+ set (PLIBSYS_ADDRESS_MODEL "${PLIBSYS_OS_BITS} bit")
+endif()
+
+# Print summary
+SET (PLIBSYS_SUMMARY
+"
+ == Build configuration ==
+
+ Platfrom: ${PLIBSYS_TARGET_OS}
+ Compiler: ${PLIBSYS_C_COMPILER}
+ Address model: ${PLIBSYS_ADDRESS_MODEL}
+
+ Thread model: ${PLIBSYS_THREAD_MODEL}
+ RW lock model: ${PLIBSYS_RWLOCK_MODEL}
+ IPC model: ${PLIBSYS_IPC_MODEL}
+ DIR model: ${PLIBSYS_DIR_MODEL}
+ Library loader model: ${PLIBSYS_LIBRARYLOADER_MODEL}
+ Time profiler model: ${PLIBSYS_TIME_PROFILER_MODEL}
+ Atomic model: ${PLIBSYS_ATOMIC_MODEL}
+
+ Platform defines: ${PLIBSYS_PLATFORM_DEFINES}
+ Platform CFLAGS: ${PLIBSYS_PLATFORM_CFLAGS}
+ Platform LDFLAGS: ${PLIBSYS_PLATFORM_LDFLAGS}
+ Platform libraries: ${PLIBSYS_PLATFORM_LINK_LIBRARIES}
+
+ Build static library: ${PLIBSYS_BUILD_STATIC}
+ Build tests: ${PLIBSYS_TESTS}
+ Coverage support: ${PLIBSYS_COVERAGE}
+ Visibility: ${PLIBSYS_VISIBILITY}
+
+ va_copy availability: ${PLIBSYS_VA_COPY_STATUS}
+
+")
+
+message ("${PLIBSYS_SUMMARY}")