Browse Source

Merge topic 'compiler-architecture-id'

7f0f382c55 Provide CMAKE_<LANG>_COMPILER_ARCHITECTURE_ID on more compilers
019f0f8b32 ARCHITECTURE_ID: Save persistently even if empty
8e46672b29 Fortran: Detect pointer size on sparc architectures
eddf66eaef CMakeDetermineASMCompiler: De-duplicate list of compiler info variables
c0224f5aa1 CMakeDetermineCompilerABI: Make ABI info string more robust
67ab580804 Windows/Clang: Fix indentation in platform information module
1c9f8eeb4f Help: Document CMAKE_<LANG>_COMPILER_ARCHITECTURE_ID

Acked-by: Kitware Robot <[email protected]>
Acked-by: buildbot <[email protected]>
Merge-request: !10516
Brad King 7 months ago
parent
commit
f403e570eb
47 changed files with 809 additions and 89 deletions
  1. 1 1
      Help/manual/cmake-variables.7.rst
  2. 5 0
      Help/release/dev/compiler-architecture-id.rst
  3. 300 4
      Help/variable/CMAKE_LANG_COMPILER_ARCHITECTURE_ID.rst
  4. 1 1
      Modules/CMakeASMCompiler.cmake.in
  5. 1 1
      Modules/CMakeCCompiler.cmake.in
  6. 3 0
      Modules/CMakeCCompilerABI.c
  7. 1 0
      Modules/CMakeCUDACompiler.cmake.in
  8. 3 0
      Modules/CMakeCUDACompilerABI.cu
  9. 1 1
      Modules/CMakeCXXCompiler.cmake.in
  10. 3 0
      Modules/CMakeCXXCompilerABI.cpp
  11. 116 1
      Modules/CMakeCompilerABI.h
  12. 17 33
      Modules/CMakeDetermineASMCompiler.cmake
  13. 0 7
      Modules/CMakeDetermineCCompiler.cmake
  14. 0 7
      Modules/CMakeDetermineCXXCompiler.cmake
  15. 26 0
      Modules/CMakeDetermineCompilerABI.cmake
  16. 0 7
      Modules/CMakeDetermineFortranCompiler.cmake
  17. 0 7
      Modules/CMakeDetermineHIPCompiler.cmake
  18. 0 7
      Modules/CMakeDetermineOBJCCompiler.cmake
  19. 0 7
      Modules/CMakeDetermineOBJCXXCompiler.cmake
  20. 1 1
      Modules/CMakeFortranCompiler.cmake.in
  21. 107 0
      Modules/CMakeFortranCompilerABI.F
  22. 107 0
      Modules/CMakeFortranCompilerABI.F90
  23. 1 0
      Modules/CMakeHIPCompiler.cmake.in
  24. 3 0
      Modules/CMakeHIPCompilerABI.hip
  25. 1 1
      Modules/CMakeOBJCCompiler.cmake.in
  26. 3 0
      Modules/CMakeOBJCCompilerABI.m
  27. 1 1
      Modules/CMakeOBJCXXCompiler.cmake.in
  28. 3 0
      Modules/CMakeOBJCXXCompilerABI.mm
  29. 4 0
      Modules/Internal/CMakeInspectASMLinker.cmake
  30. 74 0
      Modules/Internal/CMakeParseCompilerArchitectureId.cmake
  31. 1 1
      Modules/Platform/Windows-Clang.cmake
  32. 7 1
      Modules/SystemInformation.in
  33. 1 0
      Tests/RunCMake/CompilerId/C-stdout.txt
  34. 1 0
      Tests/RunCMake/CompilerId/C.cmake
  35. 2 0
      Tests/RunCMake/CompilerId/CUDA-stdout.txt
  36. 1 0
      Tests/RunCMake/CompilerId/CUDA.cmake
  37. 1 0
      Tests/RunCMake/CompilerId/CXX-stdout.txt
  38. 1 0
      Tests/RunCMake/CompilerId/CXX.cmake
  39. 1 0
      Tests/RunCMake/CompilerId/Fortran-stdout.txt
  40. 1 0
      Tests/RunCMake/CompilerId/Fortran.cmake
  41. 2 0
      Tests/RunCMake/CompilerId/HIP-stdout.txt
  42. 1 0
      Tests/RunCMake/CompilerId/HIP.cmake
  43. 1 0
      Tests/RunCMake/CompilerId/OBJC-stdout.txt
  44. 1 0
      Tests/RunCMake/CompilerId/OBJC.cmake
  45. 1 0
      Tests/RunCMake/CompilerId/OBJCXX-stdout.txt
  46. 1 0
      Tests/RunCMake/CompilerId/OBJCXX.cmake
  47. 2 0
      Tests/SystemInformation/SystemInformation.in

+ 1 - 1
Help/manual/cmake-variables.7.rst

@@ -72,6 +72,7 @@ Variables that Provide Information
    /variable/CMAKE_JOB_POOL_PRECOMPILE_HEADER
    /variable/CMAKE_JOB_POOLS
    /variable/CMAKE_LANG_COMPILER_AR
+   /variable/CMAKE_LANG_COMPILER_ARCHITECTURE_ID
    /variable/CMAKE_LANG_COMPILER_FRONTEND_VARIANT
    /variable/CMAKE_LANG_COMPILER_LINKER
    /variable/CMAKE_LANG_COMPILER_LINKER_FRONTEND_VARIANT
@@ -814,7 +815,6 @@ are subject to change, and not recommended for use in project code.
    /variable/CMAKE_HOME_DIRECTORY
    /variable/CMAKE_INTERNAL_PLATFORM_ABI
    /variable/CMAKE_LANG_COMPILER_ABI
-   /variable/CMAKE_LANG_COMPILER_ARCHITECTURE_ID
    /variable/CMAKE_LANG_COMPILER_VERSION_INTERNAL
    /variable/CMAKE_LANG_LINKER_PREFERENCE
    /variable/CMAKE_LANG_LINKER_PREFERENCE_PROPAGATES

+ 5 - 0
Help/release/dev/compiler-architecture-id.rst

@@ -0,0 +1,5 @@
+compiler-architecture-id
+------------------------
+
+* The :variable:`CMAKE_<LANG>_COMPILER_ARCHITECTURE_ID` variable is now
+  populated for most compilers, and documented for public use.

+ 300 - 4
Help/variable/CMAKE_LANG_COMPILER_ARCHITECTURE_ID.rst

@@ -3,8 +3,304 @@ CMAKE_<LANG>_COMPILER_ARCHITECTURE_ID
 
 .. versionadded:: 3.10
 
-An internal variable subject to change.
+:ref:`List <CMake Language Lists>` of identifiers indicating the
+target architecture(s) of the compiler for language ``<LANG>``.
 
