1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00

chore(cmake): add libatomic to target_link_libraries when required

Looks like CMAKE_REQUIRED_LIBRARIES are not automatically linked against.
This commit is contained in:
yangfl 2019-03-27 11:12:52 +08:00
parent 993f6fa5c0
commit 70781bb14f
2 changed files with 20 additions and 32 deletions

View File

@ -683,6 +683,7 @@ add_library(${PROJECT_NAME}_static
${${PROJECT_NAME}_QM_FILES} ${${PROJECT_NAME}_QM_FILES}
${${PROJECT_NAME}_RESOURCES}) ${${PROJECT_NAME}_RESOURCES})
target_link_libraries(${PROJECT_NAME}_static target_link_libraries(${PROJECT_NAME}_static
${CMAKE_REQUIRED_LIBRARIES}
${ALL_LIBRARIES}) ${ALL_LIBRARIES})
add_executable(${PROJECT_NAME} add_executable(${PROJECT_NAME}
@ -692,6 +693,7 @@ add_executable(${PROJECT_NAME}
src/main.cpp) src/main.cpp)
target_link_libraries(${PROJECT_NAME} target_link_libraries(${PROJECT_NAME}
${PROJECT_NAME}_static ${PROJECT_NAME}_static
${CMAKE_REQUIRED_LIBRARIES}
${ALL_LIBRARIES}) ${ALL_LIBRARIES})
include(Testing) include(Testing)

View File

@ -8,7 +8,7 @@ INCLUDE(CheckLibraryExists)
function(check_working_cxx_atomics varname) function(check_working_cxx_atomics varname)
set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
set(CMAKE_REQUIRED_FLAGS "-std=c++11") set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11")
CHECK_CXX_SOURCE_COMPILES(" CHECK_CXX_SOURCE_COMPILES("
#include <atomic> #include <atomic>
std::atomic<int> x; std::atomic<int> x;
@ -34,10 +34,26 @@ int main() {
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
endfunction(check_working_cxx_atomics64) endfunction(check_working_cxx_atomics64)
# Determine if the compiler has GCC-compatible command-line syntax.
if(NOT DEFINED COMPILER_IS_GCC_COMPATIBLE)
if(CMAKE_COMPILER_IS_GNUCXX)
set(COMPILER_IS_GCC_COMPATIBLE ON)
elseif( MSVC )
set(COMPILER_IS_GCC_COMPATIBLE OFF)
elseif( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
set(COMPILER_IS_GCC_COMPATIBLE ON)
elseif( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Intel" )
set(COMPILER_IS_GCC_COMPATIBLE ON)
else()
message(STATUS "Warning: Unknown compiler, assume GCC compatible")
set(COMPILER_IS_GCC_COMPATIBLE ON)
endif()
endif()
# This isn't necessary on MSVC, so avoid command-line switch annoyance # This isn't necessary on MSVC, so avoid command-line switch annoyance
# by only running on GCC-like hosts. # by only running on GCC-like hosts.
if (LLVM_COMPILER_IS_GCC_COMPATIBLE) if (COMPILER_IS_GCC_COMPATIBLE)
# First check if atomics work without the library. # First check if atomics work without the library.
check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB) check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB)
# If not, check if the library exists, and atomics work with it. # If not, check if the library exists, and atomics work with it.
@ -75,33 +91,3 @@ if(NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB)
message(FATAL_ERROR "Host compiler appears to require libatomic, but cannot find it.") message(FATAL_ERROR "Host compiler appears to require libatomic, but cannot find it.")
endif() endif()
endif() endif()
## TODO: This define is only used for the legacy atomic operations in
## llvm's Atomic.h, which should be replaced. Other code simply
## assumes C++11 <atomic> works.
CHECK_CXX_SOURCE_COMPILES("
#ifdef _MSC_VER
#include <Intrin.h> /* Workaround for PR19898. */
#include <windows.h>
#endif
int main() {
#ifdef _MSC_VER
volatile LONG val = 1;
MemoryBarrier();
InterlockedCompareExchange(&val, 0, 1);
InterlockedIncrement(&val);
InterlockedDecrement(&val);
#else
volatile unsigned long val = 1;
__sync_synchronize();
__sync_val_compare_and_swap(&val, 1, 0);
__sync_add_and_fetch(&val, 1);
__sync_sub_and_fetch(&val, 1);
#endif
return 0;
}
" LLVM_HAS_ATOMICS)
if( NOT LLVM_HAS_ATOMICS )
message(STATUS "Warning: LLVM will be built thread-unsafe because atomic builtins are missing")
endif()