cmake_minimum_required(VERSION 3.17...3.31)

project(
  sgnl-cpu-interp
  DESCRIPTION "Fast polyphase resampling with multi-architecture SIMD support"
  LANGUAGES C
)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

find_package(Python REQUIRED COMPONENTS Interpreter Development.Module NumPy)

set(sources
  csrc/cpu_detect.c
  csrc/dispatch.c
  csrc/resample_ext_simd.c
  csrc/kernels/convolve_scalar.c
)

# Architecture-specific kernels, each compiled with its own ISA flags.
# Runtime CPU detection (cpu_detect.c) selects the best implementation.
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" arch)
if(arch MATCHES "^(x86_64|amd64|x86|i[3-6]86)$")
  list(APPEND sources
    csrc/kernels/convolve_sse2.c
    csrc/kernels/convolve_sse4.c
    csrc/kernels/convolve_avx.c
    csrc/kernels/convolve_avx2.c
    csrc/kernels/convolve_avx512.c
  )
  if(MSVC)
    # SSE2 is baseline on x64 MSVC; SSE4.1 has no dedicated /arch flag
    set_source_files_properties(csrc/kernels/convolve_avx.c PROPERTIES COMPILE_OPTIONS "/arch:AVX")
    set_source_files_properties(csrc/kernels/convolve_avx2.c PROPERTIES COMPILE_OPTIONS "/arch:AVX2")
    set_source_files_properties(csrc/kernels/convolve_avx512.c PROPERTIES COMPILE_OPTIONS "/arch:AVX512")
  else()
    set_source_files_properties(csrc/kernels/convolve_sse2.c PROPERTIES COMPILE_OPTIONS "-msse2")
    set_source_files_properties(csrc/kernels/convolve_sse4.c PROPERTIES COMPILE_OPTIONS "-msse4.1")
    set_source_files_properties(csrc/kernels/convolve_avx.c PROPERTIES COMPILE_OPTIONS "-mavx")
    set_source_files_properties(csrc/kernels/convolve_avx2.c PROPERTIES COMPILE_OPTIONS "-mavx2;-mfma")
    set_source_files_properties(csrc/kernels/convolve_avx512.c PROPERTIES COMPILE_OPTIONS "-mavx512f;-mfma")
  endif()
elseif(arch MATCHES "^(arm64|aarch64|armv8)")
  # NEON is baseline on AArch64, no extra flags needed
  list(APPEND sources csrc/kernels/convolve_neon.c)
endif()

python_add_library(_core MODULE WITH_SOABI ${sources})

target_include_directories(_core PRIVATE csrc)
target_link_libraries(_core PRIVATE Python::NumPy)

if(MSVC)
  target_compile_options(_core PRIVATE /O2 /fp:fast)
else()
  target_compile_options(_core PRIVATE -O3 -ffast-math -Wall)
  target_link_libraries(_core PRIVATE m)
endif()

install(TARGETS _core LIBRARY DESTINATION sgnl_cpu_interp)
