Files
2026-07-13 12:47:05 +08:00

101 lines
3.8 KiB
CMake

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