forked from etc/pineapple-src
138 lines
5.2 KiB
Text
138 lines
5.2 KiB
Text
|
# Copyright 2018 Mike Dev
|
||
|
# Copyright 2019 Peter Dimov
|
||
|
# Copyright 2020-2022 Andrey Semashev
|
||
|
# Distributed under the Boost Software License, Version 1.0.
|
||
|
# See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt
|
||
|
|
||
|
cmake_minimum_required(VERSION 3.5...3.16)
|
||
|
project(boost_atomic VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
|
||
|
|
||
|
include(CheckCXXSourceCompiles)
|
||
|
|
||
|
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||
|
find_package(Threads REQUIRED)
|
||
|
|
||
|
# Note: We can't use the Boost::library targets in the configure checks as they may not yet be included
|
||
|
# by the superproject when this CMakeLists.txt is included. We also don't want to hardcode include paths
|
||
|
# of the needed libraries and their dependencies, recursively, as this is too fragile and requires maintenance.
|
||
|
# Instead, we collect include paths of all libraries and use them in the configure checks. This works faster
|
||
|
# if there is a unified Boost include tree in the filesystem (i.e. if `b2 headers` was run or we're in the
|
||
|
# official monolithic Boost distribution tree).
|
||
|
include(cmake/BoostLibraryIncludes.cmake)
|
||
|
|
||
|
set(boost_atomic_sources src/lock_pool.cpp)
|
||
|
|
||
|
set(CMAKE_REQUIRED_INCLUDES ${BOOST_LIBRARY_INCLUDES})
|
||
|
check_cxx_source_compiles("#include <${CMAKE_CURRENT_SOURCE_DIR}/../config/checks/architecture/x86.cpp>\nint main() {}" BOOST_ATOMIC_TARGET_X86)
|
||
|
unset(CMAKE_REQUIRED_INCLUDES)
|
||
|
|
||
|
if (BOOST_ATOMIC_TARGET_X86)
|
||
|
if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||
|
if (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||
|
set(boost_atomic_sse2_cflags "/arch:SSE2")
|
||
|
set(boost_atomic_sse41_cflags "/arch:SSE2")
|
||
|
endif()
|
||
|
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
|
||
|
if (WIN32)
|
||
|
set(boost_atomic_sse2_cflags "/QxSSE2")
|
||
|
set(boost_atomic_sse41_cflags "/QxSSE4.1")
|
||
|
else()
|
||
|
set(boost_atomic_sse2_cflags "-xSSE2")
|
||
|
set(boost_atomic_sse41_cflags "-xSSE4.1")
|
||
|
endif()
|
||
|
else()
|
||
|
set(boost_atomic_sse2_cflags "-msse -msse2")
|
||
|
set(boost_atomic_sse41_cflags "-msse -msse2 -msse3 -mssse3 -msse4.1")
|
||
|
endif()
|
||
|
|
||
|
set(CMAKE_REQUIRED_INCLUDES ${BOOST_LIBRARY_INCLUDES})
|
||
|
set(CMAKE_REQUIRED_FLAGS "${boost_atomic_sse2_cflags}")
|
||
|
check_cxx_source_compiles("#include <${CMAKE_CURRENT_SOURCE_DIR}/config/has_sse2.cpp>" BOOST_ATOMIC_COMPILER_HAS_SSE2)
|
||
|
unset(CMAKE_REQUIRED_FLAGS)
|
||
|
unset(CMAKE_REQUIRED_INCLUDES)
|
||
|
|
||
|
set(CMAKE_REQUIRED_INCLUDES ${BOOST_LIBRARY_INCLUDES})
|
||
|
set(CMAKE_REQUIRED_FLAGS "${boost_atomic_sse41_cflags}")
|
||
|
check_cxx_source_compiles("#include <${CMAKE_CURRENT_SOURCE_DIR}/config/has_sse41.cpp>" BOOST_ATOMIC_COMPILER_HAS_SSE41)
|
||
|
unset(CMAKE_REQUIRED_FLAGS)
|
||
|
unset(CMAKE_REQUIRED_INCLUDES)
|
||
|
|
||
|
if (BOOST_ATOMIC_COMPILER_HAS_SSE2)
|
||
|
set(boost_atomic_sources_sse2 src/find_address_sse2.cpp)
|
||
|
set_source_files_properties(${boost_atomic_sources_sse2} PROPERTIES COMPILE_FLAGS "${boost_atomic_sse2_cflags}")
|
||
|
set(boost_atomic_sources ${boost_atomic_sources} ${boost_atomic_sources_sse2})
|
||
|
endif()
|
||
|
|
||
|
if (BOOST_ATOMIC_COMPILER_HAS_SSE41)
|
||
|
set(boost_atomic_sources_sse41 src/find_address_sse41.cpp)
|
||
|
set_source_files_properties(${boost_atomic_sources_sse41} PROPERTIES COMPILE_FLAGS "${boost_atomic_sse41_cflags}")
|
||
|
set(boost_atomic_sources ${boost_atomic_sources} ${boost_atomic_sources_sse41})
|
||
|
endif()
|
||
|
endif()
|
||
|
|
||
|
if (WIN32)
|
||
|
set(boost_atomic_sources ${boost_atomic_sources} src/wait_on_address.cpp)
|
||
|
endif()
|
||
|
|
||
|
if (WIN32)
|
||
|
# Note: We can't use the Boost::library targets here as they may not yet be included by the superproject when this CMakeLists.txt is included.
|
||
|
set(CMAKE_REQUIRED_INCLUDES ${BOOST_LIBRARY_INCLUDES})
|
||
|
set(CMAKE_REQUIRED_LIBRARIES synchronization)
|
||
|
check_cxx_source_compiles("#include <${CMAKE_CURRENT_SOURCE_DIR}/config/has_synchronization_lib.cpp>" BOOST_ATOMIC_HAS_SYNCHRONIZATION_LIB)
|
||
|
unset(CMAKE_REQUIRED_LIBRARIES)
|
||
|
unset(CMAKE_REQUIRED_INCLUDES)
|
||
|
endif()
|
||
|
|
||
|
add_library(boost_atomic ${boost_atomic_sources})
|
||
|
add_library(Boost::atomic ALIAS boost_atomic)
|
||
|
|
||
|
target_include_directories(boost_atomic PUBLIC include)
|
||
|
target_include_directories(boost_atomic PRIVATE src)
|
||
|
|
||
|
target_link_libraries(boost_atomic
|
||
|
PUBLIC
|
||
|
Boost::assert
|
||
|
Boost::config
|
||
|
Boost::static_assert
|
||
|
Boost::type_traits
|
||
|
PRIVATE
|
||
|
Boost::align
|
||
|
Boost::predef
|
||
|
Boost::preprocessor
|
||
|
|
||
|
Threads::Threads
|
||
|
)
|
||
|
|
||
|
if (WIN32)
|
||
|
target_link_libraries(boost_atomic
|
||
|
PUBLIC
|
||
|
Boost::winapi
|
||
|
)
|
||
|
|
||
|
if (BOOST_ATOMIC_HAS_SYNCHRONIZATION_LIB)
|
||
|
target_link_libraries(boost_atomic PUBLIC synchronization)
|
||
|
else()
|
||
|
target_compile_definitions(boost_atomic PUBLIC BOOST_ATOMIC_NO_SYNCHRONIZATION_LIB)
|
||
|
endif()
|
||
|
endif()
|
||
|
|
||
|
target_compile_definitions(boost_atomic
|
||
|
PUBLIC
|
||
|
BOOST_ATOMIC_NO_LIB
|
||
|
PRIVATE
|
||
|
BOOST_ATOMIC_SOURCE
|
||
|
)
|
||
|
|
||
|
if (BUILD_SHARED_LIBS)
|
||
|
target_compile_definitions(boost_atomic PUBLIC BOOST_ATOMIC_DYN_LINK)
|
||
|
else()
|
||
|
target_compile_definitions(boost_atomic PUBLIC BOOST_ATOMIC_STATIC_LINK)
|
||
|
endif()
|
||
|
|
||
|
if (BOOST_ATOMIC_COMPILER_HAS_SSE2)
|
||
|
target_compile_definitions(boost_atomic PRIVATE BOOST_ATOMIC_USE_SSE2)
|
||
|
endif()
|
||
|
if (BOOST_ATOMIC_COMPILER_HAS_SSE41)
|
||
|
target_compile_definitions(boost_atomic PRIVATE BOOST_ATOMIC_USE_SSE41)
|
||
|
endif()
|