FindHDF5: Restore parallel HDF5 detection with only CXX enabled

Since commit 14c46fb16a (FindHDF5: Find C component with only CXX
compiler, 2022-12-13, v3.26.0-rc1~175^2), if CXX is enabled but C is
not, the `_HDF5_test_regular_compiler_C` helper writes a `.cpp` source
but the `_HDF5_invoke_compiler` still expects a `.c` source.  Refactor
the logic to select a name for the source file up front, and use it in
both helpers.

Fixes: #24627
Issue: #24241
diff --git a/Modules/FindHDF5.cmake b/Modules/FindHDF5.cmake
index db03c54..6fab08f 100644
--- a/Modules/FindHDF5.cmake
+++ b/Modules/FindHDF5.cmake
@@ -217,16 +217,9 @@
 
 # Test first if the current compilers automatically wrap HDF5
 function(_HDF5_test_regular_compiler_C success version is_parallel)
-  set(scratch_directory
-    ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/hdf5)
   if(NOT ${success} OR
-     NOT EXISTS ${scratch_directory}/compiler_has_h5_c)
-    set(test_file ${scratch_directory}/cmake_hdf5_test.c)
-    # CXX project without C enabled
-    if(CMAKE_CXX_COMPILER_LOADED AND NOT CMAKE_C_COMPILER_LOADED)
-      set(test_file ${scratch_directory}/cmake_hdf5_test.cpp)
-    endif()
-    file(WRITE ${test_file}
+     NOT EXISTS ${_HDF5_TEST_DIR}/compiler_has_h5_c)
+    file(WRITE "${_HDF5_TEST_SRC}"
       "#include <hdf5.h>\n"
       "const char* info_ver = \"INFO\" \":\" H5_VERSION;\n"
       "#ifdef H5_HAVE_PARALLEL\n"
@@ -242,12 +235,12 @@
       "  fid = H5Fcreate(\"foo.h5\",H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT);\n"
       "  return 0;\n"
       "}")
