summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/context/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/context/CMakeLists.txt')
-rw-r--r--src/boost/libs/context/CMakeLists.txt232
1 files changed, 232 insertions, 0 deletions
diff --git a/src/boost/libs/context/CMakeLists.txt b/src/boost/libs/context/CMakeLists.txt
new file mode 100644
index 000000000..f2c70e901
--- /dev/null
+++ b/src/boost/libs/context/CMakeLists.txt
@@ -0,0 +1,232 @@
+# Copyright 2020, 2021 Peter Dimov
+# Distributed under the Boost Software License, Version 1.0.
+# https://www.boost.org/LICENSE_1_0.txt
+
+cmake_minimum_required(VERSION 3.5...3.16)
+
+project(boost_context VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
+
+# Build features
+
+## Binary format
+
+if(WIN32)
+ set(_default_binfmt pe)
+elseif(APPLE)
+ set(_default_binfmt mach-o)
+else()
+ set(_default_binfmt elf)
+endif()
+
+set(BOOST_CONTEXT_BINARY_FORMAT "${_default_binfmt}" CACHE STRING "Boost.Context binary format (elf, mach-o, pe, xcoff)")
+set_property(CACHE BOOST_CONTEXT_BINARY_FORMAT PROPERTY STRINGS elf mach-o pe xcoff)
+
+unset(_default_binfmt)
+
+## ABI
+
+math(EXPR _bits "${CMAKE_SIZEOF_VOID_P}*8")
+
+if(WIN32)
+ set(_default_abi ms)
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
+ set(_default_abi aapcs)
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips")
+ if(_bits EQUAL 32)
+ set(_default_abi o32)
+ else()
+ set(_default_abi n64)
+ endif()
+else()
+ set(_default_abi sysv)
+endif()
+
+set(BOOST_CONTEXT_ABI "${_default_abi}" CACHE STRING "Boost.Context ABI (aapcs, eabi, ms, n32, n64, o32, o64, sysv, x32)")
+set_property(CACHE BOOST_CONTEXT_ABI PROPERTY STRINGS aapcs eabi ms n32 n64 o32 o64 sysv x32)
+
+unset(_default_abi)
+
+## Arch-and-model
+
+set(_all_archs arm arm64 loongarch64 mips32 mips64 ppc32 ppc64 riscv64 s390x i386 x86_64 combined)
+
+# Try at start to auto determine arch from CMake.
+if(CMAKE_SYSTEM_PROCESSOR IN_LIST _all_archs)
+ set(_default_arch ${CMAKE_SYSTEM_PROCESSOR})
+elseif(_bits EQUAL 32)
+ if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
+ set(_default_arch arm)
+ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips")
+ set(_default_arch mips32)
+ else()
+ set(_default_arch i386)
+ endif()
+else()
+ if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR
+ CMAKE_SYSTEM_PROCESSOR MATCHES "^arm") # armv8
+ set(_default_arch arm64)
+ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips")
+ set(_default_arch mips64)
+ else()
+ set(_default_arch x86_64)
+ endif()
+endif()
+
+set(BOOST_CONTEXT_ARCHITECTURE "${_default_arch}" CACHE STRING "Boost.Context architecture (arm, arm64, loongarch64, mips32, mips64, ppc32, ppc64, riscv64, s390x, i386, x86_64, combined)")
+set_property(CACHE BOOST_CONTEXT_ARCHITECTURE PROPERTY STRINGS ${_all_archs})
+
+unset(_all_archs)
+unset(_bits)
+unset(_default_arch)
+
+## Assembler type
+
+if(MSVC)
+ set(_default_asm masm)
+else()
+ set(_default_asm gas)
+endif()
+
+set(BOOST_CONTEXT_ASSEMBLER "${_default_asm}" CACHE STRING "Boost.Context assembler (masm, gas, armasm)")
+set_property(CACHE BOOST_CONTEXT_ASSEMBLER PROPERTY STRINGS masm gas armasm)
+
+unset(_default_asm)
+
+## Assembler source suffix
+
+if(BOOST_CONTEXT_BINARY_FORMAT STREQUAL pe)
+ set(_default_ext .asm)
+elseif(BOOST_CONTEXT_ASSEMBLER STREQUAL gas)
+ set(_default_ext .S)
+else()
+ set(_default_ext .asm)
+endif()
+
+set(BOOST_CONTEXT_ASM_SUFFIX "${_default_ext}" CACHE STRING "Boost.Context assembler source suffix (.asm, .S)")
+set_property(CACHE BOOST_CONTEXT_ASM_SUFFIX PROPERTY STRINGS .asm .S)
+
+unset(_default_ext)
+
+## Implementation
+
+set(_default_impl fcontext)
+
+set(BOOST_CONTEXT_IMPLEMENTATION "${_default_impl}" CACHE STRING "Boost.Context implementation (fcontext, ucontext, winfib)")
+set_property(CACHE BOOST_CONTEXT_IMPLEMENTATION PROPERTY STRINGS fcontext ucontext winfib)
+
+unset(_default_impl)
+
+#
+
+message(STATUS "Boost.Context: "
+ "architecture ${BOOST_CONTEXT_ARCHITECTURE}, "
+ "binary format ${BOOST_CONTEXT_BINARY_FORMAT}, "
+ "ABI ${BOOST_CONTEXT_ABI}, "
+ "assembler ${BOOST_CONTEXT_ASSEMBLER}, "
+ "suffix ${BOOST_CONTEXT_ASM_SUFFIX}, "
+ "implementation ${BOOST_CONTEXT_IMPLEMENTATION}")
+
+# Enable the right assembler
+
+if(BOOST_CONTEXT_IMPLEMENTATION STREQUAL "fcontext")
+ if(BOOST_CONTEXT_ASSEMBLER STREQUAL gas)
+ if(CMAKE_CXX_PLATFORM_ID MATCHES "Cygwin")
+ enable_language(ASM-ATT)
+ else()
+ enable_language(ASM)
+ endif()
+ else()
+ enable_language(ASM_MASM)
+ endif()
+endif()
+
+# Choose .asm sources
+
+if(BOOST_CONTEXT_BINARY_FORMAT STREQUAL mach-o)
+ set(BOOST_CONTEXT_BINARY_FORMAT macho)
+endif()
+
+set(_asm_suffix ${BOOST_CONTEXT_ARCHITECTURE}_${BOOST_CONTEXT_ABI}_${BOOST_CONTEXT_BINARY_FORMAT}_${BOOST_CONTEXT_ASSEMBLER}${BOOST_CONTEXT_ASM_SUFFIX})
+
+set(ASM_SOURCES
+ src/asm/make_${_asm_suffix}
+ src/asm/jump_${_asm_suffix}
+ src/asm/ontop_${_asm_suffix}
+)
+
+unset(_asm_suffix)
+
+#
+
+if(BOOST_CONTEXT_IMPLEMENTATION STREQUAL "fcontext")
+
+ set(IMPL_SOURCES ${ASM_SOURCES})
+
+ if(BOOST_CONTEXT_ASSEMBLER STREQUAL masm AND BOOST_CONTEXT_ARCHITECTURE STREQUAL i386)
+ set_source_files_properties(${ASM_SOURCES} PROPERTIES COMPILE_FLAGS "/safeseh")
+ endif()
+
+ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+ set_property(SOURCE ${ASM_SOURCES} APPEND PROPERTY COMPILE_OPTIONS "-x" "assembler-with-cpp")
+ endif()
+else()
+ set(IMPL_SOURCES
+ src/continuation.cpp
+ src/fiber.cpp
+ )
+endif()
+
+if(WIN32 AND NOT CMAKE_CXX_PLATFORM_ID MATCHES "Cygwin")
+ set(STACK_TRAITS_SOURCES
+ src/windows/stack_traits.cpp
+ )
+else()
+ set(STACK_TRAITS_SOURCES
+ src/posix/stack_traits.cpp
+ )
+endif()
+
+add_library(boost_context
+ ${IMPL_SOURCES}
+ ${STACK_TRAITS_SOURCES}
+)
+
+add_library(Boost::context ALIAS boost_context)
+
+target_include_directories(boost_context PUBLIC include)
+
+target_link_libraries(boost_context
+ PUBLIC
+ Boost::assert
+ Boost::config
+ Boost::core
+ Boost::mp11
+ Boost::pool
+ Boost::predef
+ Boost::smart_ptr
+)
+
+target_compile_definitions(boost_context
+ PUBLIC BOOST_CONTEXT_NO_LIB
+ PRIVATE BOOST_CONTEXT_SOURCE
+)
+
+if(BUILD_SHARED_LIBS)
+ target_compile_definitions(boost_context PUBLIC BOOST_CONTEXT_DYN_LINK BOOST_CONTEXT_EXPORT=EXPORT)
+else()
+ target_compile_definitions(boost_context PUBLIC BOOST_CONTEXT_STATIC_LINK BOOST_CONTEXT_EXPORT=)
+endif()
+
+if(BOOST_CONTEXT_IMPLEMENTATION STREQUAL "ucontext")
+ target_compile_definitions(boost_context PUBLIC BOOST_USE_UCONTEXT)
+endif()
+
+if(BOOST_CONTEXT_IMPLEMENTATION STREQUAL "winfib")
+ target_compile_definitions(boost_context PUBLIC BOOST_USE_WINFIB)
+endif()
+
+if(BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt")
+
+ add_subdirectory(test)
+
+endif()