54 lines
2.1 KiB
CMake
54 lines
2.1 KiB
CMake
|
function(determine_target_arch OUTPUT_VARIABLE)
|
||
|
if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
|
||
|
if("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "X86")
|
||
|
set(ARCH "i686")
|
||
|
elseif("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "x64")
|
||
|
set(ARCH "x86_64")
|
||
|
elseif("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARM")
|
||
|
set(ARCH "arm")
|
||
|
elseif("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARM64")
|
||
|
set(ARCH "arm64")
|
||
|
else()
|
||
|
message(FATAL_ERROR "Unrecognized architecture ${MSVC_C_ARCHITECTURE_ID} from ${CMAKE_C_COMPILER}")
|
||
|
endif()
|
||
|
elseif("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
|
||
|
if("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
|
||
|
set(CMD_ARGS "-target" "${CMAKE_C_COMPILER_TARGET}" "-dumpmachine")
|
||
|
else()
|
||
|
set(CMD_ARGS "-dumpmachine")
|
||
|
endif()
|
||
|
execute_process(
|
||
|
COMMAND
|
||
|
${CMAKE_C_COMPILER} ${CMD_ARGS}
|
||
|
RESULT_VARIABLE
|
||
|
RESULT
|
||
|
OUTPUT_VARIABLE
|
||
|
ARCH
|
||
|
ERROR_QUIET)
|
||
|
if(RESULT)
|
||
|
message(FATAL_ERROR "Failed to determine target architecture triplet: ${RESULT}")
|
||
|
endif()
|
||
|
string(REGEX MATCH "([^-]+).*" ARCH_MATCH ${ARCH})
|
||
|
if(NOT CMAKE_MATCH_1 OR NOT ARCH_MATCH)
|
||
|
message(FATAL_ERROR "Failed to match the target architecture triplet: ${ARCH}")
|
||
|
endif()
|
||
|
set(ARCH ${CMAKE_MATCH_1})
|
||
|
|
||
|
if("${ARCH}" STREQUAL "x86_64")
|
||
|
# Do nothing
|
||
|
elseif("${ARCH}" STREQUAL "aarch64")
|
||
|
set(ARCH "arm64")
|
||
|
elseif("${ARCH}" STREQUAL "i686")
|
||
|
# Do nothing
|
||
|
elseif("${ARCH}" STREQUAL "i386")
|
||
|
# Do nothing
|
||
|
else()
|
||
|
message(FATAL_ERROR "Unrecognized architecture ${ARCH} from ${CMAKE_C_COMPILER}")
|
||
|
endif()
|
||
|
else()
|
||
|
message(FATAL_ERROR "Unrecognized Compiler ${CMAKE_C_COMPILER_ID}")
|
||
|
endif()
|
||
|
message(STATUS "Target architecture - ${ARCH}")
|
||
|
set(${OUTPUT_VARIABLE} ${ARCH} PARENT_SCOPE)
|
||
|
endfunction()
|