cmake_minimum_required(VERSION 3.5)
set(CMAKE_C_STANDARD 99)
project(muFFT LANGUAGES C)

if (CMAKE_COMPILER_IS_GNUCC OR (${CMAKE_C_COMPILER_ID} MATCHES "Clang"))
    # Cannot safely use -ffast-math, breaks on GCC due to reliance on -0.0f behavior.
    set(MUFFT_C_FLAGS -Wall -Wextra)
elseif (MSVC)
    set(MUFFT_C_FLAGS /fp:precise /D_CRT_SECURE_NO_WARNINGS /wd4267 /wd4244 /wd4309 /wd4005 /MP /DNOMINMAX)
endif()

message("Processor: ${CMAKE_SYSTEM_PROCESSOR}")

option(MUFFT_SIMD_SSE "Enable SSE support if present" ON)
option(MUFFT_SIMD_SSE3 "Enable SSE3 support if present" ON)
option(MUFFT_SIMD_AVX "Enable AVX support if present" ON)
option(MUFFT_ENABLE_FFTW "Enable FFTW support" ON)

if (ANDROID)
    set(CMAKE_POSITION_INDEPENDENT_CODE ON)
endif()

add_library(muFFT STATIC fft.c kernel.c cpu.c)
target_compile_options(muFFT PRIVATE ${MUFFT_C_FLAGS})
target_include_directories(muFFT PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

if (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)")
    target_compile_definitions(muFFT PRIVATE MUFFT_HAVE_X86)
    target_sources(muFFT PRIVATE x86/kernel.h)
    message("Enabling x86 SIMD support.")
    if (MUFFT_SIMD_SSE)
        add_library(muFFT-sse STATIC x86/kernel.sse.c)
        if (CMAKE_COMPILER_IS_GNUCC OR (${CMAKE_C_COMPILER_ID} MATCHES "Clang"))
            target_compile_options(muFFT-sse PRIVATE -msse -mno-sse3 -mno-avx)
        endif()
        target_compile_options(muFFT-sse PRIVATE ${MUFFT_C_FLAGS})
        target_compile_definitions(muFFT PRIVATE MUFFT_HAVE_SSE)
        target_link_libraries(muFFT PRIVATE muFFT-sse)
    endif()

    if (MUFFT_SIMD_SSE3)
        add_library(muFFT-sse3 STATIC x86/kernel.sse3.c)
        if (CMAKE_COMPILER_IS_GNUCC OR (${CMAKE_C_COMPILER_ID} MATCHES "Clang"))
            target_compile_options(muFFT-sse3 PRIVATE -msse -msse3 -mno-avx)
        endif()
        target_compile_options(muFFT-sse3 PRIVATE ${MUFFT_C_FLAGS})
        target_compile_definitions(muFFT PRIVATE MUFFT_HAVE_SSE3)
        target_link_libraries(muFFT PRIVATE muFFT-sse3)
    endif()

    if (MUFFT_SIMD_AVX)
        add_library(muFFT-avx STATIC x86/kernel.avx.c)
        if (CMAKE_COMPILER_IS_GNUCC OR (${CMAKE_C_COMPILER_ID} MATCHES "Clang"))
            target_compile_options(muFFT-avx PRIVATE -msse -msse3 -mavx)
        endif()
        target_compile_options(muFFT-avx PRIVATE ${MUFFT_C_FLAGS})
        target_compile_definitions(muFFT PRIVATE MUFFT_HAVE_AVX)
        target_link_libraries(muFFT PRIVATE muFFT-avx)
    endif()
endif()

if (NOT MSVC)
    target_link_libraries(muFFT PRIVATE m)
endif()