-This is used to identify the variant of a compiler based on its target
-architecture.  For some compilers this is needed to determine the correct
-usage.
+Typically the list has one entry unless :variable:`CMAKE_OSX_ARCHITECTURES`
+lists multiple architectures.
+
+Possible values for each platform are documented in the following sections.
+
+.. Sync with:
+     Modules/CMakeCompilerABI.h
+     Modules/CMakeFortranCompilerABI.F
+     Modules/CMakeFortranCompilerABI.F90
+     Modules/Internal/CMakeParseCompilerArchitectureId.cmake
+
+Apple Platforms
+^^^^^^^^^^^^^^^
+
+.. versionadded:: 4.1
+
+These identifiers are used when the :variable:`CMAKE_<LANG>_COMPILER`
+targets an Apple platform (``__APPLE__`` is defined).
+
+``arm64``
+  ARM 64-bit
+
+``arm64e``
+  ARM 64-bit with Pointer Authentication (PACs)
+
+``arm64_32``
+  ARM 64-bit with 32-bit pointers (watchOS)
+
+``armv5``, ``armv6``, ``armv7``, ``armv7k``, ``armv7s``
+  ARM 32-bit
+
+``i386``, ``i486``, ``i586``, ``i686``
+  Intel 32-bit
+
+``ppc``
+  PowerPC 32-bit
+
+``x86_64``
+  Intel 64-bit
+
+UNIX Platforms
+^^^^^^^^^^^^^^
+
+.. versionadded:: 4.1
+
+These identifiers are used when the :variable:`CMAKE_<LANG>_COMPILER`
+targets a UNIX platform.
+
+``aarch64``
+  ARM 64-bit
+
+``alpha``
+  DEC Alpha
+
+``armv5``, ``armv6``, ``armv7``
+  ARM 32-bit
+
+``i386``, ``i486``, ``i586``, ``i686``
+  Intel 32-bit
+
+``ia64``
+  Itanium 64-bit
+
+``loongarch32``
+  LoongArch 32-bit
+
+``loongarch64``
+  LoongArch 64-bit
+
+``m68k``
+  Motorola 68000
+
+``mips``
+  MIPS 32-bit big-endian
+
+``mipsel``
+  MIPS 32-bit little-endian
+
+``mips64``
+  MIPS 64-bit big-endian
+
+``mips64el``
+  MIPS 64-bit little-endian
+
+``parisc``
+  PA-RISC 32-bit
+
+``parisc64``
+  PA-RISC 64-bit
+
+``ppc``
+  PowerPC 32-bit big-endian
+
+``ppcle``
+  PowerPC 32-bit little-endian
+
+``ppc64``
+  PowerPC 64-bit big-endian
+
+``ppc64le``
+  PowerPC 64-bit little-endian
+
+``riscv32``
+  RISC-V 32-bit
+
+``riscv64``
+  RISC-V 64-bit
+
+``s390``, ``s390x``
+  IBM Z
+
+``sparc``
+  SPARC 32-bit
+
+``sparcv9``
+  SPARC 64-bit
+
+``x86_64``
+  Intel 64-bit
+
+Windows Platforms with GNU ABI (MinGW)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. versionadded:: 4.1
+
+These identifiers are used when the :variable:`CMAKE_<LANG>_COMPILER`
+targets Windows with a GNU ABI (``_WIN32`` and ``__MINGW32__`` are defined).
+
+``aarch64``
+  ARM 64-bit
+
+``armv7``
+  ARM 32-bit
+
+``i386``, ``i486``, ``i586``, ``i686``
+  Intel 32-bit
+
+``x86_64``
+  Intel 64-bit
+
+Windows Platforms with MSVC ABI
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. versionadded:: 3.10
+
+These identifiers are used when the :variable:`CMAKE_<LANG>_COMPILER`
+targets Windows with a MSVC ABI (``_WIN32`` and ``_MSC_VER`` are defined).
+
+``ARM64``
+  ARM 64-bit
+
+``ARM64EC``
+  ARM 64-bit Emulation-Compatible
+
+``ARMV4I``, ``ARMV5I``, ``ARMV7``
+  ARM 32-bit
+
+``IA64``
+  Itanium 64-bit
+
+``MIPS``
+  MIPS
+
+``SHx``, ``SH3``, ``SH3DSP``, ``SH4``, ``SH5``
+  SuperH
+
+``x64``
+  Intel 64-bit
+
+``X86``
+  Intel 32-bit
+
+Windows Platforms with Watcom ABI
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. versionadded:: 3.10
+
+These identifiers are used when :variable:`CMAKE_<LANG>_COMPILER_ID` is
+``OpenWatcom`` or ``Watcom``.
+
+``I86``
+  Intel 16-bit
+
+``X86``
+  Intel 32-bit
+
+Green Hills MULTI Platforms
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. versionadded:: 3.14
+
+These identifiers are used when :variable:`CMAKE_<LANG>_COMPILER_ID` is
+``GHS``.
+
+``ARM``
+  ARM 32-bit
+
+``PPC``
+  PowerPC 32-bit
+
+``PPC64``
+  PowerPC 64-bit
+
+``x64``
+  Intel 64-bit
+
+``X86``
+  Intel 32-bit
+
+IAR Platforms
+^^^^^^^^^^^^^
+
+.. versionadded:: 3.10
+
+These identifiers are used when :variable:`CMAKE_<LANG>_COMPILER_ID` is
+``IAR``.
+
+``8051``
+  ..
+
+``ARM``
+  ..
+
+``AVR``
+  ..
+
+``MSP430``
+  ..
+
+``RH850``
+  ..
+
+``RISCV``
+  ..
+
+``RL78``
+  ..
+
+``RX``
+  ..
+
+``STM8``
+  ..
+
+``V850``
+  ..
+
+TASKING Platforms
+^^^^^^^^^^^^^^^^^
+
+.. versionadded:: 3.25
+
+These identifiers are used when :variable:`CMAKE_<LANG>_COMPILER_ID` is
+``Tasking``.
+
+``8051``
+  ..
+
+``ARC``
+  ..
+
+``ARM``
+  ..
+
+``MCS``
+  ..
+
+``PCP``
+  ..
+
+``TriCore``
+  ..
+
+Texas Instruments Platforms
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. versionadded:: 3.19
+
+These identifiers are used when :variable:`CMAKE_<LANG>_COMPILER_ID` is
+``TI``.
+
+``ARM``
+  ..
+
+``Blackfin``
+  ..
+
+``MSP430``
+  ..
+
+``SHARC``
+  ..
+
+``TMS320C28x``
+  ..
+
+``TMS320C6x``
+  ..

+ 1 - 1
Modules/CMakeASMCompiler.cmake.in

@@ -18,7 +18,7 @@ set(CMAKE_ASM@ASM_DIALECT@_COMPILER_ID "@_CMAKE_ASM_COMPILER_ID@")
 set(CMAKE_ASM@ASM_DIALECT@_COMPILER_VERSION "@_CMAKE_ASM_COMPILER_VERSION@")
 set(CMAKE_ASM@ASM_DIALECT@_COMPILER_ENV_VAR "@_CMAKE_ASM_COMPILER_ENV_VAR@")
 @_SET_CMAKE_ASM_COMPILER_ID_VENDOR_MATCH@
-@_SET_CMAKE_ASM_COMPILER_ARCHITECTURE_ID@
+set(CMAKE_ASM@ASM_DIALECT@_ARCHITECTURE_ID "@_CMAKE_ASM_ARCHITECTURE_ID@")
 @_SET_CMAKE_ASM_COMPILER_SYSROOT@
 
 set(CMAKE_ASM@ASM_DIALECT@_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC)

+ 1 - 1
Modules/CMakeCCompiler.cmake.in

@@ -18,7 +18,7 @@ set(CMAKE_C_PLATFORM_ID "@CMAKE_C_PLATFORM_ID@")
 set(CMAKE_C_SIMULATE_ID "@CMAKE_C_SIMULATE_ID@")
 set(CMAKE_C_COMPILER_FRONTEND_VARIANT "@CMAKE_C_COMPILER_FRONTEND_VARIANT@")
 set(CMAKE_C_SIMULATE_VERSION "@CMAKE_C_SIMULATE_VERSION@")
-@_SET_CMAKE_C_COMPILER_ARCHITECTURE_ID@
+set(CMAKE_C_COMPILER_ARCHITECTURE_ID "@CMAKE_C_COMPILER_ARCHITECTURE_ID@")
 @_SET_CMAKE_C_COMPILER_SYSROOT@
 @SET_MSVC_C_ARCHITECTURE_ID@
 @SET_CMAKE_XCODE_ARCHS@

+ 3 - 0
Modules/CMakeCCompilerABI.c

@@ -22,6 +22,9 @@ int main(int argc, char* argv[])
   require += info_byte_order_little_endian[argc];
 #if defined(ABI_ID)
   require += info_abi[argc];
+#endif
+#if defined(ARCHITECTURE_ID)
+  require += info_arch[argc];
 #endif
   (void)argv;
   return require;

+ 1 - 0
Modules/CMakeCUDACompiler.cmake.in

@@ -23,6 +23,7 @@ set(CMAKE_CUDA_PLATFORM_ID "@CMAKE_CUDA_PLATFORM_ID@")
 set(CMAKE_CUDA_SIMULATE_ID "@CMAKE_CUDA_SIMULATE_ID@")
 set(CMAKE_CUDA_COMPILER_FRONTEND_VARIANT "@CMAKE_CUDA_COMPILER_FRONTEND_VARIANT@")
 set(CMAKE_CUDA_SIMULATE_VERSION "@CMAKE_CUDA_SIMULATE_VERSION@")
+set(CMAKE_CUDA_COMPILER_ARCHITECTURE_ID "@CMAKE_CUDA_COMPILER_ARCHITECTURE_ID@")
 @SET_MSVC_CUDA_ARCHITECTURE_ID@
 @_SET_CMAKE_CUDA_COMPILER_SYSROOT@
 

+ 3 - 0
Modules/CMakeCUDACompilerABI.cu

@@ -13,6 +13,9 @@ int main(int argc, char* argv[])
   require += info_byte_order_little_endian[argc];
 #if defined(ABI_ID)
   require += info_abi[argc];
+#endif
+#if defined(ARCHITECTURE_ID)
+  require += info_arch[argc];
 #endif
   static_cast<void>(argv);
 

+ 1 - 1
Modules/CMakeCXXCompiler.cmake.in

@@ -20,7 +20,7 @@ set(CMAKE_CXX_PLATFORM_ID "@CMAKE_CXX_PLATFORM_ID@")
 set(CMAKE_CXX_SIMULATE_ID "@CMAKE_CXX_SIMULATE_ID@")
 set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "@CMAKE_CXX_COMPILER_FRONTEND_VARIANT@")
 set(CMAKE_CXX_SIMULATE_VERSION "@CMAKE_CXX_SIMULATE_VERSION@")
-@_SET_CMAKE_CXX_COMPILER_ARCHITECTURE_ID@
+set(CMAKE_CXX_COMPILER_ARCHITECTURE_ID "@CMAKE_CXX_COMPILER_ARCHITECTURE_ID@")
 @_SET_CMAKE_CXX_COMPILER_SYSROOT@
 @SET_MSVC_CXX_ARCHITECTURE_ID@
 @SET_CMAKE_XCODE_ARCHS@

+ 3 - 0
Modules/CMakeCXXCompilerABI.cpp

@@ -12,6 +12,9 @@ int main(int argc, char* argv[])
   require += info_byte_order_little_endian[argc];
 #if defined(ABI_ID)
   require += info_abi[argc];
+#endif
+#if defined(ARCHITECTURE_ID)
+  require += info_arch[argc];
 #endif
   (void)argv;
   return require;

+ 116 - 1
Modules/CMakeCompilerABI.h

