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