# Copyright 2026 Shohruh Miryusupov
# SPDX-License-Identifier: Apache-2.0

cmake_minimum_required(VERSION 3.18)
project(robustcov_cpp LANGUAGES NONE)

option(ROBUSTCOV_BUILD_NATIVE "Build the optional pybind11 extension" ON)
option(ROBUSTCOV_ENABLE_SANITIZERS "Build the native extension with ASan and UBSan" OFF)

if(ROBUSTCOV_BUILD_NATIVE)
  enable_language(CXX)
  set(CMAKE_CXX_STANDARD 17)
  set(CMAKE_CXX_STANDARD_REQUIRED ON)
  set(CMAKE_POSITION_INDEPENDENT_CODE ON)

  set(PYBIND11_FINDPYTHON ON)
  find_package(pybind11 CONFIG REQUIRED)
  find_package(OpenMP)
  pybind11_add_module(_robustcov_cpp src/robustcov_cpp.cpp)

  if(OpenMP_CXX_FOUND)
    target_link_libraries(_robustcov_cpp PRIVATE OpenMP::OpenMP_CXX)
    target_compile_definitions(_robustcov_cpp PRIVATE ROBUSTCOV_OPENMP=1)
  endif()

  if(MSVC)
    if(ROBUSTCOV_ENABLE_SANITIZERS)
      message(FATAL_ERROR "ROBUSTCOV_ENABLE_SANITIZERS is supported only with GCC or Clang")
    endif()
    target_compile_options(_robustcov_cpp PRIVATE /O2)
  elseif(ROBUSTCOV_ENABLE_SANITIZERS)
    target_compile_options(
      _robustcov_cpp PRIVATE
      -O1
      -g
      -Wall
      -Wextra
      -fno-omit-frame-pointer
      -fsanitize=address,undefined
    )
    target_link_options(_robustcov_cpp PRIVATE -fsanitize=address,undefined)
  else()
    target_compile_options(_robustcov_cpp PRIVATE -O3 -Wall -Wextra)
  endif()

  install(TARGETS _robustcov_cpp LIBRARY DESTINATION robustcov)
else()
  message(STATUS "Building robustcov without the optional native extension")
endif()
