From 60891f31bb3f167497237e963b142fa777eecb50 Mon Sep 17 00:00:00 2001 From: Maxim Sharabayko Date: Tue, 28 Sep 2021 14:53:02 +0200 Subject: [PATCH] [core] Fixed 'atomic' linking for iOS target (#2137) Co-authored-by: Jose Santiago --- CMakeLists.txt | 20 +++++++------ scripts/CheckCXXAtomic.cmake | 12 +++++--- scripts/CheckGCCAtomicIntrinsics.cmake | 40 ++++---------------------- scripts/FindPThreadGetSetName.cmake | 13 ++++----- scripts/UnSetVariableFull.cmake | 27 ----------------- 5 files changed, 30 insertions(+), 82 deletions(-) delete mode 100644 scripts/UnSetVariableFull.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index d1e7929e1..7200491df 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -418,8 +418,6 @@ endif() # HAVE_LIBATOMIC # HAVE_GCCATOMIC_INTRINSICS # HAVE_GCCATOMIC_INTRINSICS_REQUIRES_LIBATOMIC -# HAVE_GCCATOMIC_INTRINSICS_STATIC -# HAVE_GCCATOMIC_INTRINSICS_STATIC_REQUIRES_LIBATOMIC include(CheckGCCAtomicIntrinsics) CheckGCCAtomicIntrinsics() # HAVE_CXX_ATOMIC @@ -887,7 +885,7 @@ if (srt_libspec_shared) endif() if (MICROSOFT) target_link_libraries(${TARGET_srt}_shared PRIVATE ws2_32.lib) - if (OPENSSL_USE_STATIC_LIBS) + if (OPENSSL_USE_STATIC_LIBS) target_link_libraries(${TARGET_srt}_shared PRIVATE crypt32.lib) else() set_target_properties(${TARGET_srt}_shared PROPERTIES LINK_FLAGS "/DELAYLOAD:libeay32.dll") @@ -925,7 +923,7 @@ if (srt_libspec_static) endif() if (MICROSOFT) target_link_libraries(${TARGET_srt}_static PRIVATE ws2_32.lib) - if (OPENSSL_USE_STATIC_LIBS) + if (OPENSSL_USE_STATIC_LIBS) target_link_libraries(${TARGET_srt}_static PRIVATE crypt32.lib) endif() elseif (MINGW) @@ -938,8 +936,8 @@ endif() target_include_directories(srt_virtual PRIVATE ${SSL_INCLUDE_DIRS}) -if (MICROSOFT) - if (OPENSSL_USE_STATIC_LIBS) +if (MICROSOFT) + if (OPENSSL_USE_STATIC_LIBS) set (SRT_LIBS_PRIVATE ${SRT_LIBS_PRIVATE} ws2_32.lib crypt32.lib) else() set (SRT_LIBS_PRIVATE ${SRT_LIBS_PRIVATE} ws2_32.lib) @@ -983,9 +981,13 @@ endif() # Required by some toolchains when statically linking this library if the # GCC Atomic Intrinsics are being used. -if (HAVE_GCCATOMIC_INTRINSICS - AND HAVE_LIBATOMIC) - target_link_libraries(${TARGET_srt}_static PUBLIC atomic) +if (HAVE_GCCATOMIC_INTRINSICS_REQUIRES_LIBATOMIC AND HAVE_LIBATOMIC) + if (srt_libspec_static) + target_link_libraries(${TARGET_srt}_static PUBLIC atomic) + endif() + if (srt_libspec_shared) + target_link_libraries(${TARGET_srt}_shared PUBLIC atomic) + endif() endif() # Cygwin installs the *.dll libraries in bin directory and uses PATH. diff --git a/scripts/CheckCXXAtomic.cmake b/scripts/CheckCXXAtomic.cmake index 8c2d141a1..d3a3b9e71 100644 --- a/scripts/CheckCXXAtomic.cmake +++ b/scripts/CheckCXXAtomic.cmake @@ -15,12 +15,11 @@ include(CheckCXXSourceCompiles) include(CheckLibraryExists) -include(UnSetVariableFull) function(CheckCXXAtomic) - UnSetVariableFull(HAVE_CXX_ATOMIC) - UnSetVariableFull(HAVE_CXX_ATOMIC_STATIC) + unset(HAVE_CXX_ATOMIC CACHE) + unset(HAVE_CXX_ATOMIC_STATIC CACHE) unset(CMAKE_REQUIRED_FLAGS) unset(CMAKE_REQUIRED_LIBRARIES) @@ -45,7 +44,12 @@ function(CheckCXXAtomic) HAVE_CXX_ATOMIC) if(HAVE_CXX_ATOMIC) - set(CMAKE_REQUIRED_LINK_OPTIONS "-static") + # CMAKE_REQUIRED_LINK_OPTIONS was introduced in CMake 3.14. + if(CMAKE_VERSION VERSION_LESS "3.14") + set(CMAKE_REQUIRED_LINK_OPTIONS "-static") + else() + set(CMAKE_REQUIRED_FLAGS "-std=c++11 -static") + endif() check_cxx_source_compiles( "${CheckCXXAtomic_CODE}" HAVE_CXX_ATOMIC_STATIC) diff --git a/scripts/CheckGCCAtomicIntrinsics.cmake b/scripts/CheckGCCAtomicIntrinsics.cmake index 8af1bd091..9429db12f 100644 --- a/scripts/CheckGCCAtomicIntrinsics.cmake +++ b/scripts/CheckGCCAtomicIntrinsics.cmake @@ -13,8 +13,6 @@ # HAVE_LIBATOMIC # HAVE_GCCATOMIC_INTRINSICS # HAVE_GCCATOMIC_INTRINSICS_REQUIRES_LIBATOMIC -# HAVE_GCCATOMIC_INTRINSICS_STATIC -# HAVE_GCCATOMIC_INTRINSICS_STATIC_REQUIRES_LIBATOMIC # # See # https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html @@ -22,15 +20,12 @@ include(CheckCSourceCompiles) include(CheckLibraryExists) -include(UnSetVariableFull) function(CheckGCCAtomicIntrinsics) - UnSetVariableFull(HAVE_LIBATOMIC) - UnSetVariableFull(HAVE_GCCATOMIC_INTRINSICS) - UnSetVariableFull(HAVE_GCCATOMIC_INTRINSICS_REQUIRES_LIBATOMIC) - UnSetVariableFull(HAVE_GCCATOMIC_INTRINSICS_STATIC) - UnSetVariableFull(HAVE_GCCATOMIC_INTRINSICS_STATIC_REQUIRES_LIBATOMIC) + unset(HAVE_LIBATOMIC CACHE) + unset(HAVE_GCCATOMIC_INTRINSICS CACHE) + unset(HAVE_GCCATOMIC_INTRINSICS_REQUIRES_LIBATOMIC CACHE) unset(CMAKE_REQUIRED_FLAGS) unset(CMAKE_REQUIRED_LIBRARIES) @@ -54,12 +49,12 @@ function(CheckGCCAtomicIntrinsics) check_library_exists( atomic __atomic_fetch_add_8 "" HAVE_LIBATOMIC) + set(CMAKE_TRY_COMPILE_TARGET_TYPE EXECUTABLE) # CMake 3.6 check_c_source_compiles( "${CheckGCCAtomicIntrinsics_CODE}" HAVE_GCCATOMIC_INTRINSICS) - if (NOT HAVE_GCCATOMIC_INTRINSICS - AND HAVE_LIBATOMIC) + if (NOT HAVE_GCCATOMIC_INTRINSICS AND HAVE_LIBATOMIC) set(CMAKE_REQUIRED_LIBRARIES "atomic") check_c_source_compiles( "${CheckGCCAtomicIntrinsics_CODE}" @@ -69,29 +64,4 @@ function(CheckGCCAtomicIntrinsics) endif() endif() - unset(CMAKE_REQUIRED_FLAGS) - unset(CMAKE_REQUIRED_LIBRARIES) - unset(CMAKE_REQUIRED_LINK_OPTIONS) - - if (HAVE_GCCATOMIC_INTRINSICS) - set(CMAKE_REQUIRED_LINK_OPTIONS "-static") - check_c_source_compiles( - "${CheckGCCAtomicIntrinsics_CODE}" - HAVE_GCCATOMIC_INTRINSICS_STATIC) - if (NOT HAVE_GCCATOMIC_INTRINSICS_STATIC - AND HAVE_LIBATOMIC) - set(CMAKE_REQUIRED_LIBRARIES "atomic") - check_c_source_compiles( - "${CheckGCCAtomicIntrinsics_CODE}" - HAVE_GCCATOMIC_INTRINSICS_STATIC) - if (HAVE_GCCATOMIC_INTRINSICS_STATIC) - set(HAVE_GCCATOMIC_INTRINSICS_STATIC_REQUIRES_LIBATOMIC TRUE PARENT_SCOPE) - endif() - endif() - endif() - - unset(CMAKE_REQUIRED_FLAGS) - unset(CMAKE_REQUIRED_LIBRARIES) - unset(CMAKE_REQUIRED_LINK_OPTIONS) - endfunction(CheckGCCAtomicIntrinsics) diff --git a/scripts/FindPThreadGetSetName.cmake b/scripts/FindPThreadGetSetName.cmake index c78bca2be..65685e1eb 100644 --- a/scripts/FindPThreadGetSetName.cmake +++ b/scripts/FindPThreadGetSetName.cmake @@ -27,14 +27,13 @@ # add_definitions(-DHAVE_PTHREAD_SETNAME_NP=1) include(CheckSymbolExists) -include(UnSetVariableFull) function(FindPThreadGetSetName) - UnSetVariableFull(HAVE_PTHREAD_GETNAME_NP_IN_PTHREAD_NP_H) - UnSetVariableFull(HAVE_PTHREAD_SETNAME_NP_IN_PTHREAD_NP_H) - UnSetVariableFull(HAVE_PTHREAD_GETNAME_NP) - UnSetVariableFull(HAVE_PTHREAD_SETNAME_NP) + unset(HAVE_PTHREAD_GETNAME_NP_IN_PTHREAD_NP_H CACHE) + unset(HAVE_PTHREAD_SETNAME_NP_IN_PTHREAD_NP_H CACHE) + unset(HAVE_PTHREAD_GETNAME_NP CACHE) + unset(HAVE_PTHREAD_SETNAME_NP CACHE) set(CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE -D_DARWIN_C_SOURCE -D_POSIX_SOURCE=1) @@ -55,11 +54,11 @@ function(FindPThreadGetSetName) message(STATUS "Checking for pthread_(g/s)etname_np in 'pthread.h':") check_symbol_exists(pthread_getname_np "pthread.h" HAVE_PTHREAD_GETNAME_NP) if (HAVE_PTHREAD_GETNAME_NP_IN_PTHREAD_NP_H) - set(HAVE_PTHREAD_GETNAME_NP TRUE PARENT_SCOPE) + set(HAVE_PTHREAD_GETNAME_NP 1 CACHE INTERNAL "" FORCE) endif() check_symbol_exists(pthread_setname_np "pthread.h" HAVE_PTHREAD_SETNAME_NP) if (HAVE_PTHREAD_SETNAME_NP_IN_PTHREAD_NP_H) - set(HAVE_PTHREAD_SETNAME_NP TRUE PARENT_SCOPE) + set(HAVE_PTHREAD_SETNAME_NP 1 CACHE INTERNAL "" FORCE) endif() if (HAVE_PTHREAD_GETNAME_NP) add_definitions(-DHAVE_PTHREAD_GETNAME_NP=1) diff --git a/scripts/UnSetVariableFull.cmake b/scripts/UnSetVariableFull.cmake deleted file mode 100644 index f751374ee..000000000 --- a/scripts/UnSetVariableFull.cmake +++ /dev/null @@ -1,27 +0,0 @@ -# -# SRT - Secure, Reliable, Transport -# Copyright (c) 2021 Haivision Systems Inc. -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# - -# Notes: -# -# Macro that UnSets a variable in Cache, Local Scope, and Parent Scope. -# -# Usage: -# -# UnSetVariableFull() - -macro(UnSetVariableFull tVariable) - unset(tVariable) - unset(tVariable CACHE) - # unset(.... PARENT_SCOPE) was introduced in cmake-3.0.2. - if ("${CMAKE_VERSION}" VERSION_LESS "3.0.2") - set(tVariable "" PARENT_SCOPE) - else() - unset(tVariable PARENT_SCOPE) - endif() -endmacro()