diff --git a/CMakeLists.txt b/CMakeLists.txt index 0acb9f1..da33719 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,6 +15,8 @@ INCLUDE(GetPrerequisites) INCLUDE( VersionMacros ) INCLUDE( SetupTargetMacros ) INCLUDE(GetGitRevisionDescription) +INCLUDE(CheckLibraryExists) +INCLUDE(CheckLibcxxAtomic) get_git_head_revision(GIT_REFSPEC FC_GIT_REVISION_SHA) get_git_unix_timestamp(FC_GIT_REVISION_UNIX_TIMESTAMP) @@ -159,7 +161,7 @@ IF( WIN32 ) SET(Boost_LIBRARIES ${BOOST_LIBRARIES_TEMP} ${Boost_LIBRARIES}) ENDIF() - set( PLATFORM_SPECIFIC_LIBS wsock32.lib ws2_32.lib userenv.lib) + LIST(APPEND PLATFORM_SPECIFIC_LIBS wsock32.lib ws2_32.lib userenv.lib) # iphlpapi.lib ELSE(WIN32) @@ -186,6 +188,9 @@ IF(NOT "$ENV{OPENSSL_ROOT_DIR}" STREQUAL "") message(STATUS "Setting up OpenSSL root and include vars to ${OPENSSL_ROOT_DIR}, ${OPENSSL_INCLUDE_DIR}") ENDIF() +IF( LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB ) + LIST( APPEND PLATFORM_SPECIFIC_LIBS atomic ) +ENDIF( LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB ) find_package(OpenSSL REQUIRED) @@ -383,7 +388,9 @@ target_include_directories(fc IF(NOT WIN32) set(LINK_USR_LOCAL_LIB -L/usr/local/lib) ENDIF() -target_link_libraries( fc PUBLIC ${LINK_USR_LOCAL_LIB} ${Boost_LIBRARIES} ${OPENSSL_LIBRARIES} ${ZLIB_LIBRARIES} ${PLATFORM_SPECIFIC_LIBS} ${RPCRT4} ${CMAKE_DL_LIBS} ${rt_library} ${editline_libraries} secp256k1 ) +target_link_libraries( fc PUBLIC ${LINK_USR_LOCAL_LIB} ${Boost_LIBRARIES} ${OPENSSL_LIBRARIES} ${ZLIB_LIBRARIES} + ${PLATFORM_SPECIFIC_LIBS} ${RPCRT4} ${CMAKE_DL_LIBS} ${rt_library} + ${editline_libraries} secp256k1 ${CMAKE_REQUIRED_LIBRARIES} ) if(MSVC) set_source_files_properties( src/network/http/websocket.cpp PROPERTIES COMPILE_FLAGS "/bigobj" ) diff --git a/CMakeModules/CheckLibcxxAtomic.cmake b/CMakeModules/CheckLibcxxAtomic.cmake index 596225d..0e55627 100644 --- a/CMakeModules/CheckLibcxxAtomic.cmake +++ b/CMakeModules/CheckLibcxxAtomic.cmake @@ -5,14 +5,10 @@ INCLUDE(CheckCXXSourceCompiles) # Sometimes linking against libatomic is required for atomic ops, if # the platform doesn't support lock-free atomics. -# -# We could modify LLVM's CheckAtomic module and have it check for 64-bit -# atomics instead. However, we would like to avoid careless uses of 64-bit -# atomics inside LLVM over time on 32-bit platforms. function(check_cxx_atomics varname) set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) - set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -nodefaultlibs -std=c++11 -nostdinc++ -isystem ${LIBCXX_SOURCE_DIR}/include") + set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11") if (${LIBCXX_GCC_TOOLCHAIN}) set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} --gcc-toolchain=${LIBCXX_GCC_TOOLCHAIN}") endif() @@ -24,27 +20,24 @@ function(check_cxx_atomics varname) endif() check_cxx_source_compiles(" #include -#include -std::atomic x; -std::atomic y; +#include + +boost::lockfree::queue q; int main(int, char**) { - return x + y; + uint32_t* a; + uint32_t* b; + q.push(a); + q.pop(b); } " ${varname}) set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) endfunction(check_cxx_atomics) -# Perform the check for 64bit atomics without libatomic. It may have been -# added to the required libraries during in the configuration of LLVM, which -# would cause the check for CXX atomics without libatomic to incorrectly pass. -set(OLD_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) -list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES "atomic") +# Perform the check for 64bit atomics without libatomic. check_cxx_atomics(LIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB) -set(CMAKE_REQUIRED_LIBRARIES ${OLD_CMAKE_REQUIRED_LIBRARIES}) - -check_library_exists(atomic __atomic_fetch_add_8 "" LIBCXX_HAS_ATOMIC_LIB) # If not, check if the library exists, and atomics work with it. if(NOT LIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB) + check_library_exists(atomic __atomic_fetch_add_8 "" LIBCXX_HAS_ATOMIC_LIB) if(LIBCXX_HAS_ATOMIC_LIB) list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") check_cxx_atomics(LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB)