| function(SDL_DetectTargetCPUArchitectures DETECTED_ARCHS) |
| |
| set(known_archs EMSCRIPTEN ARM32 ARM64 ARM64EC LOONGARCH64 POWERPC32 POWERPC64 RISCV32 RISCV64 X86 X64) |
| |
| if(APPLE AND CMAKE_OSX_ARCHITECTURES) |
| foreach(known_arch IN LISTS known_archs) |
| set(SDL_CPU_${known_arch} "0" PARENT_SCOPE) |
| endforeach() |
| set(detected_archs) |
| foreach(osx_arch IN LISTS CMAKE_OSX_ARCHITECTURES) |
| if(osx_arch STREQUAL "x86_64") |
| set(SDL_CPU_X64 "1" PARENT_SCOPE) |
| list(APPEND detected_archs "X64") |
| elseif(osx_arch STREQUAL "arm64") |
| set(SDL_CPU_ARM64 "1" PARENT_SCOPE) |
| list(APPEND detected_archs "ARM64") |
| endif() |
| endforeach() |
| set("${DETECTED_ARCHS}" "${detected_archs}" PARENT_SCOPE) |
| return() |
| endif() |
| |
| set(detected_archs) |
| foreach(known_arch IN LISTS known_archs) |
| if(SDL_CPU_${known_arch}) |
| list(APPEND detected_archs "${known_arch}") |
| endif() |
| endforeach() |
| |
| if(detected_archs) |
| set("${DETECTED_ARCHS}" "${detected_archs}" PARENT_SCOPE) |
| return() |
| endif() |
| |
| set(arch_check_ARM32 "defined(__arm__) || defined(_M_ARM)") |
| set(arch_check_ARM64 "defined(__aarch64__) || defined(_M_ARM64)") |
| set(arch_check_ARM64EC "defined(_M_ARM64EC)") |
| set(arch_check_EMSCRIPTEN "defined(__EMSCRIPTEN__)") |
| set(arch_check_LOONGARCH64 "defined(__loongarch64)") |
| set(arch_check_POWERPC32 "(defined(__PPC__) || defined(__powerpc__)) && !defined(__powerpc64__)") |
| set(arch_check_POWERPC64 "defined(__PPC64__) || defined(__powerpc64__)") |
| set(arch_check_RISCV32 "defined(__riscv) && defined(__riscv_xlen) && __riscv_xlen == 32") |
| set(arch_check_RISCV64 "defined(__riscv) && defined(__riscv_xlen) && __riscv_xlen == 64") |
| set(arch_check_X86 "defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) ||defined( __i386) || defined(_M_IX86)") |
| set(arch_check_X64 "(defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64)) && !defined(_M_ARM64EC)") |
| |
| set(src_vars "") |
| set(src_main "") |
| foreach(known_arch IN LISTS known_archs) |
| set(detected_${known_arch} "0") |
| |
| string(APPEND src_vars " |
| #if ${arch_check_${known_arch}} |
| #define ARCH_${known_arch} \"1\" |
| #else |
| #define ARCH_${known_arch} \"0\" |
| #endif |
| const char *arch_${known_arch} = \"INFO<${known_arch}=\" ARCH_${known_arch} \">\"; |
| ") |
| string(APPEND src_main " |
| result += arch_${known_arch}[argc];") |
| endforeach() |
| |
| set(src_arch_detect "${src_vars} |
| int main(int argc, char *argv[]) { |
| int result = 0; |
| (void)argv; |
| ${src_main} |
| return result; |
| }") |
| |
| if(CMAKE_C_COMPILER) |
| set(ext ".c") |
| elseif(CMAKE_CXX_COMPILER) |
| set(ext ".cpp") |
| else() |
| enable_language(C) |
| set(ext ".c") |
| endif() |
| set(path_src_arch_detect "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/CMakeTmp/SDL_detect_arch${ext}") |
| file(WRITE "${path_src_arch_detect}" "${src_arch_detect}") |
| set(path_dir_arch_detect "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/CMakeTmp/SDL_detect_arch") |
| set(path_bin_arch_detect "${path_dir_arch_detect}/bin") |
| |
| set(detected_archs) |
| |
| set(msg "Detecting Target CPU Architecture") |
| message(STATUS "${msg}") |
| |
| include(CMakePushCheckState) |
| |
| set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY") |
| |
| cmake_push_check_state(RESET) |
| try_compile(SDL_CPU_CHECK_ALL |
| "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/CMakeTmp/SDL_detect_arch" |
| SOURCES "${path_src_arch_detect}" |
| COPY_FILE "${path_bin_arch_detect}" |
| ) |
| cmake_pop_check_state() |
| if(NOT SDL_CPU_CHECK_ALL) |
| message(STATUS "${msg} - <ERROR>") |
| message(WARNING "Failed to compile source detecting the target CPU architecture") |
| else() |
| set(re "INFO<([A-Z0-9]+)=([01])>") |
| file(STRINGS "${path_bin_arch_detect}" infos REGEX "${re}") |
| |
| foreach(info_arch_01 IN LISTS infos) |
| string(REGEX MATCH "${re}" A "${info_arch_01}") |
| if(NOT "${CMAKE_MATCH_1}" IN_LIST known_archs) |
| message(WARNING "Unknown architecture: \"${CMAKE_MATCH_1}\"") |
| continue() |
| endif() |
| set(arch "${CMAKE_MATCH_1}") |
| set(arch_01 "${CMAKE_MATCH_2}") |
| set(detected_${arch} "${arch_01}") |
| endforeach() |
| |
| foreach(known_arch IN LISTS known_archs) |
| if(detected_${known_arch}) |
| list(APPEND detected_archs ${known_arch}) |
| endif() |
| endforeach() |
| endif() |
| |
| if(detected_archs) |
| foreach(known_arch IN LISTS known_archs) |
| set("SDL_CPU_${known_arch}" "${detected_${known_arch}}" CACHE BOOL "Detected architecture ${known_arch}") |
| endforeach() |
| message(STATUS "${msg} - ${detected_archs}") |
| else() |
| include(CheckCSourceCompiles) |
| cmake_push_check_state(RESET) |
| foreach(known_arch IN LISTS known_archs) |
| if(NOT detected_archs) |
| set(cache_variable "SDL_CPU_${known_arch}") |
| set(test_src " |
| int main(int argc, char *argv[]) { |
| #if ${arch_check_${known_arch}} |
| return 0; |
| #else |
| choke |
| #endif |
| } |
| ") |
| check_c_source_compiles("${test_src}" "${cache_variable}") |
| if(${cache_variable}) |
| set(SDL_CPU_${known_arch} "1" CACHE BOOL "Detected architecture ${known_arch}") |
| set(detected_archs ${known_arch}) |
| else() |
| set(SDL_CPU_${known_arch} "0" CACHE BOOL "Detected architecture ${known_arch}") |
| endif() |
| endif() |
| endforeach() |
| cmake_pop_check_state() |
| endif() |
| set("${DETECTED_ARCHS}" "${detected_archs}" PARENT_SCOPE) |
| endfunction() |