+include(CheckCXXSourceCompiles)
+
+set(boost_atomic_sources src/lock_pool.cpp)
+
+set(CMAKE_REQUIRED_INCLUDES "${CMAKE_CURRENT_SOURCE_DIR}/../..")
+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 "${CMAKE_CURRENT_SOURCE_DIR}/../..")
+ 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 "${CMAKE_CURRENT_SOURCE_DIR}/../..")
+ 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_ops_windows.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 "${CMAKE_CURRENT_SOURCE_DIR}/../..")
+ set(CMAKE_REQUIRED_LIBRARIES synchronization)
+ check_cxx_source_compiles("#include <${CMAKE_CURRENT_SOURCE_DIR}/config/has_synchronization.cpp>" BOOST_ATOMIC_HAS_SYNCHRONIZATION)
+ unset(CMAKE_REQUIRED_LIBRARIES)
+ unset(CMAKE_REQUIRED_INCLUDES)
+endif()
+
+add_library(boost_atomic ${boost_atomic_sources})