فهرست منبع

CMake Module for deriving the target architecture

This is needed for packaging and other decisions at configuration time
Matt Clarkson 10 سال پیش
والد
کامیت
b84eda553e
1فایلهای تغییر یافته به همراه47 افزوده شده و 0 حذف شده
  1. 47 0
      cmake/DetermineTargetArchitecture.cmake

+ 47 - 0
cmake/DetermineTargetArchitecture.cmake

@@ -0,0 +1,47 @@
+# - Determines the target architecture of the compilation
+#
+# This function checks the architecture that will be built by the compiler
+# and sets a variable to the architecture
+#
+#  determine_target_architecture(<OUTPUT_VAR>)
+#
+# - Example
+#
+# include(DetermineTargetArchitecture)
+# determine_target_architecture(PROJECT_NAME_ARCHITECTURE)
+
+if(__determine_target_architecture)
+  return()
+endif()
+set(__determine_target_architecture INCLUDED)
+
+function(determine_target_architecture FLAG)
+  if (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")
+    else()
+      message(FATAL_ERROR "Failed to determine the MSVC target architecture: ${MSVC_C_ARCHITECTURE_ID}")
+    endif()
+  else()
+    execute_process(
+      COMMAND ${CMAKE_C_COMPILER} -dumpmachine
+      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})
+  endif()
+  message(STATUS "Target architecture - ${ARCH}")
+  set(FLAG ${ARCH} PARENT_SCOPE)
+endfunction()