CMake: Set HIP architectures before compiler detection

diff --git a/cmake/EigenGpuTesting.cmake b/cmake/EigenGpuTesting.cmake
index 8b189b2..7ce51bf 100644
--- a/cmake/EigenGpuTesting.cmake
+++ b/cmake/EigenGpuTesting.cmake
@@ -113,6 +113,12 @@
         set(CMAKE_HIP_COMPILER "${ROCM_PATH}/llvm/bin/clang++")
       endif()
     endif()
+    # Compiler ABI detection needs architectures even on build-only hosts without an AMD GPU.
+    if(NOT DEFINED EIGEN_HIP_ARCHITECTURES)
+      set(EIGEN_HIP_ARCHITECTURES
+          gfx900;gfx906;gfx908;gfx90a;gfx940;gfx941;gfx942;gfx1030;gfx1100;gfx1101;gfx1102;gfx1150;gfx1151
+          CACHE STRING "HIP GPU architectures to build Eigen's HIP tests for.")
+    endif()
     if(NOT CMAKE_HIP_ARCHITECTURES)
       set(CMAKE_HIP_ARCHITECTURES "${EIGEN_HIP_ARCHITECTURES}")
     endif()
diff --git a/cmake/EigenTesting.cmake b/cmake/EigenTesting.cmake
index f60aa14..8321fb0 100644
--- a/cmake/EigenTesting.cmake
+++ b/cmake/EigenTesting.cmake
@@ -10,12 +10,6 @@
   endif()
 endmacro()
 
-if(EIGEN_TEST_HIP AND NOT DEFINED EIGEN_HIP_ARCHITECTURES)
-  set(EIGEN_HIP_ARCHITECTURES
-      gfx900;gfx906;gfx908;gfx90a;gfx940;gfx941;gfx942;gfx1030;gfx1100;gfx1101;gfx1102;gfx1150;gfx1151
-      CACHE STRING "HIP GPU architectures to build Eigen's HIP tests for.")
-endif()
-
 #internal. See documentation of ei_add_test for details.
 macro(ei_add_test_internal testname testname_with_suffix)
   set(targetname ${testname_with_suffix})
diff --git a/test/buildsystem/scenarios/gpu_architectures.cmake b/test/buildsystem/scenarios/gpu_architectures.cmake
index b3fbe17..b3921b4 100644
--- a/test/buildsystem/scenarios/gpu_architectures.cmake
+++ b/test/buildsystem/scenarios/gpu_architectures.cmake
@@ -22,3 +22,27 @@
 check_architectures(13.3 "" "" "89" 89)
 check_architectures(13.3 "" "89" "75" 89)
 check_architectures(13.3 "86" "89" "75" 86)
+
+# Observe the architecture setting at language enablement, before compiler ABI detection.
+macro(enable_language language)
+  bs_assert_streq("${language}" "HIP" "enabled GPU language")
+  bs_assert_streq("${CMAKE_HIP_ARCHITECTURES}" "${expected}" "HIP architectures before compiler detection")
+endmacro()
+
+function(check_hip_architectures eigen_arch cmake_arch expected)
+  set(EIGEN_TEST_CUDA OFF)
+  set(EIGEN_TEST_HIP ON)
+  unset(EIGEN_HIP_ARCHITECTURES CACHE)
+  if(NOT "${eigen_arch}" STREQUAL "")
+    set(EIGEN_HIP_ARCHITECTURES "${eigen_arch}")
+  endif()
+  set(CMAKE_HIP_ARCHITECTURES "${cmake_arch}")
+  ei_gpu_testing_enable()
+endfunction()
+
+if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.21)
+  check_hip_architectures("" ""
+    "gfx900;gfx906;gfx908;gfx90a;gfx940;gfx941;gfx942;gfx1030;gfx1100;gfx1101;gfx1102;gfx1150;gfx1151")
+  check_hip_architectures("gfx906;gfx1100" "" "gfx906;gfx1100")
+  check_hip_architectures("gfx906" "gfx942" "gfx942")
+endif()