@@ -40,6 +40,121 @@ static unsigned short const info_byte_order_little_endian[] = {
 #  define ABI_ID "ELF"
 #endif
 
+/* Sync with:
+ *   Help/variable/CMAKE_LANG_COMPILER_ARCHITECTURE_ID.rst
+ *   Modules/CMakeFortranCompilerABI.F
+ *   Modules/CMakeFortranCompilerABI.F90
+ *   Modules/Internal/CMakeParseCompilerArchitectureId.cmake
+ */
+#if defined(__APPLE__) && defined(__arm64__)
+#  if defined(__ARM64_ARCH_8_32__)
+#    define ARCHITECTURE_ID "arm64_32"
+#  elif defined(__arm64e__)
+#    define ARCHITECTURE_ID "arm64e"
+#  else
+#    define ARCHITECTURE_ID "arm64"
+#  endif
+#elif defined(_MSC_VER) && defined(_M_ARM64EC)
+#  define ARCHITECTURE_ID "arm64ec"
+#elif defined(_MSC_VER) && defined(_M_ARM64)
+#  define ARCHITECTURE_ID "arm64"
+#elif defined(__arm64ec__)
+#  define ARCHITECTURE_ID "arm64ec"
+#elif defined(__aarch64__)
+#  define ARCHITECTURE_ID "aarch64"
+#elif __ARM_ARCH == 7 || _M_ARM == 7 || defined(__ARM_ARCH_7__) ||            \
+  defined(__TI_ARM_V7__)
+#  if defined(__APPLE__) && defined(__ARM_ARCH_7K__)
+#    define ARCHITECTURE_ID "armv7k"
+#  elif defined(__APPLE__) && defined(__ARM_ARCH_7S__)
+#    define ARCHITECTURE_ID "armv7s"
+#  else
+#    define ARCHITECTURE_ID "armv7"
+#  endif
+#elif __ARM_ARCH == 6 || _M_ARM == 6 || defined(__ARM_ARCH_6__) ||            \
+  defined(__TI_ARM_V6__)
+#  define ARCHITECTURE_ID "armv6"
+#elif __ARM_ARCH == 5 || _M_ARM == 5 || defined(__ARM_ARCH_5__) ||            \
+  defined(__TI_ARM_V5__)
+#  define ARCHITECTURE_ID "armv5"
+#elif defined(__alpha) || defined(__alpha) || defined(_M_ALPHA)
+#  define ARCHITECTURE_ID "alpha"
+#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) ||         \
+  defined(__amd64__) || defined(_M_X64) || defined(_M_AMD64)
+#  define ARCHITECTURE_ID "x86_64"
+#elif defined(__i686) || defined(__i686__) || _M_IX86 == 600
+#  define ARCHITECTURE_ID "i686"
+#elif defined(__i586) || defined(__i586__) || _M_IX86 == 500
+#  define ARCHITECTURE_ID "i586"
+#elif defined(__i486) || defined(__i486__) || _M_IX86 == 400
+#  define ARCHITECTURE_ID "i486"
+#elif defined(__i386) || defined(__i386__) || defined(_M_IX86)
+#  define ARCHITECTURE_ID "i386"
+#elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
+#  define ARCHITECTURE_ID "ia64"
+#elif defined(__loongarch64)
+#  define ARCHITECTURE_ID "loongarch64"
+#elif defined(__loongarch__)
+#  define ARCHITECTURE_ID "loongarch32"
+#elif defined(__m68k__)
+#  define ARCHITECTURE_ID "m68k"
+#elif defined(__mips64) || defined(__mips64__)
+#  if defined(_MIPSEL)
+#    define ARCHITECTURE_ID "mips64el"
+#  else
+#    define ARCHITECTURE_ID "mips64"
+#  endif
+#elif defined(__mips) || defined(__mips__)
+#  if defined(_MIPSEL)
+#    define ARCHITECTURE_ID "mipsel"
+#  else
+#    define ARCHITECTURE_ID "mips"
+#  endif
+#elif defined(__riscv) && __riscv_xlen == 64
+#  define ARCHITECTURE_ID "riscv64"
+#elif defined(__riscv) && __riscv_xlen == 32
+#  define ARCHITECTURE_ID "riscv32"
+#elif defined(__s390x__)
+#  define ARCHITECTURE_ID "s390x"
+#elif defined(__s390__)
+#  define ARCHITECTURE_ID "s390"
+#elif defined(__sparcv9) || defined(__sparcv9__) || defined(__sparc64__)
+#  define ARCHITECTURE_ID "sparcv9"
+#elif defined(__sparc) || defined(__sparc__)
+#  define ARCHITECTURE_ID "sparc"
+#elif defined(__hppa) || defined(__hppa__)
+#  if defined(__LP64__)
+#    define ARCHITECTURE_ID "parisc64"
+#  else
+#    define ARCHITECTURE_ID "parisc"
+#  endif
+#elif defined(__ppc64__) || defined(__powerpc64__) || defined(__PPC64__) ||   \
+  defined(_ARCH_PPC64)
+#  if defined(_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN__)
+#    define ARCHITECTURE_ID "ppc64le"
+#  else
+#    define ARCHITECTURE_ID "ppc64"
+#  endif
+#elif defined(__ppc__) || defined(__powerpc__) || defined(__PPC__) ||         \
+  defined(_ARCH_PPC)
+#  if defined(_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN__)
+#    define ARCHITECTURE_ID "ppcle"
+#  else
+#    define ARCHITECTURE_ID "ppc"
+#  endif
+#endif
+
+/* Construct the string literal in pieces to prevent the source from
+   getting matched.  Store it in a pointer rather than an array
+   because some compilers will just produce instructions to fill the
+   array rather than assigning a pointer to a static array.  */
 #if defined(ABI_ID)
-static char const info_abi[] = "INFO:abi[" ABI_ID "]";
+static char const* info_abi = "INFO"
+                              ":"
+                              "abi[" ABI_ID "]";
+#endif
+#if defined(ARCHITECTURE_ID)
+static char const* info_arch = "INFO"
+                               ":"
+                               "arch[" ARCHITECTURE_ID "]";
 #endif

+ 17 - 33
Modules/CMakeDetermineASMCompiler.cmake

@@ -238,18 +238,6 @@ else()
   message(STATUS "Didn't find assembler")
 endif()
 
-foreach(_var
-    COMPILER
-    COMPILER_ID
-    COMPILER_ARG1
-    COMPILER_ENV_VAR
-    COMPILER_AR
-    COMPILER_RANLIB
-    COMPILER_VERSION
-    )
-  set(_CMAKE_ASM_${_var} "${CMAKE_ASM${ASM_DIALECT}_${_var}}")
-endforeach()
-
 if(CMAKE_ASM${ASM_DIALECT}_COMPILER_SYSROOT)
   string(CONCAT _SET_CMAKE_ASM_COMPILER_SYSROOT
     "set(CMAKE_ASM${ASM_DIALECT}_COMPILER_SYSROOT \"${CMAKE_ASM${ASM_DIALECT}_COMPILER_SYSROOT}\")\n"
@@ -265,25 +253,21 @@ else()
   set(_SET_CMAKE_ASM_COMPILER_ID_VENDOR_MATCH "")
 endif()
 
-if(CMAKE_ASM${ASM_DIALECT}_COMPILER_ARCHITECTURE_ID)
-  set(_SET_CMAKE_ASM_COMPILER_ARCHITECTURE_ID
-    "set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ARCHITECTURE_ID ${CMAKE_ASM${ASM_DIALECT}_COMPILER_ARCHITECTURE_ID})")
-else()
-  set(_SET_CMAKE_ASM_COMPILER_ARCHITECTURE_ID "")
-endif()
-
 # configure variables set in this file for fast reload later on
-configure_file(${CMAKE_ROOT}/Modules/CMakeASMCompiler.cmake.in
-  ${CMAKE_PLATFORM_INFO_DIR}/CMakeASM${ASM_DIALECT}Compiler.cmake @ONLY)
-
-foreach(_var
-    COMPILER
-    COMPILER_ID
-    COMPILER_ARG1
-    COMPILER_ENV_VAR
-    COMPILER_AR
-    COMPILER_RANLIB
-    COMPILER_VERSION
-    )
-  unset(_CMAKE_ASM_${_var})
-endforeach()
+block()
+  foreach(_var IN ITEMS
+      # Keep in sync with Internal/CMakeTestASMLinker.
+      COMPILER
+      COMPILER_ID
+      COMPILER_ARG1
+      COMPILER_ENV_VAR
+      COMPILER_AR
+      COMPILER_RANLIB
+      COMPILER_VERSION
+      COMPILER_ARCHITECTURE_ID
+      )
+    set(_CMAKE_ASM_${_var} "${CMAKE_ASM${ASM_DIALECT}_${_var}}")
+  endforeach()
+  configure_file(${CMAKE_ROOT}/Modules/CMakeASMCompiler.cmake.in
+    ${CMAKE_PLATFORM_INFO_DIR}/CMakeASM${ASM_DIALECT}Compiler.cmake @ONLY)
+endblock()

+ 0 - 7
Modules/CMakeDetermineCCompiler.cmake

@@ -210,13 +210,6 @@ else()
   set(_SET_CMAKE_C_COMPILER_SYSROOT "")
 endif()
 
-if(CMAKE_C_COMPILER_ARCHITECTURE_ID)
-  set(_SET_CMAKE_C_COMPILER_ARCHITECTURE_ID
-    "set(CMAKE_C_COMPILER_ARCHITECTURE_ID ${CMAKE_C_COMPILER_ARCHITECTURE_ID})")
-else()
-  set(_SET_CMAKE_C_COMPILER_ARCHITECTURE_ID "")
-endif()
-
 if(MSVC_C_ARCHITECTURE_ID)
   set(SET_MSVC_C_ARCHITECTURE_ID
     "set(MSVC_C_ARCHITECTURE_ID ${MSVC_C_ARCHITECTURE_ID})")

+ 0 - 7
Modules/CMakeDetermineCXXCompiler.cmake

@@ -216,13 +216,6 @@ else()
   set(_SET_CMAKE_CXX_COMPILER_SYSROOT "")
 endif()
 
-if(CMAKE_CXX_COMPILER_ARCHITECTURE_ID)
-  set(_SET_CMAKE_CXX_COMPILER_ARCHITECTURE_ID
-    "set(CMAKE_CXX_COMPILER_ARCHITECTURE_ID ${CMAKE_CXX_COMPILER_ARCHITECTURE_ID})")
-else()
-  set(_SET_CMAKE_CXX_COMPILER_ARCHITECTURE_ID "")
-endif()
-
 if(MSVC_CXX_ARCHITECTURE_ID)
   set(SET_MSVC_CXX_ARCHITECTURE_ID
     "set(MSVC_CXX_ARCHITECTURE_ID ${MSVC_CXX_ARCHITECTURE_ID})")

+ 26 - 0
Modules/CMakeDetermineCompilerABI.cmake

@@ -150,6 +150,7 @@ function(CMAKE_DETERMINE_COMPILER_ABI lang src)
       set(ABI_SIZEOF_DPTR "NOTFOUND")
       set(ABI_BYTE_ORDER "NOTFOUND")
       set(ABI_NAME "NOTFOUND")
+      set(ARCHITECTURE_ID "")
       foreach(info ${ABI_STRINGS})
         if("${info}" MATCHES "INFO:sizeof_dptr\\[0*([^]]*)\\]" AND NOT ABI_SIZEOF_DPTR)
           set(ABI_SIZEOF_DPTR "${CMAKE_MATCH_1}")
@@ -167,6 +168,9 @@ function(CMAKE_DETERMINE_COMPILER_ABI lang src)
         if("${info}" MATCHES "INFO:abi\\[([^]]*)\\]" AND NOT ABI_NAME)
           set(ABI_NAME "${CMAKE_MATCH_1}")
         endif()
+        if("${info}" MATCHES "INFO:arch\\[([^]\"]*)\\]")
+          list(APPEND ARCHITECTURE_ID "${CMAKE_MATCH_1}")
+        endif()
       endforeach()
 
       if(ABI_SIZEOF_DPTR)
@@ -183,6 +187,28 @@ function(CMAKE_DETERMINE_COMPILER_ABI lang src)
         set(CMAKE_${lang}_COMPILER_ABI "${ABI_NAME}" PARENT_SCOPE)
       endif()
 
+      # The GNU Fortran compiler does not predefine architecture macros.
+      if(NOT CMAKE_${lang}_COMPILER_ARCHITECTURE_ID AND NOT ARCHITECTURE_ID
+         AND lang STREQUAL "Fortran" AND CMAKE_${lang}_COMPILER_ID STREQUAL "GNU")
+        execute_process(COMMAND "${CMAKE_${lang}_COMPILER}" -dumpmachine
+          OUTPUT_VARIABLE _dumpmachine_triple OUTPUT_STRIP_TRAILING_WHITESPACE
+          ERROR_VARIABLE  _dumpmachine_stderr
+          RESULT_VARIABLE _dumpmachine_result
+          )
+        if(_dumpmachine_result EQUAL 0)
+          include(Internal/CMakeParseCompilerArchitectureId)
+          cmake_parse_compiler_architecture_id("${_dumpmachine_triple}" ARCHITECTURE_ID)
+        endif()
+      endif()
+
+      # For some compilers we detect the architecture id during compiler identification.
+      # If this was not one of those, use what was detected during compiler ABI detection,
+      # which might be a list, e.g., when CMAKE_OSX_ARCHITECTURES has multiple values.
+      if(NOT CMAKE_${lang}_COMPILER_ARCHITECTURE_ID AND ARCHITECTURE_ID)
+        list(SORT ARCHITECTURE_ID)
+        set(CMAKE_${lang}_COMPILER_ARCHITECTURE_ID "${ARCHITECTURE_ID}" PARENT_SCOPE)
+      endif()
+
       # Parse implicit include directory for this language, if available.
       if(CMAKE_${lang}_VERBOSE_FLAG)
         set (implicit_incdirs "")

+ 0 - 7
Modules/CMakeDetermineFortranCompiler.cmake

@@ -327,13 +327,6 @@ else()
   set(_SET_CMAKE_Fortran_COMPILER_SYSROOT "")
 endif()
 
-if(CMAKE_Fortran_COMPILER_ARCHITECTURE_ID)
-  set(_SET_CMAKE_Fortran_COMPILER_ARCHITECTURE_ID
-    "set(CMAKE_Fortran_COMPILER_ARCHITECTURE_ID ${CMAKE_Fortran_COMPILER_ARCHITECTURE_ID})")
-else()
-  set(_SET_CMAKE_Fortran_COMPILER_ARCHITECTURE_ID "")
-endif()
-
 if(MSVC_Fortran_ARCHITECTURE_ID)
   set(SET_MSVC_Fortran_ARCHITECTURE_ID
     "set(MSVC_Fortran_ARCHITECTURE_ID ${MSVC_Fortran_ARCHITECTURE_ID})")

+ 0 - 7
Modules/CMakeDetermineHIPCompiler.cmake

@@ -268,13 +268,6 @@ else()
   set(_SET_CMAKE_HIP_COMPILER_SYSROOT "")
 endif()
 
-if(CMAKE_HIP_COMPILER_ARCHITECTURE_ID)
-  set(_SET_CMAKE_HIP_COMPILER_ARCHITECTURE_ID
-    "set(CMAKE_HIP_COMPILER_ARCHITECTURE_ID ${CMAKE_HIP_COMPILER_ARCHITECTURE_ID})")
-else()
-  set(_SET_CMAKE_HIP_COMPILER_ARCHITECTURE_ID "")
-endif()
-
 if(MSVC_HIP_ARCHITECTURE_ID)
   set(SET_MSVC_HIP_ARCHITECTURE_ID
     "set(MSVC_HIP_ARCHITECTURE_ID ${MSVC_HIP_ARCHITECTURE_ID})")

+ 0 - 7
Modules/CMakeDetermineOBJCCompiler.cmake

@@ -169,13 +169,6 @@ include(CMakeFindBinUtils)
 include(Compiler/${CMAKE_OBJC_COMPILER_ID}-FindBinUtils OPTIONAL)
 unset(_CMAKE_PROCESSING_LANGUAGE)
 
-if(CMAKE_OBJC_COMPILER_ARCHITECTURE_ID)
-  set(_SET_CMAKE_OBJC_COMPILER_ARCHITECTURE_ID
-    "set(CMAKE_OBJC_COMPILER_ARCHITECTURE_ID ${CMAKE_OBJC_COMPILER_ARCHITECTURE_ID})")
-else()
-  set(_SET_CMAKE_OBJC_COMPILER_ARCHITECTURE_ID "")
-endif()
-
 if(CMAKE_OBJC_XCODE_ARCHS)
   set(SET_CMAKE_XCODE_ARCHS
     "set(CMAKE_XCODE_ARCHS \"${CMAKE_OBJC_XCODE_ARCHS}\")")

+ 0 - 7
Modules/CMakeDetermineOBJCXXCompiler.cmake

@@ -176,13 +176,6 @@ include(CMakeFindBinUtils)
 include(Compiler/${CMAKE_OBJCXX_COMPILER_ID}-FindBinUtils OPTIONAL)
 unset(_CMAKE_PROCESSING_LANGUAGE)
 
-if(CMAKE_OBJCXX_COMPILER_ARCHITECTURE_ID)
-  set(_SET_CMAKE_OBJCXX_COMPILER_ARCHITECTURE_ID
-    "set(CMAKE_OBJCXX_COMPILER_ARCHITECTURE_ID ${CMAKE_OBJCXX_COMPILER_ARCHITECTURE_ID})")
-else()
-  set(_SET_CMAKE_OBJCXX_COMPILER_ARCHITECTURE_ID "")
-endif()
-
 if(CMAKE_OBJCXX_XCODE_ARCHS)
   set(SET_CMAKE_XCODE_ARCHS
     "set(CMAKE_XCODE_ARCHS \"${CMAKE_OBJCXX_XCODE_ARCHS}\")")

+ 1 - 1
Modules/CMakeFortranCompiler.cmake.in

@@ -8,7 +8,7 @@ set(CMAKE_Fortran_SIMULATE_ID "@CMAKE_Fortran_SIMULATE_ID@")
 set(CMAKE_Fortran_COMPILER_FRONTEND_VARIANT "@CMAKE_Fortran_COMPILER_FRONTEND_VARIANT@")
 set(CMAKE_Fortran_SIMULATE_VERSION "@CMAKE_Fortran_SIMULATE_VERSION@")
 @_SET_CMAKE_Fortran_XL_CPP@
-@_SET_CMAKE_Fortran_COMPILER_ARCHITECTURE_ID@
+set(CMAKE_Fortran_COMPILER_ARCHITECTURE_ID "@CMAKE_Fortran_COMPILER_ARCHITECTURE_ID@")
 @_SET_CMAKE_Fortran_COMPILER_SYSROOT@
 @SET_MSVC_Fortran_ARCHITECTURE_ID@
 set(CMAKE_AR "@CMAKE_AR@")

+ 107 - 0
Modules/CMakeFortranCompilerABI.F

@@ -12,6 +12,8 @@
         PRINT *, 'INFO:sizeof_dptr[8]'
 #elif defined(__x86_64__)
         PRINT *, 'INFO:sizeof_dptr[8]'
+#elif defined(__sparcv9) || defined(__sparcv9__) || defined(__sparc64__)
+        PRINT *, 'INFO:sizeof_dptr[8]'
 
 #elif defined(_ILP32)
         PRINT *, 'INFO:sizeof_dptr[4]'
@@ -19,6 +21,8 @@
         PRINT *, 'INFO:sizeof_dptr[4]'
 #elif defined(__i386__)
         PRINT *, 'INFO:sizeof_dptr[4]'
+#elif defined(__sparc) || defined(__sparc__)
+        PRINT *, 'INFO:sizeof_dptr[4]'
 
 #elif defined(__SIZEOF_POINTER__) && __SIZEOF_POINTER__ == 8
         PRINT *, 'INFO:sizeof_dptr[8]'
@@ -36,5 +40,108 @@
 #if defined(__ELF__)
         PRINT *, 'INFO:abi[ELF]'
 #endif
+
+#if 0
+! Sync with
+!   Help/variable/CMAKE_LANG_COMPILER_ARCHITECTURE_ID.rst
+!   Modules/CMakeCompilerABI.h
+!   Modules/CMakeFortranCompilerABI.F90
+!   Modules/Internal/CMakeParseCompilerArchitectureId.cmake
+#endif
+#if defined(__APPLE__) && defined(__arm64__)
+#  if defined(__ARM64_ARCH_8_32__)
+        PRINT *, 'INFO:arch[arm64_32]'
+#  elif defined(__arm64e__)
+        PRINT *, 'INFO:arch[arm64e]'
+#  else
+        PRINT *, 'INFO:arch[arm64]'
+#  endif
+#elif defined(_MSC_VER) && defined(_M_ARM64EC)
+        PRINT *, 'INFO:arch[arm64ec]'
+#elif defined(_MSC_VER) && defined(_M_ARM64)
+        PRINT *, 'INFO:arch[arm64]'
+#elif defined(__arm64ec__)
+        PRINT *, 'INFO:arch[arm64ec]'
+#elif defined(__aarch64__)
+        PRINT *, 'INFO:arch[aarch64]'
+#elif __ARM_ARCH == 7 || _M_ARM == 7 || defined(__ARM_ARCH_7__)
+#  if defined(__APPLE__) && defined(__ARM_ARCH_7K__)
+        PRINT *, 'INFO:arch[armv7k]'
+#  elif defined(__APPLE__) && defined(__ARM_ARCH_7S__)
+        PRINT *, 'INFO:arch[armv7s]'
+#  else
+        PRINT *, 'INFO:arch[armv7]'
+#  endif
+#elif __ARM_ARCH == 6 || _M_ARM == 6 || defined(__ARM_ARCH_6__)
+        PRINT *, 'INFO:arch[armv6]'
+#elif __ARM_ARCH == 5 || _M_ARM == 5 || defined(__ARM_ARCH_5__)
+        PRINT *, 'INFO:arch[armv5]'
+#elif defined(__alpha) || defined(__alpha) || defined(_M_ALPHA)
+        PRINT *, 'INFO:arch[alpha]'
+#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) ||         \
+  defined(__amd64__) || defined(_M_X64) || defined(_M_AMD64)
+        PRINT *, 'INFO:arch[x86_64]'
+#elif defined(__i686) || defined(__i686__) || _M_IX86 == 600
+        PRINT *, 'INFO:arch[i686]'
+#elif defined(__i586) || defined(__i586__) || _M_IX86 == 500
+        PRINT *, 'INFO:arch[i586]'
+#elif defined(__i486) || defined(__i486__) || _M_IX86 == 400
+        PRINT *, 'INFO:arch[i486]'
+#elif defined(__i386) || defined(__i386__) || defined(_M_IX86)
+        PRINT *, 'INFO:arch[i386]'
+#elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
+        PRINT *, 'INFO:arch[ia64]'
+#elif defined(__loongarch64)
+        PRINT *, 'INFO:arch[loongarch64]'
+#elif defined(__loongarch__)
+        PRINT *, 'INFO:arch[loongarch32]'
+#elif defined(__m68k__)
+        PRINT *, 'INFO:arch[m68k]'
+#elif defined(__mips64) || defined(__mips64__)
+#  if defined(_MIPSEL)
+        PRINT *, 'INFO:arch[mips64el]'
+#  else
+        PRINT *, 'INFO:arch[mips64]'
+#  endif
+#elif defined(__mips) || defined(__mips__)
+#  if defined(_MIPSEL)
+        PRINT *, 'INFO:arch[mipsel]'
+#  else
+        PRINT *, 'INFO:arch[mips]'
+#  endif
+#elif defined(__riscv) && __riscv_xlen == 64
+        PRINT *, 'INFO:arch[riscv64]'
+#elif defined(__riscv) && __riscv_xlen == 32
+        PRINT *, 'INFO:arch[riscv32]'
+#elif defined(__s390x__)
+        PRINT *, 'INFO:arch[s390x]'
+#elif defined(__s390__)
+        PRINT *, 'INFO:arch[s390]'
+#elif defined(__sparcv9) || defined(__sparcv9__) || defined(__sparc64__)
+        PRINT *, 'INFO:arch[sparcv9]'
+#elif defined(__sparc) || defined(__sparc__)
+        PRINT *, 'INFO:arch[sparc]'
+#elif defined(__hppa) || defined(__hppa__)
+#  if defined(__LP64__)
+        PRINT *, 'INFO:arch[parisc64]'
+#  else
+        PRINT *, 'INFO:arch[parisc]'
+#  endif
+#elif defined(__ppc64__) || defined(__powerpc64__) || defined(__PPC64__) ||   \
+  defined(_ARCH_PPC64)
+#  if defined(_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN__)
+        PRINT *, 'INFO:arch[ppc64le]'
+#  else
+        PRINT *, 'INFO:arch[ppc64]'
+#  endif
+#elif defined(__ppc__) || defined(__powerpc__) || defined(__PPC__) ||         \
+  defined(_ARCH_PPC)
+#  if defined(_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN__)
+        PRINT *, 'INFO:arch[ppcle]'
+#  else
+        PRINT *, 'INFO:arch[ppc]'
+#  endif
+#endif
+
         PRINT *, 'ABI Detection'
       END

+ 107 - 0
Modules/CMakeFortranCompilerABI.F90

@@ -20,6 +20,8 @@ PRINT *, 'INFO:sizeof_dptr[8]'
 PRINT *, 'INFO:sizeof_dptr[8]'
 #elif defined(__x86_64__)
 PRINT *, 'INFO:sizeof_dptr[8]'
+#elif defined(__sparcv9) || defined(__sparcv9__) || defined(__sparc64__)
+PRINT *, 'INFO:sizeof_dptr[8]'
 
 #elif defined(_ILP32)
 PRINT *, 'INFO:sizeof_dptr[4]'
@@ -27,6 +29,8 @@ PRINT *, 'INFO:sizeof_dptr[4]'
 PRINT *, 'INFO:sizeof_dptr[4]'
 #elif defined(__i386__)
 PRINT *, 'INFO:sizeof_dptr[4]'
+#elif defined(__sparc) || defined(__sparc__)
+PRINT *, 'INFO:sizeof_dptr[4]'
 
 #elif defined(__SIZEOF_POINTER__) && __SIZEOF_POINTER__ == 8
 PRINT *, 'INFO:sizeof_dptr[8]'
@@ -44,5 +48,108 @@ PRINT *, 'INFO:sizeof_dptr[4]'
 #if defined(__ELF__)
 PRINT *, 'INFO:abi[ELF]'
 #endif
+
+#if 0
+! Sync with
+!   Help/variable/CMAKE_LANG_COMPILER_ARCHITECTURE_ID.rst
+!   Modules/CMakeCompilerABI.h
+!   Modules/CMakeFortranCompilerABI.F
+!   Modules/Internal/CMakeParseCompilerArchitectureId.cmake
+#endif
+#if defined(__APPLE__) && defined(__arm64__)
+#  if defined(__ARM64_ARCH_8_32__)
+PRINT *, 'INFO:arch[arm64_32]'
+#  elif defined(__arm64e__)
+PRINT *, 'INFO:arch[arm64e]'
+#  else
+PRINT *, 'INFO:arch[arm64]'
+#  endif
+#elif defined(_MSC_VER) && defined(_M_ARM64EC)
+PRINT *, 'INFO:arch[arm64ec]'
+#elif defined(_MSC_VER) && defined(_M_ARM64)
+PRINT *, 'INFO:arch[arm64]'
+#elif defined(__arm64ec__)
+PRINT *, 'INFO:arch[arm64ec]'
+#elif defined(__aarch64__)
+PRINT *, 'INFO:arch[aarch64]'
+#elif __ARM_ARCH == 7 || _M_ARM == 7 || defined(__ARM_ARCH_7__)
+#  if defined(__APPLE__) && defined(__ARM_ARCH_7K__)
+PRINT *, 'INFO:arch[armv7k]'
+#  elif defined(__APPLE__) && defined(__ARM_ARCH_7S__)
+PRINT *, 'INFO:arch[armv7s]'
+#  else
+PRINT *, 'INFO:arch[armv7]'
+#  endif
+#elif __ARM_ARCH == 6 || _M_ARM == 6 || defined(__ARM_ARCH_6__)
+PRINT *, 'INFO:arch[armv6]'
+#elif __ARM_ARCH == 5 || _M_ARM == 5 || defined(__ARM_ARCH_5__)
+PRINT *, 'INFO:arch[armv5]'
+#elif defined(__alpha) || defined(__alpha) || defined(_M_ALPHA)
+PRINT *, 'INFO:arch[alpha]'
+#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) ||         \
+  defined(__amd64__) || defined(_M_X64) || defined(_M_AMD64)
+PRINT *, 'INFO:arch[x86_64]'
+#elif defined(__i686) || defined(__i686__) || _M_IX86 == 600
+PRINT *, 'INFO:arch[i686]'
+#elif defined(__i586) || defined(__i586__) || _M_IX86 == 500
+PRINT *, 'INFO:arch[i586]'
+#elif defined(__i486) || defined(__i486__) || _M_IX86 == 400
+PRINT *, 'INFO:arch[i486]'
+#elif defined(__i386) || defined(__i386__) || defined(_M_IX86)
+PRINT *, 'INFO:arch[i386]'
+#elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
+PRINT *, 'INFO:arch[ia64]'
+#elif defined(__loongarch64)
+PRINT *, 'INFO:arch[loongarch64]'
+#elif defined(__loongarch__)
+PRINT *, 'INFO:arch[loongarch32]'
+#elif defined(__m68k__)
+PRINT *, 'INFO:arch[m68k]'
+#elif defined(__mips64) || defined(__mips64__)
+#  if defined(_MIPSEL)
+PRINT *, 'INFO:arch[mips64el]'
+#  else
+PRINT *, 'INFO:arch[mips64]'
+#  endif
+#elif defined(__mips) || defined(__mips__)
+#  if defined(_MIPSEL)
+PRINT *, 'INFO:arch[mipsel]'
+#  else
+PRINT *, 'INFO:arch[mips]'
+#  endif
+#elif defined(__riscv) && __riscv_xlen == 64
+PRINT *, 'INFO:arch[riscv64]'
+#elif defined(__riscv) && __riscv_xlen == 32
+PRINT *, 'INFO:arch[riscv32]'
+#elif defined(__s390x__)
+PRINT *, 'INFO:arch[s390x]'
+#elif defined(__s390__)
+PRINT *, 'INFO:arch[s390]'
+#elif defined(__sparcv9) || defined(__sparcv9__) || defined(__sparc64__)
+PRINT *, 'INFO:arch[sparcv9]'
+#elif defined(__sparc) || defined(__sparc__)
+PRINT *, 'INFO:arch[sparc]'
+#elif defined(__hppa) || defined(__hppa__)
+#  if defined(__LP64__)
+PRINT *, 'INFO:arch[parisc64]'
+#  else
+PRINT *, 'INFO:arch[parisc]'
+#  endif
+#elif defined(__ppc64__) || defined(__powerpc64__) || defined(__PPC64__) ||   \
+  defined(_ARCH_PPC64)
+#  if defined(_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN__)
+PRINT *, 'INFO:arch[ppc64le]'
+#  else
+PRINT *, 'INFO:arch[ppc64]'
+#  endif
+#elif defined(__ppc__) || defined(__powerpc__) || defined(__PPC__) ||         \
+  defined(_ARCH_PPC)
+#  if defined(_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN__)
+PRINT *, 'INFO:arch[ppcle]'
+#  else
+PRINT *, 'INFO:arch[ppc]'
+#  endif
+#endif
+
 PRINT *, 'ABI Detection'
 end program

+ 1 - 0
Modules/CMakeHIPCompiler.cmake.in

@@ -21,6 +21,7 @@ set(CMAKE_HIP_PLATFORM_ID "@CMAKE_HIP_PLATFORM_ID@")
 set(CMAKE_HIP_SIMULATE_ID "@CMAKE_HIP_SIMULATE_ID@")
 set(CMAKE_HIP_COMPILER_FRONTEND_VARIANT "@CMAKE_HIP_COMPILER_FRONTEND_VARIANT@")
 set(CMAKE_HIP_SIMULATE_VERSION "@CMAKE_HIP_SIMULATE_VERSION@")
+set(CMAKE_HIP_COMPILER_ARCHITECTURE_ID "@CMAKE_HIP_COMPILER_ARCHITECTURE_ID@")
 @SET_MSVC_HIP_ARCHITECTURE_ID@
 @_SET_CMAKE_HIP_COMPILER_SYSROOT@
 set(CMAKE_HIP_COMPILER_ROCM_ROOT "@CMAKE_HIP_COMPILER_ROCM_ROOT@")

+ 3 - 0
Modules/CMakeHIPCompilerABI.hip

@@ -14,6 +14,9 @@ int main(int argc, char* argv[])
   require += info_sizeof_dptr[argc];
 #if defined(ABI_ID)
   require += info_abi[argc];
+#endif
+#if defined(ARCHITECTURE_ID)
+  require += info_arch[argc];
 #endif
   static_cast<void>(argv);
 

+ 1 - 1
Modules/CMakeOBJCCompiler.cmake.in

@@ -18,7 +18,7 @@ set(CMAKE_OBJC_PLATFORM_ID "@CMAKE_OBJC_PLATFORM_ID@")
 set(CMAKE_OBJC_SIMULATE_ID "@CMAKE_OBJC_SIMULATE_ID@")
 set(CMAKE_OBJC_COMPILER_FRONTEND_VARIANT "@CMAKE_OBJC_COMPILER_FRONTEND_VARIANT@")
 set(CMAKE_OBJC_SIMULATE_VERSION "@CMAKE_OBJC_SIMULATE_VERSION@")
-@_SET_CMAKE_OBJC_COMPILER_ARCHITECTURE_ID@
+set(CMAKE_OBJC_COMPILER_ARCHITECTURE_ID "@CMAKE_OBJC_COMPILER_ARCHITECTURE_ID@")
 @SET_CMAKE_XCODE_ARCHS@
 set(CMAKE_AR "@CMAKE_AR@")
 set(CMAKE_OBJC_COMPILER_AR "@CMAKE_OBJC_COMPILER_AR@")

+ 3 - 0
Modules/CMakeOBJCCompilerABI.m

@@ -16,6 +16,9 @@ int main(int argc, char *argv[])
   require += info_byte_order_little_endian[argc];
 #if defined(ABI_ID)
   require += info_abi[argc];
+#endif
+#if defined(ARCHITECTURE_ID)
+  require += info_arch[argc];
 #endif
   (void)argv;
   return require;

+ 1 - 1
Modules/CMakeOBJCXXCompiler.cmake.in

@@ -19,7 +19,7 @@ set(CMAKE_OBJCXX_PLATFORM_ID "@CMAKE_OBJCXX_PLATFORM_ID@")
 set(CMAKE_OBJCXX_SIMULATE_ID "@CMAKE_OBJCXX_SIMULATE_ID@")
 set(CMAKE_OBJCXX_COMPILER_FRONTEND_VARIANT "@CMAKE_OBJCXX_COMPILER_FRONTEND_VARIANT@")
 set(CMAKE_OBJCXX_SIMULATE_VERSION "@CMAKE_OBJCXX_SIMULATE_VERSION@")
-@_SET_CMAKE_OBJCXX_COMPILER_ARCHITECTURE_ID@
+set(CMAKE_OBJCXX_COMPILER_ARCHITECTURE_ID "@CMAKE_OBJCXX_COMPILER_ARCHITECTURE_ID@")
 @SET_CMAKE_XCODE_ARCHS@
 set(CMAKE_AR "@CMAKE_AR@")
 set(CMAKE_OBJCXX_COMPILER_AR "@CMAKE_OBJCXX_COMPILER_AR@")

+ 3 - 0
Modules/CMakeOBJCXXCompilerABI.mm

@@ -16,6 +16,9 @@ int main(int argc, char *argv[])
   require += info_byte_order_little_endian[argc];
 #if defined(ABI_ID)
   require += info_abi[argc];
+#endif
+#if defined(ARCHITECTURE_ID)
+  require += info_arch[argc];
 #endif
   (void)argv;
   return require;

+ 4 - 0
Modules/Internal/CMakeInspectASMLinker.cmake

@@ -4,6 +4,8 @@
 # Re-configure to save learned information.
 block()
   foreach(_var IN ITEMS
+      # Compiler information.
+      # Keep in sync with CMakeDetermineASMCompiler.
       COMPILER
       COMPILER_ID
       COMPILER_ARG1
@@ -11,6 +13,8 @@ block()
       COMPILER_AR
       COMPILER_RANLIB
       COMPILER_VERSION
+      COMPILER_ARCHITECTURE_ID
+      # Linker information.
       COMPILER_LINKER
       COMPILER_LINKER_ID
       COMPILER_LINKER_VERSION

+ 74 - 0
Modules/Internal/CMakeParseCompilerArchitectureId.cmake

@@ -0,0 +1,74 @@
+# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+# file LICENSE.rst or https://cmake.org/licensing for details.
+
+function(cmake_parse_compiler_architecture_id triple arch_id_var)
+  # Sync with:
+  #   Help/variable/CMAKE_LANG_COMPILER_ARCHITECTURE_ID.rst
+  #   Modules/CMakeCompilerABI.h
+  #   Modules/CMakeFortranCompilerABI.F
+  #   Modules/CMakeFortranCompilerABI.F90
+  if(_dumpmachine_triple MATCHES "^(aarch64|arm64)-apple-")
+    set(ARCHITECTURE_ID "arm64")
+  elseif(_dumpmachine_triple MATCHES "^(aarch64|arm64)_32-apple-")
+    set(ARCHITECTURE_ID "arm64_32")
+  elseif(_dumpmachine_triple MATCHES "^(aarch64|arm64)e-apple-")
+    set(ARCHITECTURE_ID "arm64e")
+  elseif(_dumpmachine_triple MATCHES "^(armv7k|armv7s)-apple-")
+    set(ARCHITECTURE_ID "${CMAKE_MATCH_1}")
+  elseif(_dumpmachine_triple MATCHES "^(aarch64|arm64)-")
+    set(ARCHITECTURE_ID "aarch64")
+  elseif(_dumpmachine_triple MATCHES "^(armv[5-7])[^-]*-")
+    set(ARCHITECTURE_ID "${CMAKE_MATCH_1}")
+  elseif(_dumpmachine_triple MATCHES "^alpha[^-]*-")
+    set(ARCHITECTURE_ID "alpha")
+  elseif(_dumpmachine_triple MATCHES "^(x86_64|amd64)-")
+    set(ARCHITECTURE_ID "x86_64")
+  elseif(_dumpmachine_triple MATCHES "^(i[3-6]86)-")
+    set(ARCHITECTURE_ID "${CMAKE_MATCH_1}")
+  elseif(_dumpmachine_triple MATCHES "^ia64-")
+    set(ARCHITECTURE_ID "ia64")
+  elseif(_dumpmachine_triple MATCHES "^loongarch64-")
+    set(ARCHITECTURE_ID "loongarch64")
+  elseif(_dumpmachine_triple MATCHES "^loongarch(32)?-")
+    set(ARCHITECTURE_ID "loongarch32")
+  elseif(_dumpmachine_triple MATCHES "^m68k-")
+    set(ARCHITECTURE_ID "m68k")
+  elseif(_dumpmachine_triple MATCHES "^mingw32$") # MinGW/MSYS 1.0: http://mingw.osdn.io/
+    set(ARCHITECTURE_ID "i386")
+  elseif(_dumpmachine_triple MATCHES "^mips[^-]*64[^-]*el-")
+    set(ARCHITECTURE_ID "mips64el")
+  elseif(_dumpmachine_triple MATCHES "^mips[^-]*64[^-]*-")
+    set(ARCHITECTURE_ID "mips64")
+  elseif(_dumpmachine_triple MATCHES "^mips[^-]*el[^-]*-")
+    set(ARCHITECTURE_ID "mipsel")
+  elseif(_dumpmachine_triple MATCHES "^mips[^-]*-")
+    set(ARCHITECTURE_ID "mips")
+  elseif(_dumpmachine_triple MATCHES "^riscv64-")
+    set(ARCHITECTURE_ID "riscv64")
+  elseif(_dumpmachine_triple MATCHES "^riscv32-")
+    set(ARCHITECTURE_ID "riscv32")
+  elseif(_dumpmachine_triple MATCHES "^s390x-")
+    set(ARCHITECTURE_ID "s390x")
+  elseif(_dumpmachine_triple MATCHES "^s390-")
+    set(ARCHITECTURE_ID "s390")
+  elseif(_dumpmachine_triple MATCHES "^(sparcv9|sparc64)-")
+    set(ARCHITECTURE_ID "sparcv9")
+  elseif(_dumpmachine_triple MATCHES "^sparc-")
+    set(ARCHITECTURE_ID "sparc")
+  elseif(_dumpmachine_triple MATCHES "^(hppa64|parisc64)-")
+    set(ARCHITECTURE_ID "parisc64")
+  elseif(_dumpmachine_triple MATCHES "^(hppa[0-9.]*|parisc)-")
+    set(ARCHITECTURE_ID "parisc")
+  elseif(_dumpmachine_triple MATCHES "^(powerpc64le|ppc64le)-")
+    set(ARCHITECTURE_ID "ppc64le")
+  elseif(_dumpmachine_triple MATCHES "^(powerpc64|ppc64)-")
+    set(ARCHITECTURE_ID "ppc64")
+  elseif(_dumpmachine_triple MATCHES "^(powerpcle|ppcle)-")
+    set(ARCHITECTURE_ID "ppcle")
+  elseif(_dumpmachine_triple MATCHES "^(powerpc|ppc)-")
+    set(ARCHITECTURE_ID "ppc")
+  else()
+    set(ARCHITECTURE_ID "")
+  endif()
+  set("${arch_id_var}" "${ARCHITECTURE_ID}" PARENT_SCOPE)
+endfunction()

+ 1 - 1
Modules/Platform/Windows-Clang.cmake

@@ -228,7 +228,7 @@ if("x${CMAKE_C_SIMULATE_ID}" STREQUAL "xMSVC"
       set(CMAKE_INCLUDE_SYSTEM_FLAG_${lang} "-imsvc")
 
       set(CMAKE_${lang}_LINK_MODE LINKER)
-endmacro()
+    endmacro()
   else()
     cmake_policy(GET CMP0091 __WINDOWS_CLANG_CMP0091)
     if(__WINDOWS_CLANG_CMP0091 STREQUAL "NEW")

+ 7 - 1
Modules/SystemInformation.in

@@ -18,8 +18,14 @@ CMAKE_SKIP_RPATH == "${CMAKE_SKIP_RPATH}"
 CMAKE_SYSTEM_INFO_FILE == "${CMAKE_SYSTEM_INFO_FILE}"
 CMAKE_SYSTEM_NAME == "${CMAKE_SYSTEM_NAME}"
 CMAKE_SYSTEM == "${CMAKE_SYSTEM}"
-CMAKE_CXX_COMPILER == "${CMAKE_CXX_COMPILER}"
 CMAKE_C_COMPILER == "${CMAKE_C_COMPILER}"
+CMAKE_C_COMPILER_ID == "${CMAKE_C_COMPILER_ID}"
+CMAKE_C_COMPILER_VERSION == "${CMAKE_C_COMPILER_VERSION}"
+CMAKE_C_COMPILER_ARCHITECTURE_ID == "${CMAKE_C_COMPILER_ARCHITECTURE_ID}"
+CMAKE_CXX_COMPILER == "${CMAKE_CXX_COMPILER}"
+CMAKE_CXX_COMPILER_ID == "${CMAKE_CXX_COMPILER_ID}"
+CMAKE_CXX_COMPILER_VERSION == "${CMAKE_CXX_COMPILER_VERSION}"
+CMAKE_CXX_COMPILER_ARCHITECTURE_ID == "${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}"
 CMAKE_COMPILER_IS_GNUCC == "${CMAKE_COMPILER_IS_GNUCC}"
 CMAKE_COMPILER_IS_GNUCXX == "${CMAKE_COMPILER_IS_GNUCXX}"
 

+ 1 - 0
Tests/RunCMake/CompilerId/C-stdout.txt

@@ -1,3 +1,4 @@
 -- CMAKE_C_COMPILER='[^']+'
 -- CMAKE_C_COMPILER_ID='[A-Za-z]+'
 -- CMAKE_C_COMPILER_VERSION='([0-9]+)(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?'
+-- CMAKE_C_COMPILER_ARCHITECTURE_ID='[A-Za-z0-9_;]+'

+ 1 - 0
Tests/RunCMake/CompilerId/C.cmake

@@ -2,3 +2,4 @@ enable_language(C)
 message(STATUS "CMAKE_C_COMPILER='${CMAKE_C_COMPILER}'")
 message(STATUS "CMAKE_C_COMPILER_ID='${CMAKE_C_COMPILER_ID}'")
 message(STATUS "CMAKE_C_COMPILER_VERSION='${CMAKE_C_COMPILER_VERSION}'")
+message(STATUS "CMAKE_C_COMPILER_ARCHITECTURE_ID='${CMAKE_C_COMPILER_ARCHITECTURE_ID}'")

+ 2 - 0
Tests/RunCMake/CompilerId/CUDA-stdout.txt

@@ -1,11 +1,13 @@
 (-- CMAKE_CUDA_COMPILER='[^']+'
 -- CMAKE_CUDA_COMPILER_ID='NVIDIA'
 -- CMAKE_CUDA_COMPILER_VERSION='([0-9]+)(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?'
+-- CMAKE_CUDA_COMPILER_ARCHITECTURE_ID='[A-Za-z0-9_;]+'
 -- CMAKE_CUDA_HOST_COMPILER_ID='[A-Za-z]+'
 -- CMAKE_CUDA_HOST_COMPILER_VERSION='([0-9]+)(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?'
 |-- CMAKE_CUDA_COMPILER='[^']+'
 -- CMAKE_CUDA_COMPILER_ID='([^N]|N[^V]|NV[^I]|NVI[^D]|NVID[^I]|NVIDI[^A])[A-Za-z]*'
 -- CMAKE_CUDA_COMPILER_VERSION='([0-9]+)(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?'
+-- CMAKE_CUDA_COMPILER_ARCHITECTURE_ID='[A-Za-z0-9_;]+'
 -- CMAKE_CUDA_HOST_COMPILER_ID=''
 -- CMAKE_CUDA_HOST_COMPILER_VERSION=''
 )

+ 1 - 0
Tests/RunCMake/CompilerId/CUDA.cmake

@@ -2,5 +2,6 @@ enable_language(CUDA)
 message(STATUS "CMAKE_CUDA_COMPILER='${CMAKE_CUDA_COMPILER}'")
 message(STATUS "CMAKE_CUDA_COMPILER_ID='${CMAKE_CUDA_COMPILER_ID}'")
 message(STATUS "CMAKE_CUDA_COMPILER_VERSION='${CMAKE_CUDA_COMPILER_VERSION}'")
+message(STATUS "CMAKE_CUDA_COMPILER_ARCHITECTURE_ID='${CMAKE_CUDA_COMPILER_ARCHITECTURE_ID}'")
 message(STATUS "CMAKE_CUDA_HOST_COMPILER_ID='${CMAKE_CUDA_HOST_COMPILER_ID}'")
 message(STATUS "CMAKE_CUDA_HOST_COMPILER_VERSION='${CMAKE_CUDA_HOST_COMPILER_VERSION}'")

+ 1 - 0
Tests/RunCMake/CompilerId/CXX-stdout.txt

@@ -1,3 +1,4 @@
 -- CMAKE_CXX_COMPILER='[^']+'
 -- CMAKE_CXX_COMPILER_ID='[A-Za-z]+'
 -- CMAKE_CXX_COMPILER_VERSION='([0-9]+)(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?'
