cmake_minimum_required(VERSION 3.10)
project(pybind_cabess LANGUAGES CXX)
# environment variables
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED YES)
option(SKLABS_NATIVE_OPT "Enable machine-specific CPU optimizations" OFF)
set(SKLABS_CPU_OPT "PORTABLE" CACHE STRING "CPU optimization target: PORTABLE, X86_64_V3, or NATIVE")
set_property(CACHE SKLABS_CPU_OPT PROPERTY STRINGS PORTABLE X86_64_V3 NATIVE)
# option(NLOPT_FORTRAN "enable fortran tests" OFF)
# option(BUILD_SHARED_LIBS "Build NLopt as a shared library" OFF)
# option(NLOPT_PYTHON "build python bindings" OFF)
# option(NLOPT_OCTAVE "build octave bindings" OFF)
# option(NLOPT_MATLAB "build matlab bindings" OFF)
# option(NLOPT_GUILE "build guile bindings" OFF)
# option(NLOPT_SWIG "use SWIG to build bindings" OFF)
if(MSVC)
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc")
    SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /W4")
    if(SKLABS_NATIVE_OPT OR SKLABS_CPU_OPT STREQUAL "X86_64_V3" OR SKLABS_CPU_OPT STREQUAL "NATIVE")
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
    endif()
elseif(APPLE OR DARWIN)
    SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
else()
    SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
    if(SKLABS_NATIVE_OPT)
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
    elseif(SKLABS_CPU_OPT STREQUAL "NATIVE")
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
    elseif(SKLABS_CPU_OPT STREQUAL "X86_64_V3")
        if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64|amd64")
            SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=x86-64-v3")
        else()
            message(WARNING "SKLABS_CPU_OPT=X86_64_V3 requested on non-x86_64 architecture; ignoring")
        endif()
    endif()
endif()
# dependencies
set(PYBIND11_FINDPYTHON ON)
find_package(pybind11 CONFIG REQUIRED)
find_package(OpenMP)
# add_subdirectory(nlopt)
# sources
set(SOURCES
    src/pywrap.cpp
    src/utilities.cpp 
    src/api.cpp 
    src/normalize.cpp
)
add_library(pybind_cabess MODULE ${SOURCES})
# links
target_include_directories(pybind_cabess PRIVATE include
                                                 src)
target_link_libraries(pybind_cabess PRIVATE pybind11::module 
                                            pybind11::lto
                                            pybind11::windows_extras)
if(OpenMP_CXX_FOUND)
    target_link_libraries(pybind_cabess PRIVATE OpenMP::OpenMP_CXX)
endif()
# build extension
pybind11_extension(pybind_cabess)
pybind11_strip(pybind_cabess)
set_target_properties(pybind_cabess PROPERTIES CXX_VISIBILITY_PRESET "hidden"
                                               CUDA_VISIBILITY_PRESET "hidden")