101 lines
3.8 KiB
CMake
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() |