+-- CMAKE_CXX_COMPILER_ARCHITECTURE_ID='[A-Za-z0-9_;]+'

+ 1 - 0
Tests/RunCMake/CompilerId/CXX.cmake

@@ -2,3 +2,4 @@ enable_language(CXX)
 message(STATUS "CMAKE_CXX_COMPILER='${CMAKE_CXX_COMPILER}'")
 message(STATUS "CMAKE_CXX_COMPILER_ID='${CMAKE_CXX_COMPILER_ID}'")
 message(STATUS "CMAKE_CXX_COMPILER_VERSION='${CMAKE_CXX_COMPILER_VERSION}'")
+message(STATUS "CMAKE_CXX_COMPILER_ARCHITECTURE_ID='${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}'")

+ 1 - 0
Tests/RunCMake/CompilerId/Fortran-stdout.txt

@@ -1,3 +1,4 @@
 -- CMAKE_Fortran_COMPILER='[^']+'
 -- CMAKE_Fortran_COMPILER_ID='[A-Za-z]+'
 -- CMAKE_Fortran_COMPILER_VERSION='([0-9]+)(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?'
+-- CMAKE_Fortran_COMPILER_ARCHITECTURE_ID='[A-Za-z0-9_;]+'

+ 1 - 0
Tests/RunCMake/CompilerId/Fortran.cmake

