# cmake/Platform.cmake # Detects OS and CPU architecture and sets platform-specific flags. # --- Platform and Architecture Detection --- set(SD_X86_BUILD false) set(SD_ARM_BUILD false) if(SD_ANDROID_BUILD) if(ANDROID_ABI MATCHES "x86_64") set(SD_X86_BUILD true) set(SD_ARCH "x86-64") elseif(ANDROID_ABI MATCHES "x86") set(SD_X86_BUILD true) set(SD_ARCH "x86") elseif(ANDROID_ABI MATCHES "arm64-v8a") set(SD_ARM_BUILD true) set(SD_ARCH "arm64-v8a") elseif(ANDROID_ABI MATCHES "armeabi-v7a") set(SD_ARM_BUILD true) set(SD_ARCH "armv7-a") endif() elseif(NOT SD_IOS_BUILD) if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64|amd64") set(SD_X86_BUILD true) if(NOT DEFINED SD_ARCH OR SD_ARCH STREQUAL "") set(SD_ARCH "x86-64") endif() elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm*|aarch64") set(SD_ARM_BUILD true) if(NOT DEFINED SD_ARCH OR SD_ARCH STREQUAL "") if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") set(SD_ARCH "armv8-a") else() set(SD_ARCH "armv7-a") endif() endif() endif() endif() if(SD_ARM_BUILD) if(NOT DEFINED SD_ARCH OR SD_ARCH STREQUAL "") message(STATUS "Warning: SD_ARCH was not set for this ARM build. Defaulting to 'armv8-a'.") set(SD_ARCH "armv8-a") endif() endif() message(STATUS "Build flags determined: SD_ANDROID_BUILD=${SD_ANDROID_BUILD}, SD_X86_BUILD=${SD_X86_BUILD}, SD_ARM_BUILD=${SD_ARM_BUILD}, SD_ARCH=${SD_ARCH}") # --- Architecture-Specific Tuning --- set(ARCH_TUNE "") if(SD_ARCH MATCHES "armv8") set(ARCH_TUNE "-march=${SD_ARCH}") elseif(SD_ARCH MATCHES "armv7") set(ARCH_TUNE "-march=${SD_ARCH} -mfpu=neon") elseif(SD_EXTENSION MATCHES "avx512") message("Building AVX512 binary...") set(ARCH_TUNE "-mmmx -msse -msse2 -msse3 -msse4.1 -msse4.2 -mavx -mavx2 -mfma -mf16c -mavx512f -mavx512vl -mavx512bw -mavx512dq -mavx512cd -mbmi -mbmi2 -mprefetchwt1 -mclflushopt -mxsavec -mxsaves -DSD_F16C=true -DF_AVX512=true") elseif(SD_EXTENSION MATCHES "avx2") message("Building AVX2 binary...") set(ARCH_TUNE "-mmmx -msse -msse2 -msse3 -msse4.1 -msse4.2 -mavx -mavx2 -mfma -mf16c -mprefetchwt1 -DSD_F16C=true -DF_AVX2=true") if(NO_AVX256_SPLIT) set(ARCH_TUNE "${ARCH_TUNE} -mno-avx256-split-unaligned-load -mno-avx256-split-unaligned-store") endif() elseif(SD_NATIVE) if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "ppc64*" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64*") set(ARCH_TUNE "-mcpu=native") else() set(ARCH_TUNE "-march=native") endif() endif() if(NOT ARCH_TUNE STREQUAL "") message(STATUS "Applying architecture tuning flags: ${ARCH_TUNE}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ARCH_TUNE}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ARCH_TUNE}") endif() # --- OS-Specific Build Flags --- if(SD_APPLE_BUILD) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSD_APPLE_BUILD=true -mmacosx-version-min=10.10") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSD_APPLE_BUILD=true -mmacosx-version-min=10.10") elseif(SD_ARM_BUILD) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSD_ARM_BUILD=true") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSD_ARM_BUILD=true") elseif(SD_ANDROID_BUILD) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSD_ANDROID_BUILD=true") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSD_ANDROID_BUILD=true") elseif(SD_IOS_BUILD) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSD_IOS_BUILD=true") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSD_IOS_BUILD=true") endif() # --- External Include Directories --- if(UNIX) link_directories(/usr/local/lib /usr/lib /lib) endif() if(APPLE) message("Using Apple") link_directories(/usr/local/lib /usr/lib /lib) endif() if(CMAKE_SYSTEM_NAME MATCHES "Linux") list(APPEND EXTERNAL_INCLUDE_DIRS "/usr/include" "/usr/local/include") endif()