|  | @@ -8,6 +8,7 @@
 | 
	
		
			
				|  |  |  set(targets
 | 
	
		
			
				|  |  |    aix-C-XL-13.1.3 aix-CXX-XL-13.1.3
 | 
	
		
			
				|  |  |    aix-C-XLClang-16.1.0.1 aix-CXX-XLClang-16.1.0.1
 | 
	
		
			
				|  |  | +  aix-C-IBMClang-17.1.1.2 aix-CXX-IBMClang-17.1.1.2
 | 
	
		
			
				|  |  |    craype-C-Cray-8.7 craype-CXX-Cray-8.7 craype-Fortran-Cray-8.7
 | 
	
		
			
				|  |  |    craype-C-Cray-9.0-hlist-ad craype-CXX-Cray-9.0-hlist-ad craype-Fortran-Cray-9.0-hlist-ad
 | 
	
		
			
				|  |  |    craype-C-GNU-7.3.0 craype-CXX-GNU-7.3.0 craype-Fortran-GNU-7.3.0
 | 
	
	
		
			
				|  | @@ -23,7 +24,10 @@ set(targets
 | 
	
		
			
				|  |  |    linux-C-GNU-10.2.1-static-libgcc
 | 
	
		
			
				|  |  |      linux-CXX-GNU-10.2.1-static-libstdc++
 | 
	
		
			
				|  |  |      linux-Fortran-GNU-10.2.1-static-libgfortran
 | 
	
		
			
				|  |  | +  linux-C-GNU-12.2.0 linux-CXX-GNU-12.2.0 linux-Fortran-GNU-12.2.0
 | 
	
		
			
				|  |  |    linux-C-Intel-18.0.0.20170811 linux-CXX-Intel-18.0.0.20170811
 | 
	
		
			
				|  |  | +  linux-C-Intel-2021.10.0.20230609 linux-CXX-Intel-2021.10.0.20230609 linux-Fortran-Intel-2021.10.0.20230609
 | 
	
		
			
				|  |  | +  linux-C-IntelLLVM-2023.2.0 linux-CXX-IntelLLVM-2023.2.0 linux-Fortran-IntelLLVM-2023.2.0
 | 
	
		
			
				|  |  |    linux-C-PGI-18.10.1 linux-CXX-PGI-18.10.1
 | 
	
		
			
				|  |  |      linux-Fortran-PGI-18.10.1 linux_pgf77-Fortran-PGI-18.10.1
 | 
	
		
			
				|  |  |      linux_nostdinc-C-PGI-18.10.1 linux_nostdinc-CXX-PGI-18.10.1
 | 
	
	
		
			
				|  | @@ -42,8 +46,14 @@ set(targets
 | 
	
		
			
				|  |  |      netbsd_nostdinc-C-GNU-4.8.5 netbsd_nostdinc-CXX-GNU-4.8.5
 | 
	
		
			
				|  |  |    openbsd-C-Clang-5.0.1 openbsd-CXX-Clang-5.0.1
 | 
	
		
			
				|  |  |    sunos-C-SunPro-5.13.0 sunos-CXX-SunPro-5.13.0 sunos-Fortran-SunPro-8.8.0
 | 
	
		
			
				|  |  | +  sunos5.10_sparc32-C-GNU-5.5.0 sunos5.10_sparc32-CXX-GNU-5.5.0 sunos5.10_sparc32-Fortran-GNU-5.5.0
 | 
	
		
			
				|  |  | +  sunos5.11_i386-C-GNU-5.5.0 sunos5.11_i386-CXX-GNU-5.5.0 sunos5.11_i386-Fortran-GNU-5.5.0
 | 
	
		
			
				|  |  | +  windows_x86_64-C-MSVC-19.36.32543.0 windows_x86_64-CXX-MSVC-19.36.32543.0
 | 
	
		
			
				|  |  | +  windows_x86_64-C-MSVC-19.38.33130.0-VS windows_x86_64-CXX-MSVC-19.38.33130.0-VS
 | 
	
		
			
				|  |  |    windows_x86_64-C-Clang-17.0.1-MSVC windows_x86_64-CXX-Clang-17.0.1-MSVC windows_x86_64-Fortran-LLVMFlang-17.0.1-MSVC
 | 
	
		
			
				|  |  |    windows_x86_64-Fortran-LLVMFlang-18.0.0-MSVC
 | 
	
		
			
				|  |  | +  windows_x86_64-C-Intel-2021.9.0.20230302 windows_x86_64-CXX-Intel-2021.9.0.20230302 windows_x86_64-Fortran-Intel-2021.9.0.20230302
 | 
	
		
			
				|  |  | +  windows_x86_64-C-IntelLLVM-2023.1.0 windows_x86_64-CXX-IntelLLVM-2023.1.0 windows_x86_64-Fortran-IntelLLVM-2023.1.0
 | 
	
		
			
				|  |  |    windows_arm64-C-Clang-17.0.1-MSVC windows_arm64-CXX-Clang-17.0.1-MSVC windows_arm64-Fortran-LLVMFlang-17.0.1-MSVC
 | 
	
		
			
				|  |  |    )
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -93,16 +103,6 @@ function(load_compiler_info infile lang_var outcmvars_var outstr_var)
 | 
	
		
			
				|  |  |    set(${outstr_var} "${outstr}" PARENT_SCOPE)
 | 
	
		
			
				|  |  |  endfunction()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -#
 | 
	
		
			
				|  |  | -# unload_compiler_info: clear out any CMAKE_* vars load previously set
 | 
	
		
			
				|  |  | -#
 | 
	
		
			
				|  |  | -function(unload_compiler_info cmvars)
 | 
	
		
			
				|  |  | -  foreach(var IN LISTS cmvars)
 | 
	
		
			
				|  |  | -    unset("${var}" PARENT_SCOPE)
 | 
	
		
			
				|  |  | -  endforeach()
 | 
	
		
			
				|  |  | -endfunction()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  #
 | 
	
		
			
				|  |  |  # load_platform_info: establish CMAKE_LIBRARY_ARCHITECTURE_REGEX
 | 
	
		
			
				|  |  |  # based on the target platform.
 | 
	
	
		
			
				|  | @@ -132,49 +132,64 @@ foreach(t ${targets})
 | 
	
		
			
				|  |  |      continue()
 | 
	
		
			
				|  |  |    endif()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  load_compiler_info(${infile} lang cmvars input)
 | 
	
		
			
				|  |  | -  load_platform_info(${t})
 | 
	
		
			
				|  |  | +  block()
 | 
	
		
			
				|  |  | +    load_compiler_info(${infile} lang cmvars input)
 | 
	
		
			
				|  |  | +    load_platform_info(${t})
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  # Need to handle files with empty entries for both libs or dirs
 | 
	
		
			
				|  |  | -  set(implicit_lib_output "")
 | 
	
		
			
				|  |  | -  set(idirs_output "")
 | 
	
		
			
				|  |  | -  set(implicit_objs "")
 | 
	
		
			
				|  |  | -  set(library_arch_output "")
 | 
	
		
			
				|  |  | -  file(STRINGS ${outfile} outputs)
 | 
	
		
			
				|  |  | -  foreach(line IN LISTS outputs)
 | 
	
		
			
				|  |  | -    if(line MATCHES "libs=")
 | 
	
		
			
				|  |  | -      string(REPLACE "libs=" "" implicit_lib_output "${line}")
 | 
	
		
			
				|  |  | -    endif()
 | 
	
		
			
				|  |  | -    if(line MATCHES "dirs=")
 | 
	
		
			
				|  |  | -      string(REPLACE "dirs=" "" idirs_output "${line}")
 | 
	
		
			
				|  |  | -    endif()
 | 
	
		
			
				|  |  | -    if(line MATCHES "library_arch=")
 | 
	
		
			
				|  |  | -      string(REPLACE "library_arch=" "" library_arch_output "${line}")
 | 
	
		
			
				|  |  | -    endif()
 | 
	
		
			
				|  |  | -  endforeach()
 | 
	
		
			
				|  |  | +    # Need to handle files with empty entries for both libs or dirs
 | 
	
		
			
				|  |  | +    set(implicit_lib_output "")
 | 
	
		
			
				|  |  | +    set(idirs_output "")
 | 
	
		
			
				|  |  | +    set(implicit_objs "")
 | 
	
		
			
				|  |  | +    set(library_arch_output "")
 | 
	
		
			
				|  |  | +    set(linker_tool_output "")
 | 
	
		
			
				|  |  | +    file(STRINGS ${outfile} outputs)
 | 
	
		
			
				|  |  | +    foreach(line IN LISTS outputs)
 | 
	
		
			
				|  |  | +      if(line MATCHES "libs=")
 | 
	
		
			
				|  |  | +        string(REPLACE "libs=" "" implicit_lib_output "${line}")
 | 
	
		
			
				|  |  | +      endif()
 | 
	
		
			
				|  |  | +      if(line MATCHES "dirs=")
 | 
	
		
			
				|  |  | +        string(REPLACE "dirs=" "" idirs_output "${line}")
 | 
	
		
			
				|  |  | +      endif()
 | 
	
		
			
				|  |  | +      if(line MATCHES "library_arch=")
 | 
	
		
			
				|  |  | +        string(REPLACE "library_arch=" "" library_arch_output "${line}")
 | 
	
		
			
				|  |  | +      endif()
 | 
	
		
			
				|  |  | +      if(line MATCHES "linker_tool=")
 | 
	
		
			
				|  |  | +        string(REPLACE "linker_tool=" "" linker_tool_output "${line}")
 | 
	
		
			
				|  |  | +      endif()
 | 
	
		
			
				|  |  | +    endforeach()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  cmake_parse_implicit_link_info("${input}" implicit_libs idirs implicit_fwks log
 | 
	
		
			
				|  |  | -      "${CMAKE_${lang}_IMPLICIT_OBJECT_REGEX}"
 | 
	
		
			
				|  |  | -      LANGUAGE ${lang}
 | 
	
		
			
				|  |  | -      COMPUTE_IMPLICIT_OBJECTS implicit_objs)
 | 
	
		
			
				|  |  | +    cmake_parse_implicit_link_info2("${input}" log
 | 
	
		
			
				|  |  | +        "${CMAKE_${lang}_IMPLICIT_OBJECT_REGEX}"
 | 
	
		
			
				|  |  | +        LANGUAGE ${lang}
 | 
	
		
			
				|  |  | +        COMPUTE_LINKER linker_tool
 | 
	
		
			
				|  |  | +        COMPUTE_IMPLICIT_LIBS implicit_libs
 | 
	
		
			
				|  |  | +        COMPUTE_IMPLICIT_DIRS idirs
 | 
	
		
			
				|  |  | +        COMPUTE_IMPLICIT_FWKS implicit_fwks
 | 
	
		
			
				|  |  | +        COMPUTE_IMPLICIT_OBJECTS implicit_objs)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  set(library_arch)
 | 
	
		
			
				|  |  | -  cmake_parse_library_architecture(${lang} "${idirs}" "${implicit_objs}" library_arch)
 | 
	
		
			
				|  |  | +    set(library_arch)
 | 
	
		
			
				|  |  | +    cmake_parse_library_architecture(${lang} "${idirs}" "${implicit_objs}" library_arch)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  # File format
 | 
	
		
			
				|  |  | -  # file(WRITE ${outfile} "libs=${implicit_libs}\ndirs=${idirs}\nlibrary_arch=${library_arch}")
 | 
	
		
			
				|  |  | +    # File format
 | 
	
		
			
				|  |  | +    # file(WRITE ${outfile} "libs=${implicit_libs}\ndirs=${idirs}\nlibrary_arch=${library_arch}\nlinker_tool=${linker_tool}\n")
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  if(t MATCHES "-empty$")          # empty isn't supposed to parse
 | 
	
		
			
				|  |  | -    if("${state}" STREQUAL "done")
 | 
	
		
			
				|  |  | -      message("empty parse failed: ${idirs}, log=${log}")
 | 
	
		
			
				|  |  | +    if(t MATCHES "windows" AND NOT CMAKE_HOST_WIN32)
 | 
	
		
			
				|  |  | +      string(REPLACE "\\" "/" linker_tool "${linker_tool}")
 | 
	
		
			
				|  |  | +      cmake_path(NORMAL_PATH linker_tool)
 | 
	
		
			
				|  |  |      endif()
 | 
	
		
			
				|  |  | -  elseif(NOT "${idirs}" MATCHES "^${idirs_output}$")
 | 
	
		
			
				|  |  | -    message("${t} parse failed: state=${state}, '${idirs}' does not match '^${idirs_output}$'")
 | 
	
		
			
				|  |  | -  elseif(NOT "${implicit_libs}" MATCHES "^${implicit_lib_output}$")
 | 
	
		
			
				|  |  | -    message("${t} parse failed: state=${state}, '${implicit_libs}' does not match '^${implicit_lib_output}$'")
 | 
	
		
			
				|  |  | -  elseif((library_arch OR library_arch_output) AND NOT "${library_arch}" MATCHES "^${library_arch_output}$")
 | 
	
		
			
				|  |  | -    message("${t} parse failed: state=${state}, '${library_arch}' does not match '^${library_arch_output}$'")
 | 
	
		
			
				|  |  | -  endif()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  unload_compiler_info("${cmvars}")
 | 
	
		
			
				|  |  | +    if(t MATCHES "-empty$")          # empty isn't supposed to parse
 | 
	
		
			
				|  |  | +      if("${state}" STREQUAL "done")
 | 
	
		
			
				|  |  | +        message("empty parse failed: ${idirs}, log=${log}")
 | 
	
		
			
				|  |  | +      endif()
 | 
	
		
			
				|  |  | +    elseif(NOT "${idirs}" MATCHES "^${idirs_output}$")
 | 
	
		
			
				|  |  | +      message("${t} parse failed: state=${state}, '${idirs}' does not match '^${idirs_output}$'")
 | 
	
		
			
				|  |  | +    elseif(NOT "${implicit_libs}" MATCHES "^${implicit_lib_output}$")
 | 
	
		
			
				|  |  | +      message("${t} parse failed: state=${state}, '${implicit_libs}' does not match '^${implicit_lib_output}$'")
 | 
	
		
			
				|  |  | +    elseif((library_arch OR library_arch_output) AND NOT "${library_arch}" MATCHES "^${library_arch_output}$")
 | 
	
		
			
				|  |  | +      message("${t} parse failed: state=${state}, '${library_arch}' does not match '^${library_arch_output}$'")
 | 
	
		
			
				|  |  | +    elseif((linker_tool OR linker_tool_output) AND NOT "${linker_tool}" MATCHES "^${linker_tool_output}$")
 | 
	
		
			
				|  |  | +      message("${t} parse failed: state=${state}, '${linker_tool}' does not match '^${linker_tool_output}$'")
 | 
	
		
			
				|  |  | +    endif()
 | 
	
		
			
				|  |  | +  endblock()
 | 
	
		
			
				|  |  |  endforeach(t)
 |