@@ -2,3 +2,4 @@ enable_language(Fortran)
 message(STATUS "CMAKE_Fortran_COMPILER='${CMAKE_Fortran_COMPILER}'")
 message(STATUS "CMAKE_Fortran_COMPILER_ID='${CMAKE_Fortran_COMPILER_ID}'")
 message(STATUS "CMAKE_Fortran_COMPILER_VERSION='${CMAKE_Fortran_COMPILER_VERSION}'")
+message(STATUS "CMAKE_Fortran_COMPILER_ARCHITECTURE_ID='${CMAKE_Fortran_COMPILER_ARCHITECTURE_ID}'")

+ 2 - 0
Tests/RunCMake/CompilerId/HIP-stdout.txt

@@ -1,11 +1,13 @@
 (-- CMAKE_HIP_COMPILER='[^']+'
 -- CMAKE_HIP_COMPILER_ID='NVIDIA'
 -- CMAKE_HIP_COMPILER_VERSION='([0-9]+)(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?'
+-- CMAKE_HIP_COMPILER_ARCHITECTURE_ID='[A-Za-z0-9_;]+'
 -- CMAKE_HIP_HOST_COMPILER_ID='[A-Za-z]+'
 -- CMAKE_HIP_HOST_COMPILER_VERSION='([0-9]+)(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?'
 |-- CMAKE_HIP_COMPILER='[^']+'
 -- CMAKE_HIP_COMPILER_ID='([^N]|N[^V]|NV[^I]|NVI[^D]|NVID[^I]|NVIDI[^A])[A-Za-z]*'
 -- CMAKE_HIP_COMPILER_VERSION='([0-9]+)(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?'
