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|ARM64|aarch64|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)
if(WIN32)
    set_target_properties(${SR_LIB} PROPERTIES PREFIX "lib")
endif()
target_include_directories(${SR_LIB} PUBLIC ./)
target_link_libraries(${SR_LIB} PUBLIC sesum_impl)

if(WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_SYSTEM_PROCESSOR MATCHES "(arm64|ARM64|aarch64|AARCH64)")
    execute_process(
        COMMAND ${CMAKE_C_COMPILER} --print-resource-dir
        OUTPUT_VARIABLE CLANG_RESOURCE_DIR
        OUTPUT_STRIP_TRAILING_WHITESPACE
    )
    if(CLANG_RESOURCE_DIR)
        find_library(CLANG_RT_BUILTINS_AARCH64
            NAMES clang_rt.builtins-aarch64 clang_rt.builtins-aarch64.lib
            PATHS "${CLANG_RESOURCE_DIR}/lib/windows"
            NO_DEFAULT_PATH
        )
        if(CLANG_RT_BUILTINS_AARCH64)
            target_link_libraries(${SR_LIB} PRIVATE "${CLANG_RT_BUILTINS_AARCH64}")
        endif()
    endif()
endif()

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}
)
