detect-arch.cmake 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. # detect-arch.cmake -- Detect compiler architecture and set ARCH and BASEARCH
  2. # Copyright (C) 2019 Hans Kristian Rosbach
  3. # Licensed under the Zlib license, see LICENSE.md for details
  4. set(ARCHDETECT_FOUND TRUE)
  5. if(CMAKE_OSX_ARCHITECTURES)
  6. # If multiple architectures are requested (universal build), pick only the first
  7. list(GET CMAKE_OSX_ARCHITECTURES 0 ARCH)
  8. elseif(MSVC)
  9. if("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "X86")
  10. set(ARCH "i686")
  11. elseif("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "x64")
  12. set(ARCH "x86_64")
  13. elseif("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARM" OR "${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARMV7")
  14. set(ARCH "arm")
  15. elseif ("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARM64" OR "${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARM64EC")
  16. set(ARCH "aarch64")
  17. endif()
  18. elseif(EMSCRIPTEN)
  19. set(ARCH "wasm32")
  20. elseif(CMAKE_CROSSCOMPILING)
  21. set(ARCH ${CMAKE_C_COMPILER_TARGET})
  22. else()
  23. # Let preprocessor parse archdetect.c and raise an error containing the arch identifier
  24. enable_language(C)
  25. try_run(
  26. run_result_unused
  27. compile_result_unused
  28. ${CMAKE_CURRENT_BINARY_DIR}
  29. ${CMAKE_CURRENT_LIST_DIR}/detect-arch.c
  30. COMPILE_OUTPUT_VARIABLE RAWOUTPUT
  31. CMAKE_FLAGS CMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
  32. )
  33. # Find basearch tag, and extract the arch word into BASEARCH variable
  34. string(REGEX REPLACE ".*archfound ([a-zA-Z0-9_]+).*" "\\1" ARCH "${RAWOUTPUT}")
  35. if(NOT ARCH)
  36. set(ARCH unknown)
  37. endif()
  38. endif()
  39. # Make sure we have ARCH set
  40. if(NOT ARCH OR ARCH STREQUAL "unknown")
  41. set(ARCH ${CMAKE_SYSTEM_PROCESSOR})
  42. message(STATUS "Arch not recognized, falling back to cmake arch: '${ARCH}'")
  43. else()
  44. message(STATUS "Arch detected: '${ARCH}'")
  45. endif()
  46. # Base arch detection
  47. if("${ARCH}" MATCHES "(x86_64|AMD64|i[3-6]86)")
  48. set(BASEARCH "x86")
  49. set(BASEARCH_X86_FOUND TRUE)
  50. elseif("${ARCH}" MATCHES "(arm(v[0-9])?|aarch64|cortex)")
  51. set(BASEARCH "arm")
  52. set(BASEARCH_ARM_FOUND TRUE)
  53. elseif("${ARCH}" MATCHES "ppc(64(le)?)?|powerpc(64(le)?)?")
  54. set(BASEARCH "ppc")
  55. set(BASEARCH_PPC_FOUND TRUE)
  56. elseif("${ARCH}" MATCHES "alpha")
  57. set(BASEARCH "alpha")
  58. set(BASEARCH_ALPHA_FOUND TRUE)
  59. elseif("${ARCH}" MATCHES "blackfin")
  60. set(BASEARCH "blackfin")
  61. set(BASEARCH_BLACKFIN_FOUND TRUE)
  62. elseif("${ARCH}" MATCHES "ia64")
  63. set(BASEARCH "ia64")
  64. set(BASEARCH_IA64_FOUND TRUE)
  65. elseif("${ARCH}" MATCHES "mips")
  66. set(BASEARCH "mips")
  67. set(BASEARCH_MIPS_FOUND TRUE)
  68. elseif("${ARCH}" MATCHES "m68k")
  69. set(BASEARCH "m68k")
  70. set(BASEARCH_M68K_FOUND TRUE)
  71. elseif("${ARCH}" MATCHES "sh")
  72. set(BASEARCH "sh")
  73. set(BASEARCH_SH_FOUND TRUE)
  74. elseif("${ARCH}" MATCHES "sparc[89]?")
  75. set(BASEARCH "sparc")
  76. set(BASEARCH_SPARC_FOUND TRUE)
  77. elseif("${ARCH}" MATCHES "s3[679]0x?")
  78. set(BASEARCH "s360")
  79. set(BASEARCH_S360_FOUND TRUE)
  80. elseif("${ARCH}" MATCHES "parisc")
  81. set(BASEARCH "parisc")
  82. set(BASEARCH_PARISC_FOUND TRUE)
  83. elseif("${ARCH}" MATCHES "rs6000")
  84. set(BASEARCH "rs6000")
  85. set(BASEARCH_RS6000_FOUND TRUE)
  86. elseif("${ARCH}" MATCHES "riscv(32|64)")
  87. set(BASEARCH "riscv")
  88. set(BASEARCH_RISCV_FOUND TRUE)
  89. elseif("${ARCH}" MATCHES "loongarch64")
  90. set(BASEARCH "loongarch")
  91. set(BASEARCH_LOONGARCH_FOUND TRUE)
  92. elseif("${ARCH}" MATCHES "wasm32")
  93. set(BASEARCH "wasm32")
  94. set(BASEARCH_WASM32_FOUND TRUE)
  95. else()
  96. set(BASEARCH "x86")
  97. set(BASEARCH_X86_FOUND TRUE)
  98. message(STATUS "Basearch '${ARCH}' not recognized, defaulting to 'x86'.")
  99. endif()
  100. message(STATUS "Basearch of '${ARCH}' has been detected as: '${BASEARCH}'")