+-- CMAKE_HIP_COMPILER_ARCHITECTURE_ID='[A-Za-z0-9_;]+'
 -- CMAKE_HIP_HOST_COMPILER_ID=''
 -- CMAKE_HIP_HOST_COMPILER_VERSION=''
 )

+ 1 - 0
Tests/RunCMake/CompilerId/HIP.cmake

@@ -2,5 +2,6 @@ enable_language(HIP)
 message(STATUS "CMAKE_HIP_COMPILER='${CMAKE_HIP_COMPILER}'")
 message(STATUS "CMAKE_HIP_COMPILER_ID='${CMAKE_HIP_COMPILER_ID}'")
 message(STATUS "CMAKE_HIP_COMPILER_VERSION='${CMAKE_HIP_COMPILER_VERSION}'")
+message(STATUS "CMAKE_HIP_COMPILER_ARCHITECTURE_ID='${CMAKE_HIP_COMPILER_ARCHITECTURE_ID}'")
 message(STATUS "CMAKE_HIP_HOST_COMPILER_ID='${CMAKE_HIP_HOST_COMPILER_ID}'")
 message(STATUS "CMAKE_HIP_HOST_COMPILER_VERSION='${CMAKE_HIP_HOST_COMPILER_VERSION}'")

+ 1 - 0
Tests/RunCMake/CompilerId/OBJC-stdout.txt

