cmake_minimum_required(VERSION 3.18)
project(Transpose CXX)

set(IS_WINDOWS_ARM64_CLANG_TARGET OFF)
if(WIN32 AND CMAKE_SYSTEM_PROCESSOR MATCHES "(arm64|ARM64|aarch64|AARCH64)")
    set(IS_WINDOWS_ARM64_CLANG_TARGET ON)
endif()

if(IS_WINDOWS_ARM64_CLANG_TARGET)
    if(NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
        message(FATAL_ERROR "Windows ARM64 requires clang/clang++.")
    endif()
else()
    if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
        message(FATAL_ERROR "Only g++/GNU is supported on non-Windows-ARM64 targets.")
    endif()
endif()
if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
    message(FATAL_ERROR "Only 64-bit systems are supported!")
endif()

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp -std=c++17 -Ofast -Wall -ftree-vectorize -funroll-loops -DNDEBUG -fno-strict-aliasing -Wno-format -Wno-class-memaccess -Wno-deprecated-declarations -fvisibility=hidden -DNDEBUG")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Ofast -Wall -ftree-vectorize -funroll-loops -DNDEBUG -fvisibility=hidden -DNDEBUG")
if(NOT WIN32)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static-libgcc")
endif()
if(IS_WINDOWS_ARM64_CLANG_TARGET AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")
    set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
    add_compile_definitions(NOMINMAX)
endif()

if(APPLE AND ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm64")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flax-vector-conversions")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -flax-vector-conversions")
elseif(NOT IS_WINDOWS_ARM64_CLANG_TARGET)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native -mtune=native")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=native -mtune=native")
endif()

add_subdirectory(contract)
add_subdirectory(sring)
add_subdirectory(sparse)
add_subdirectory(sesum_impl)
# final dynamic library
add_subdirectory(cwrapper)
