# 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.8...3.20)

project(boost_fiber VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)

if(WIN32 AND NOT CMAKE_CXX_PLATFORM_ID MATCHES "Cygwin")
  set(_default_target windows)
elseif(CMAKE_SYSTEM_NAME STREQUAL Linux)
  set(_default_target linux)
else()
  set(_default_target none)
endif()

set(BOOST_FIBER_NUMA_TARGET_OS "${_default_target}" CACHE STRING "Boost.Fiber target OS (aix, freebsd, hpux, linux, solaris, windows, none)")
set_property(CACHE BOOST_FIBER_NUMA_TARGET_OS PROPERTY STRINGS aix freebsd hpux linux solaris windows none)

unset(_default_target)

message(STATUS "Boost.Fiber: NUMA target OS is ${BOOST_FIBER_NUMA_TARGET_OS}")

# boost_fiber

add_library(boost_fiber
  src/algo/algorithm.cpp
  src/algo/round_robin.cpp
  src/algo/shared_work.cpp
  src/algo/work_stealing.cpp
  src/barrier.cpp
  src/condition_variable.cpp
  src/context.cpp
  src/fiber.cpp
  src/future.cpp
  src/mutex.cpp
  src/properties.cpp
  src/recursive_mutex.cpp
  src/recursive_timed_mutex.cpp
  src/scheduler.cpp
  src/timed_mutex.cpp
  src/waker.cpp
)

add_library(Boost::fiber ALIAS boost_fiber)

target_include_directories(boost_fiber PUBLIC include)

target_link_libraries(boost_fiber
  PUBLIC
    Boost::assert
    Boost::config
    Boost::context
    Boost::core
    Boost::intrusive
    Boost::predef
    Boost::smart_ptr
)

target_compile_features(boost_fiber PUBLIC cxx_std_11)

target_compile_definitions(boost_fiber
  PUBLIC BOOST_FIBER_NO_LIB
  PRIVATE BOOST_FIBER_SOURCE BOOST_FIBERS_SOURCE
)

if(BUILD_SHARED_LIBS)
  target_compile_definitions(boost_fiber PUBLIC BOOST_FIBER_DYN_LINK BOOST_FIBERS_DYN_LINK)
else()
  target_compile_definitions(boost_fiber PUBLIC BOOST_FIBER_STATIC_LINK)
endif()

# boost_fiber_numa

if(BOOST_FIBER_NUMA_TARGET_OS STREQUAL none)
  set(NUMA_SOURCES
    src/numa/pin_thread.cpp
    src/numa/topology.cpp
  )
else()
  set(NUMA_SOURCES
    src/numa/${BOOST_FIBER_NUMA_TARGET_OS}/pin_thread.cpp
    src/numa/${BOOST_FIBER_NUMA_TARGET_OS}/topology.cpp
  )
endif()

add_library(boost_fiber_numa
  ${NUMA_SOURCES}
  src/numa/algo/work_stealing.cpp
)

add_library(Boost::fiber_numa ALIAS boost_fiber_numa)

target_include_directories(boost_fiber_numa PUBLIC include)

target_link_libraries(boost_fiber_numa
  PUBLIC
    Boost::assert
    Boost::config
    Boost::context
    Boost::fiber
    Boost::smart_ptr
  PRIVATE
    Boost::algorithm
    Boost::filesystem
    Boost::format
)

target_compile_definitions(boost_fiber_numa
  PUBLIC BOOST_FIBER_NO_LIB
  PRIVATE BOOST_FIBER_SOURCE BOOST_FIBERS_SOURCE
)

if(BUILD_SHARED_LIBS)
  target_compile_definitions(boost_fiber_numa PUBLIC BOOST_FIBER_DYN_LINK BOOST_FIBERS_DYN_LINK)
else()
  target_compile_definitions(boost_fiber_numa PUBLIC BOOST_FIBER_STATIC_LINK)
endif()

# Install

if(BOOST_SUPERPROJECT_VERSION AND NOT CMAKE_VERSION VERSION_LESS 3.13)
  boost_install(TARGETS boost_fiber boost_fiber_numa VERSION ${BOOST_SUPERPROJECT_VERSION} HEADER_DIRECTORY include)
endif()

# Test

if(BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt")

  add_subdirectory(test)

endif()