-    try_compile(${success} SOURCES ${test_file}
-      COPY_FILE ${scratch_directory}/compiler_has_h5_c
+    try_compile(${success} SOURCES "${_HDF5_TEST_SRC}"
+      COPY_FILE ${_HDF5_TEST_DIR}/compiler_has_h5_c
     )
   endif()
-  if(${success} AND EXISTS ${scratch_directory}/compiler_has_h5_c)
-    file(STRINGS ${scratch_directory}/compiler_has_h5_c INFO_STRINGS
+  if(${success} AND EXISTS ${_HDF5_TEST_DIR}/compiler_has_h5_c)
+    file(STRINGS ${_HDF5_TEST_DIR}/compiler_has_h5_c INFO_STRINGS
       REGEX "^INFO:"
     )
     string(REGEX MATCH "^INFO:([0-9]+\\.[0-9]+\\.[0-9]+)(-patch([0-9]+))?"
@@ -268,11 +261,9 @@
 endfunction()
 
 function(_HDF5_test_regular_compiler_CXX success version is_parallel)
-  set(scratch_directory ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/hdf5)
   if(NOT ${success} OR
-     NOT EXISTS ${scratch_directory}/compiler_has_h5_cxx)
-    set(test_file ${scratch_directory}/cmake_hdf5_test.cxx)
-    file(WRITE ${test_file}
+     NOT EXISTS ${_HDF5_TEST_DIR}/compiler_has_h5_cxx)
+    file(WRITE "${_HDF5_TEST_SRC}"
       "#include <H5Cpp.h>\n"
       "#ifndef H5_NO_NAMESPACE\n"
       "using namespace H5;\n"
@@ -290,12 +281,12 @@
       "  H5File file(\"foo.h5\", H5F_ACC_TRUNC);\n"
       "  return 0;\n"
       "}")
-    try_compile(${success} SOURCES ${test_file}
-      COPY_FILE ${scratch_directory}/compiler_has_h5_cxx
+    try_compile(${success} SOURCES "${_HDF5_TEST_SRC}"
+      COPY_FILE ${_HDF5_TEST_DIR}/compiler_has_h5_cxx
     )
   endif()
-  if(${success} AND EXISTS ${scratch_directory}/compiler_has_h5_cxx)
-    file(STRINGS ${scratch_directory}/compiler_has_h5_cxx INFO_STRINGS
+  if(${success} AND EXISTS ${_HDF5_TEST_DIR}/compiler_has_h5_cxx)
+    file(STRINGS ${_HDF5_TEST_DIR}/compiler_has_h5_cxx INFO_STRINGS
       REGEX "^INFO:"
     )
     string(REGEX MATCH "^INFO:([0-9]+\\.[0-9]+\\.[0-9]+)(-patch([0-9]+))?"
@@ -317,17 +308,14 @@
 
 function(_HDF5_test_regular_compiler_Fortran success is_parallel)
   if(NOT ${success})
-    set(scratch_directory
-      ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/hdf5)
-    set(test_file ${scratch_directory}/cmake_hdf5_test.f90)
-    file(WRITE ${test_file}
+    file(WRITE "${_HDF5_TEST_SRC}"
       "program hdf5_hello\n"
       "  use hdf5\n"
       "  integer error\n"
       "  call h5open_f(error)\n"
       "  call h5close_f(error)\n"
       "end\n")
-    try_compile(${success} SOURCES ${test_file})
+    try_compile(${success} SOURCES "${_HDF5_TEST_SRC}")
     if(${success})
       execute_process(COMMAND ${CMAKE_Fortran_COMPILER} -showconfig
         OUTPUT_VARIABLE config_output
@@ -352,19 +340,11 @@
   else()
     set(lib_type_args -shlib)
   endif()
-  set(scratch_dir ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/hdf5)
-  if("${language}" STREQUAL "C")
-    set(test_file ${scratch_dir}/cmake_hdf5_test.c)
-  elseif("${language}" STREQUAL "CXX")
-    set(test_file ${scratch_dir}/cmake_hdf5_test.cxx)
-  elseif("${language}" STREQUAL "Fortran")
-    set(test_file ${scratch_dir}/cmake_hdf5_test.f90)
-  endif()
   # Verify that the compiler wrapper can actually compile: sometimes the compiler
   # wrapper exists, but not the compiler.  E.g. Miniconda / Anaconda Python
   execute_process(
-    COMMAND ${HDF5_${language}_COMPILER_EXECUTABLE} ${test_file}
-    WORKING_DIRECTORY ${scratch_dir}
+    COMMAND ${HDF5_${language}_COMPILER_EXECUTABLE} "${_HDF5_TEST_SRC}"
+    WORKING_DIRECTORY ${_HDF5_TEST_DIR}
     OUTPUT_VARIABLE output
     ERROR_VARIABLE output
     RESULT_VARIABLE return_value
@@ -374,8 +354,8 @@
       "HDF5 ${language} compiler wrapper is unable to compile a minimal HDF5 program.")
   else()
     execute_process(
-      COMMAND ${HDF5_${language}_COMPILER_EXECUTABLE} -show ${lib_type_args} ${test_file}
-      WORKING_DIRECTORY ${scratch_dir}
+      COMMAND ${HDF5_${language}_COMPILER_EXECUTABLE} -show ${lib_type_args} "${_HDF5_TEST_SRC}"
+      WORKING_DIRECTORY ${_HDF5_TEST_DIR}
       OUTPUT_VARIABLE output
       ERROR_VARIABLE output
       RESULT_VARIABLE return_value
@@ -587,6 +567,7 @@
 
 if(NOT HDF5_FOUND)
   set(_HDF5_NEED_TO_SEARCH FALSE)
+  set(_HDF5_TEST_DIR ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/hdf5)
   set(HDF5_COMPILER_NO_INTERROGATE TRUE)
   # Only search for languages we've enabled
   foreach(_lang IN LISTS HDF5_LANGUAGE_BINDINGS)
@@ -595,16 +576,23 @@
 
     # First check to see if our regular compiler is one of wrappers
     if(_lang STREQUAL "C")
+      set(_HDF5_TEST_SRC ${_HDF5_TEST_DIR}/cmake_hdf5_test.c)
+      if(CMAKE_CXX_COMPILER_LOADED AND NOT CMAKE_C_COMPILER_LOADED)
+        # CXX project without C enabled
+        set(_HDF5_TEST_SRC ${_HDF5_TEST_DIR}/cmake_hdf5_test.cxx)
+      endif()
       _HDF5_test_regular_compiler_C(
         HDF5_${_lang}_COMPILER_NO_INTERROGATE
         HDF5_${_lang}_VERSION
         HDF5_${_lang}_IS_PARALLEL)
     elseif(_lang STREQUAL "CXX")
+      set(_HDF5_TEST_SRC ${_HDF5_TEST_DIR}/cmake_hdf5_test.cxx)
       _HDF5_test_regular_compiler_CXX(
         HDF5_${_lang}_COMPILER_NO_INTERROGATE
         HDF5_${_lang}_VERSION
         HDF5_${_lang}_IS_PARALLEL)
     elseif(_lang STREQUAL "Fortran")
+      set(_HDF5_TEST_SRC ${_HDF5_TEST_DIR}/cmake_hdf5_test.f90)
       _HDF5_test_regular_compiler_Fortran(
         HDF5_${_lang}_COMPILER_NO_INTERROGATE
         HDF5_${_lang}_IS_PARALLEL)
@@ -750,6 +738,8 @@
       endif()
     endif()
   endforeach()
+  unset(_HDF5_TEST_DIR)
+  unset(_HDF5_TEST_SRC)
   unset(_lib)
 else()
   set(_HDF5_NEED_TO_SEARCH TRUE)