cmake_minimum_required(VERSION 3.9 FATAL_ERROR)
project(cwrapper LANGUAGES CXX)

if(APPLE)
    set(LIB_DIR "mac_")
elseif(UNIX)
    set(LIB_DIR "linux_")
elseif(WIN32)
    set(LIB_DIR "windows_")
else()
    message(FATAL_ERROR "Unsupported operating system!")
endif()

if(CMAKE_SYSTEM_PROCESSOR MATCHES "(arm64)|(aarch64)")
    set(LIB_DIR "${LIB_DIR}arm64")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)")
    include(CheckCXXSourceCompiles)
    check_cxx_source_compiles("
#include <immintrin.h>
int main() { __m512i a = _mm512_setzero_si512();}
" HAS_AVX512)
    if(HAS_AVX512)
        set(LIB_DIR "${LIB_DIR}avx512")
    else()
        check_cxx_source_compiles("
#include <immintrin.h>
int main() {__m256i a = _mm256_setzero_si256();}
" HAS_AVX2)
        if(HAS_AVX2)
            set(LIB_DIR "${LIB_DIR}avx2")
        else()
            message(FATAL_ERROR "Neither AVX512 nor AVX2 is supported!")
        endif()
    endif()
else()
    message(FATAL_ERROR "Only arm64 and x86_64 supported")
endif ()

if(WIN32)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static")
endif()

file(MAKE_DIRECTORY "${CMAKE_SOURCE_DIR}/sesum/${LIB_DIR}")

set(SR_LIB "sr")
add_library(${SR_LIB} SHARED cwrapper.h cwrapper.cpp)
target_include_directories(${SR_LIB} PUBLIC ./)
target_link_libraries(${SR_LIB} PUBLIC sesum_impl)

add_custom_command(TARGET ${SR_LIB} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
        $<TARGET_FILE:${SR_LIB}>
        ${CMAKE_SOURCE_DIR}/sesum/${LIB_DIR}
)