@@ -1,3 +1,4 @@
 -- CMAKE_OBJC_COMPILER='[^']+'
 -- CMAKE_OBJC_COMPILER_ID='[A-Za-z]+'
 -- CMAKE_OBJC_COMPILER_VERSION='([0-9]+)(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?'
+-- CMAKE_OBJC_COMPILER_ARCHITECTURE_ID='[A-Za-z0-9_;]+'

+ 1 - 0
Tests/RunCMake/CompilerId/OBJC.cmake

@@ -2,3 +2,4 @@ enable_language(OBJC)
 message(STATUS "CMAKE_OBJC_COMPILER='${CMAKE_OBJC_COMPILER}'")
 message(STATUS "CMAKE_OBJC_COMPILER_ID='${CMAKE_OBJC_COMPILER_ID}'")
 message(STATUS "CMAKE_OBJC_COMPILER_VERSION='${CMAKE_OBJC_COMPILER_VERSION}'")
+message(STATUS "CMAKE_OBJC_COMPILER_ARCHITECTURE_ID='${CMAKE_OBJC_COMPILER_ARCHITECTURE_ID}'")

+ 1 - 0
Tests/RunCMake/CompilerId/OBJCXX-stdout.txt

@@ -1,3 +1,4 @@
 -- CMAKE_OBJCXX_COMPILER='[^']+'
 -- CMAKE_OBJCXX_COMPILER_ID='[A-Za-z]+'
 -- CMAKE_OBJCXX_COMPILER_VERSION='([0-9]+)(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?'
