| include(CheckCSourceCompiles) | |
| include(CMakePushCheckState) | |
| function(_internal_check_cpu_architecture macro_check NAME VARIABLE) | |
| cmake_push_check_state(RESET) | |
| string(TOUPPER "${NAME}" UPPER_NAME) | |
| set(CACHE_VARIABLE "CHECK_CPU_ARCHITECTURE_${UPPER_NAME}") | |
| set(test_src " | |
| int main(int argc, char *argv[]) { | |
| #if ${macro_check} | |
| return 0; | |
| #else | |
| choke | |
| #endif | |
| } | |
| ") | |
| check_c_source_compiles("${test_src}" "${CACHE_VARIABLE}") | |
| cmake_pop_check_state() | |
| if(${CACHE_VARIABLE}) | |
| set(${VARIABLE} "TRUE" PARENT_SCOPE) | |
| else() | |
| set(${VARIABLE} "FALSE" PARENT_SCOPE) | |
| endif() | |
| endfunction() | |
| function(check_cpu_architecture ARCH VARIABLE) | |
| if(ARCH STREQUAL "x86") | |
| _internal_check_cpu_architecture("defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) ||defined( __i386) || defined(_M_IX86)" x86 ${VARIABLE}) | |
| elseif(ARCH STREQUAL "x64") | |
| _internal_check_cpu_architecture("(defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64)) && !defined(_M_ARM64EC)" x64 ${VARIABLE}) | |
| elseif(ARCH STREQUAL "arm32") | |
| _internal_check_cpu_architecture("defined(__arm__) || defined(_M_ARM)" arm32 ${VARIABLE}) | |
| elseif(ARCH STREQUAL "arm64") | |
| _internal_check_cpu_architecture("defined(__aarch64__) || defined(_M_ARM64)" arm64 ${VARIABLE}) | |
| elseif(ARCH STREQUAL "arm64ec") | |
| _internal_check_cpu_architecture("defined(_M_ARM64EC)" arm64ec ${VARIABLE}) | |
| elseif(ARCH STREQUAL "loongarch64") | |
| _internal_check_cpu_architecture("defined(__loongarch64)" loongarch64 ${VARIABLE}) | |
| else() | |
| message(WARNING "Unknown CPU architectures (${ARCH}).") | |
| set(${VARIABLE} FALSE) | |
| endif() | |
| set("${VARIABLE}" "${${VARIABLE}}" PARENT_SCOPE) | |
| endfunction() |