diff --git a/CMakeLists.txt b/CMakeLists.txt index d0572f2e9..b00a46295 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,6 +32,7 @@ option(WARNINGS_AS_ERRORS "treat all warnings as errors. turn off for developmen include(cmake/target_link_libraries_system.cmake) include(cmake/add_import_library.cmake) include(cmake/add_log_tag.cmake) +include(cmake/libatomic.cmake) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") diff --git a/cmake/libatomic.cmake b/cmake/libatomic.cmake new file mode 100644 index 000000000..d29155913 --- /dev/null +++ b/cmake/libatomic.cmake @@ -0,0 +1,49 @@ +function(check_working_cxx_atomics64 varname) + set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) + if (EMBEDDED_CFG) + set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -m32 -march=i486") + elseif(MSVC OR MSVC_VERSION) + set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -arch:IA32 -std:c++14") + else() + # CMAKE_CXX_STANDARD does not propagate to cmake compile tests + set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++14") + endif() + check_cxx_source_compiles(" +#include +#include +std::atomic x (0); +int main() { + uint64_t i = x.load(std::memory_order_relaxed); + return 0; +} +" ${varname}) + set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) +endfunction() + +function(link_libatomic) + check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITHOUT_LIB) + + if(HAVE_CXX_ATOMICS64_WITHOUT_LIB) + message(STATUS "Have working 64bit atomics") + return() + endif() + + if (NOT MSVC AND NOT MSVC_VERSION) + check_library_exists(atomic __atomic_load_8 "" HAVE_CXX_LIBATOMICS64) + if (HAVE_CXX_LIBATOMICS64) + message(STATUS "Have 64bit atomics via library") + list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") + check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITH_LIB) + if (HAVE_CXX_ATOMICS64_WITH_LIB) + message(STATUS "Can link with libatomic") + link_libraries(-latomic) + return() + endif() + endif() + endif() + if (MSVC OR MSVC_VERSION) + message(FATAL_ERROR "Host compiler must support 64-bit std::atomic! (What does MSVC do to inline atomics?)") + else() + message(FATAL_ERROR "Host compiler must support 64-bit std::atomic!") + endif() +endfunction() \ No newline at end of file diff --git a/cmake/unix.cmake b/cmake/unix.cmake index 41f9402b8..2c31b1ed5 100644 --- a/cmake/unix.cmake +++ b/cmake/unix.cmake @@ -24,57 +24,13 @@ endif() include_directories(${LIBUV_INCLUDE_DIRS}) -function(check_working_cxx_atomics64 varname) - set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) - if (EMBEDDED_CFG) - set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -m32 -march=i486") - else() - # CMAKE_CXX_STANDARD does not propagate to cmake compile tests - set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++14") - endif() - check_cxx_source_compiles(" -#include -#include -std::atomic x (0); -int main() { - uint64_t i = x.load(std::memory_order_relaxed); - return 0; -} -" ${varname}) - set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) -endfunction() - -function(link_libatomic) - check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITHOUT_LIB) - - if(HAVE_CXX_ATOMICS64_WITHOUT_LIB) - message(STATUS "Have working 64bit atomics") - return() - endif() - - check_library_exists(atomic __atomic_load_8 "" HAVE_CXX_LIBATOMICS64) - if (HAVE_CXX_LIBATOMICS64) - message(STATUS "Have 64bit atomics via library") - list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") - check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITH_LIB) - if (HAVE_CXX_ATOMICS64_WITH_LIB) - message(STATUS "Can link with libatomic") - link_libraries(-latomic) - return() - endif() - endif() - - message(FATAL_ERROR "Host compiler must support 64-bit std::atomic!") -endfunction() - -if(EMBEDDED_CFG) +if(EMBEDDED_CFG OR ${CMAKE_SYSTEM_NAME} MATCHES "Linux") link_libatomic() endif() if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") set(FS_LIB stdc++fs) get_filename_component(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-linux.c ABSOLUTE) - link_libatomic() elseif(${CMAKE_SYSTEM_NAME} MATCHES "Android") find_library(FS_LIB NAMES c++fs c++experimental stdc++fs) if(FS_LIB STREQUAL FS_LIB-NOTFOUND) diff --git a/cmake/win32.cmake b/cmake/win32.cmake index ef6005cc8..ceb3123de 100644 --- a/cmake/win32.cmake +++ b/cmake/win32.cmake @@ -8,48 +8,6 @@ set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) if (MSVC OR MSVC_VERSION) add_compile_options(/EHca /arch:AVX2 /MD) add_definitions(-D_SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING) - # If we're building a lokinet for windows, but need to target ancient hardware - function(check_working_cxx_atomics64 varname) - set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) - set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -arch:IA32") - check_cxx_source_compiles(" - #include - #include - std::atomic x (0); - int main() { - uint64_t i = x.load(std::memory_order_relaxed); - return 0; - } - " ${varname}) - set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) - endfunction() - - function(link_libatomic) - check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITHOUT_LIB) - - if(HAVE_CXX_ATOMICS64_WITHOUT_LIB) - message(STATUS "Have working 64bit atomics") - return() - endif() - -# check_library_exists(atomic __atomic_load_8 "" HAVE_CXX_LIBATOMICS64) -# if (HAVE_CXX_LIBATOMICS64) -# message(STATUS "Have 64bit atomics via library") -# list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") -# check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITH_LIB) -# if (HAVE_CXX_ATOMICS64_WITH_LIB) -# message(STATUS "Can link with libatomic") -# link_libraries(-latomic) -# return() -# endif() -# endif() - message(FATAL_ERROR "Host compiler must support 64-bit std::atomic! (What do, MSVC doesn't emit __atomic_load_x)") - endfunction() - - if(EMBEDDED_CFG) - link_libatomic() - endif() - if(${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang" AND "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC") add_compile_options(-Wno-nonportable-system-include-path) endif() @@ -66,50 +24,13 @@ if(NOT MSVC_VERSION) add_definitions(-DWINVER=0x0500 -D_WIN32_WINNT=0x0500) # Wait a minute, if we're not Microsoft C++, nor a Clang paired with Microsoft C++, # then the only possible option has to be GNU or a GNU-linked Clang! - set(FS_LIB stdc++fs) - # If we're building a lokinet for windows, but need to target ancient hardware - function(check_working_cxx_atomics64 varname) - set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) - set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -march=i486") - check_cxx_source_compiles(" - #include - #include - std::atomic x (0); - int main() { - uint64_t i = x.load(std::memory_order_relaxed); - return 0; - } - " ${varname}) - set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) - endfunction() - - function(link_libatomic) - check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITHOUT_LIB) - - if(HAVE_CXX_ATOMICS64_WITHOUT_LIB) - message(STATUS "Have working 64bit atomics") - return() - endif() - - check_library_exists(atomic __atomic_load_8 "" HAVE_CXX_LIBATOMICS64) - if (HAVE_CXX_LIBATOMICS64) - message(STATUS "Have 64bit atomics via library") - list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") - check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITH_LIB) - if (HAVE_CXX_ATOMICS64_WITH_LIB) - message(STATUS "Can link with libatomic") - link_libraries(-latomic) - return() - endif() - endif() - message(FATAL_ERROR "Host compiler must support 64-bit std::atomic!") - endfunction() - - if(EMBEDDED_CFG) - link_libatomic() - endif() + set(FS_LIB stdc++fs) endif() - + +if(EMBEDDED_CFG) + link_libatomic() +endif() + get_filename_component(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-windows.c ABSOLUTE) get_filename_component(EV_SRC "llarp/ev/ev_win32.cpp" ABSOLUTE) add_definitions(-DWIN32_LEAN_AND_MEAN -DWIN32 -DWINVER=0x0500)