+-- CMAKE_OBJCXX_COMPILER_ARCHITECTURE_ID='[A-Za-z0-9_;]+'

+ 1 - 0
Tests/RunCMake/CompilerId/OBJCXX.cmake

@@ -2,3 +2,4 @@ enable_language(OBJCXX)
 message(STATUS "CMAKE_OBJCXX_COMPILER='${CMAKE_OBJCXX_COMPILER}'")
 message(STATUS "CMAKE_OBJCXX_COMPILER_ID='${CMAKE_OBJCXX_COMPILER_ID}'")
 message(STATUS "CMAKE_OBJCXX_COMPILER_VERSION='${CMAKE_OBJCXX_COMPILER_VERSION}'")
+message(STATUS "CMAKE_OBJCXX_COMPILER_ARCHITECTURE_ID='${CMAKE_OBJCXX_COMPILER_ARCHITECTURE_ID}'")

+ 2 - 0
Tests/SystemInformation/SystemInformation.in

@@ -19,6 +19,7 @@ CMAKE_COMPILER_IS_GNUCC == "${CMAKE_COMPILER_IS_GNUCC}"
 CMAKE_COMPILER_IS_GNUCXX == "${CMAKE_COMPILER_IS_GNUCXX}"
 CMAKE_C_COMPILER_ID == "${CMAKE_C_COMPILER_ID}"
 CMAKE_C_COMPILER_VERSION == "${CMAKE_C_COMPILER_VERSION}"
+CMAKE_C_COMPILER_ARCHITECTURE_ID == "${CMAKE_C_COMPILER_ARCHITECTURE_ID}"
 CMAKE_C90_STANDARD_COMPILE_OPTION == "${CMAKE_C90_STANDARD_COMPILE_OPTION}"
 CMAKE_C99_STANDARD_COMPILE_OPTION == "${CMAKE_C99_STANDARD_COMPILE_OPTION}"
 CMAKE_C11_STANDARD_COMPILE_OPTION == "${CMAKE_C11_STANDARD_COMPILE_OPTION}"
@@ -31,6 +32,7 @@ CMAKE_C99_COMPILE_FEATURES == "${CMAKE_C99_COMPILE_FEATURES}"
 CMAKE_C11_COMPILE_FEATURES == "${CMAKE_C11_COMPILE_FEATURES}"
 CMAKE_CXX_COMPILER_ID == "${CMAKE_CXX_COMPILER_ID}"
 CMAKE_CXX_COMPILER_VERSION == "${CMAKE_CXX_COMPILER_VERSION}"
+CMAKE_CXX_COMPILER_ARCHITECTURE_ID == "${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}"
 CMAKE_CXX98_STANDARD_COMPILE_OPTION == "${CMAKE_CXX98_STANDARD_COMPILE_OPTION}"
 CMAKE_CXX11_STANDARD_COMPILE_OPTION == "${CMAKE_CXX11_STANDARD_COMPILE_OPTION}"
 CMAKE_CXX98_EXTENSION_COMPILE_OPTION == "${CMAKE_CXX98_EXTENSION_COMPILE_OPTION}"