Merge topic 'update-kwsys'

3ef5dab010 cmSystemTools: Simplify using KWSys Status
ec1b6157cb Update CMake code using KWSys to account for Status return values
eef585efaa Merge branch 'upstream-KWSys' into update-kwsys
a790167101 KWSys 2021-04-14 (7ab1c601)

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: Ben Boeckel <ben.boeckel@kitware.com>
Merge-request: !6004
diff --git a/.gitlab/ci/configure_debian10_aarch64_ninja.cmake b/.gitlab/ci/configure_debian10_aarch64_ninja.cmake
index 1ad3ac4..f665f7d 100644
--- a/.gitlab/ci/configure_debian10_aarch64_ninja.cmake
+++ b/.gitlab/ci/configure_debian10_aarch64_ninja.cmake
@@ -1,5 +1,5 @@
 set(CMake_TEST_FindALSA "ON" CACHE BOOL "")
-set(CMake_TEST_FindBLAS "ON" CACHE BOOL "")
+set(CMake_TEST_FindBLAS "All" CACHE STRING "")
 set(CMake_TEST_FindBoost "ON" CACHE BOOL "")
 set(CMake_TEST_FindBoost_Python "ON" CACHE BOOL "")
 set(CMake_TEST_FindBZip2 "ON" CACHE BOOL "")
@@ -23,7 +23,7 @@
 set(CMake_TEST_FindIntl "ON" CACHE BOOL "")
 set(CMake_TEST_FindJPEG "ON" CACHE BOOL "")
 set(CMake_TEST_FindJsonCpp "ON" CACHE BOOL "")
-set(CMake_TEST_FindLAPACK "ON" CACHE BOOL "")
+set(CMake_TEST_FindLAPACK "All" CACHE STRING "")
 set(CMake_TEST_FindLibArchive "ON" CACHE BOOL "")
 set(CMake_TEST_FindLibinput "ON" CACHE BOOL "")
 set(CMake_TEST_FindLibLZMA "ON" CACHE BOOL "")
diff --git a/.gitlab/ci/configure_debian10_ninja.cmake b/.gitlab/ci/configure_debian10_ninja.cmake
index d925387..9de3013 100644
--- a/.gitlab/ci/configure_debian10_ninja.cmake
+++ b/.gitlab/ci/configure_debian10_ninja.cmake
@@ -1,5 +1,5 @@
 set(CMake_TEST_FindALSA "ON" CACHE BOOL "")
-set(CMake_TEST_FindBLAS "ON" CACHE BOOL "")
+set(CMake_TEST_FindBLAS "All" CACHE STRING "")
 set(CMake_TEST_FindBoost "ON" CACHE BOOL "")
 set(CMake_TEST_FindBoost_Python "ON" CACHE BOOL "")
 set(CMake_TEST_FindBZip2 "ON" CACHE BOOL "")
@@ -23,7 +23,7 @@
 set(CMake_TEST_FindIntl "ON" CACHE BOOL "")
 set(CMake_TEST_FindJPEG "ON" CACHE BOOL "")
 set(CMake_TEST_FindJsonCpp "ON" CACHE BOOL "")
-set(CMake_TEST_FindLAPACK "ON" CACHE BOOL "")
+set(CMake_TEST_FindLAPACK "All" CACHE STRING "")
 set(CMake_TEST_FindLibArchive "ON" CACHE BOOL "")
 set(CMake_TEST_FindLibinput "ON" CACHE BOOL "")
 set(CMake_TEST_FindLibLZMA "ON" CACHE BOOL "")
diff --git a/.gitlab/ci/configure_fedora33_makefiles.cmake b/.gitlab/ci/configure_fedora33_makefiles.cmake
index 882ffcd..4143134 100644
--- a/.gitlab/ci/configure_fedora33_makefiles.cmake
+++ b/.gitlab/ci/configure_fedora33_makefiles.cmake
@@ -1,5 +1,5 @@
 set(CMake_TEST_FindALSA "ON" CACHE BOOL "")
-set(CMake_TEST_FindBLAS "ON" CACHE BOOL "")
+set(CMake_TEST_FindBLAS "All" CACHE STRING "")
 set(CMake_TEST_FindBoost "ON" CACHE BOOL "")
 set(CMake_TEST_FindBoost_Python "ON" CACHE BOOL "")
 set(CMake_TEST_FindBZip2 "ON" CACHE BOOL "")
@@ -23,7 +23,7 @@
 set(CMake_TEST_FindIntl "ON" CACHE BOOL "")
 set(CMake_TEST_FindJPEG "ON" CACHE BOOL "")
 set(CMake_TEST_FindJsonCpp "ON" CACHE BOOL "")
-set(CMake_TEST_FindLAPACK "ON" CACHE BOOL "")
+set(CMake_TEST_FindLAPACK "All" CACHE STRING "")
 set(CMake_TEST_FindLibArchive "ON" CACHE BOOL "")
 set(CMake_TEST_FindLibinput "ON" CACHE BOOL "")
 set(CMake_TEST_FindLibLZMA "ON" CACHE BOOL "")
diff --git a/.gitlab/ci/configure_intelclassic_makefiles.cmake b/.gitlab/ci/configure_intelclassic_makefiles.cmake
index 20863a2..469b825 100644
--- a/.gitlab/ci/configure_intelclassic_makefiles.cmake
+++ b/.gitlab/ci/configure_intelclassic_makefiles.cmake
@@ -1 +1 @@
-include("${CMAKE_CURRENT_LIST_DIR}/configure_external_test.cmake")
+include("${CMAKE_CURRENT_LIST_DIR}/configure_intelcompiler_common.cmake")
diff --git a/.gitlab/ci/configure_intelcompiler_common.cmake b/.gitlab/ci/configure_intelcompiler_common.cmake
new file mode 100644
index 0000000..be3d15b
--- /dev/null
+++ b/.gitlab/ci/configure_intelcompiler_common.cmake
@@ -0,0 +1,4 @@
+set(CMake_TEST_FindBLAS "Intel10_64lp" CACHE STRING "")
+set(CMake_TEST_FindLAPACK "Intel10_64lp" CACHE STRING "")
+
+include("${CMAKE_CURRENT_LIST_DIR}/configure_external_test.cmake")
diff --git a/.gitlab/ci/configure_inteloneapi_makefiles.cmake b/.gitlab/ci/configure_inteloneapi_makefiles.cmake
index 20863a2..469b825 100644
--- a/.gitlab/ci/configure_inteloneapi_makefiles.cmake
+++ b/.gitlab/ci/configure_inteloneapi_makefiles.cmake
@@ -1 +1 @@
-include("${CMAKE_CURRENT_LIST_DIR}/configure_external_test.cmake")
+include("${CMAKE_CURRENT_LIST_DIR}/configure_intelcompiler_common.cmake")
diff --git a/Help/manual/cmake.1.rst b/Help/manual/cmake.1.rst
index 157ea5f..02828ac 100644
--- a/Help/manual/cmake.1.rst
+++ b/Help/manual/cmake.1.rst
@@ -105,6 +105,7 @@
   is already configured in the shell.  When using one of the
   :ref:`IDE Build Tool Generators`, no particular environment is needed.
 
+.. _`Generate a Project Buildsystem`:
 
 Generate a Project Buildsystem
 ==============================
diff --git a/Help/release/3.20.rst b/Help/release/3.20.rst
index e452926..86c6a86 100644
--- a/Help/release/3.20.rst
+++ b/Help/release/3.20.rst
@@ -298,6 +298,10 @@
 Other Changes
 =============
 
+* When running :manual:`cmake(1)` to :ref:`Generate a Project Buildsystem`,
+  unknown command-line arguments starting with a hyphen (``-``) are now
+  rejected with an error.  Previously they were silently ignored.
+
 * Source file extensions must now be explicit.
   See policy :policy:`CMP0115` for details.
 
diff --git a/Modules/FindBLAS.cmake b/Modules/FindBLAS.cmake
index 510f47d..c23e41b 100644
--- a/Modules/FindBLAS.cmake
+++ b/Modules/FindBLAS.cmake
@@ -208,22 +208,16 @@
 
 # TODO: move this stuff to a separate module
 
-macro(CHECK_BLAS_LIBRARIES LIBRARIES _prefix _name _flags _list _threadlibs _addlibdir _subdirs)
-  # This macro checks for the existence of the combination of fortran libraries
-  # given by _list.  If the combination is found, this macro checks (using the
-  # Check_Fortran_Function_Exists macro) whether can link against that library
-  # combination using the name of a routine given by _name using the linker
-  # flags given by _flags.  If the combination of libraries is found and passes
-  # the link test, LIBRARIES is set to the list of complete library paths that
-  # have been found.  Otherwise, LIBRARIES is set to FALSE.
-
-  # N.B. _prefix is the prefix applied to the names of all cached variables that
-  # are generated internally and marked advanced by this macro.
-  # _addlibdir is a list of additional search paths. _subdirs is a list of path
-  # suffixes to be used by find_library().
+function(CHECK_BLAS_LIBRARIES LIBRARIES _prefix _name _flags _list _deps _addlibdir _subdirs)
+  # This function checks for the existence of the combination of libraries
+  # given by _list.  If the combination is found, this checks whether can link
+  # against that library combination using the name of a routine given by _name
+  # using the linker flags given by _flags.  If the combination of libraries is
+  # found and passes the link test, ${LIBRARIES} is set to the list of complete
+  # library paths that have been found.  Otherwise, ${LIBRARIES} is set to FALSE.
 
   set(_libraries_work TRUE)
-  set(${LIBRARIES})
+  set(_libraries)
   set(_combined_name)
 
   set(_extaddlibdir "${_addlibdir}")
@@ -236,13 +230,16 @@
   endif()
   list(APPEND _extaddlibdir "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}")
 
-  foreach(_library ${_list} ${_threadlibs})
-    if(_library MATCHES "^-Wl,--(start|end)-group$")
-      # Respect linker flags like --start/end-group (required by MKL)
-      set(${LIBRARIES} ${${LIBRARIES}} "${_library}")
+  foreach(_library ${_list})
+    if(_library MATCHES "^-")
+      # Respect linker flags as-is (required by MKL)
+      list(APPEND _libraries "${_library}")
     else()
       string(REGEX REPLACE "[^A-Za-z0-9]" "_" _lib_var "${_library}")
       set(_combined_name ${_combined_name}_${_lib_var})
+      if(NOT "${_deps}" STREQUAL "")
+        set(_combined_name ${_combined_name}_deps)
+      endif()
       if(_libraries_work)
         find_library(${_prefix}_${_lib_var}_LIBRARY
           NAMES ${_library}
@@ -251,7 +248,7 @@
           PATH_SUFFIXES ${_subdirs}
         )
         mark_as_advanced(${_prefix}_${_lib_var}_LIBRARY)
-        set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_lib_var}_LIBRARY})
+        list(APPEND _libraries ${${_prefix}_${_lib_var}_LIBRARY})
         set(_libraries_work ${${_prefix}_${_lib_var}_LIBRARY})
       endif()
     endif()
@@ -263,7 +260,7 @@
   endforeach()
   if(_libraries_work)
     # Test this combination of libraries.
-    set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_threadlibs})
+    set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${_libraries} ${_deps})
     if(CMAKE_Fortran_COMPILER_LOADED)
       check_fortran_function_exists("${_name}" ${_prefix}${_combined_name}_WORKS)
     else()
@@ -275,14 +272,15 @@
 
   if(_libraries_work)
     if("${_list}" STREQUAL "")
-      set(${LIBRARIES} "${LIBRARIES}-PLACEHOLDER-FOR-EMPTY-LIBRARIES")
+      set(_libraries "${LIBRARIES}-PLACEHOLDER-FOR-EMPTY-LIBRARIES")
     else()
-      set(${LIBRARIES} ${${LIBRARIES}} ${_threadlibs})
+      list(APPEND _libraries ${_deps})
     endif()
   else()
-    set(${LIBRARIES} FALSE)
+    set(_libraries FALSE)
   endif()
-endmacro()
+  set(${LIBRARIES} "${_libraries}" PARENT_SCOPE)
+endfunction()
 
 set(BLAS_LINKER_FLAGS)
 set(BLAS_LIBRARIES)
diff --git a/Modules/FindLAPACK.cmake b/Modules/FindLAPACK.cmake
index a5b16ca..d89c40d 100644
--- a/Modules/FindLAPACK.cmake
+++ b/Modules/FindLAPACK.cmake
@@ -190,22 +190,16 @@
 
 # TODO: move this stuff to a separate module
 
-macro(CHECK_LAPACK_LIBRARIES LIBRARIES _prefix _name _flags _list _threadlibs _addlibdir _subdirs _blas)
-  # This macro checks for the existence of the combination of fortran libraries
-  # given by _list.  If the combination is found, this macro checks (using the
-  # Check_Fortran_Function_Exists macro) whether can link against that library
-  # combination using the name of a routine given by _name using the linker
-  # flags given by _flags.  If the combination of libraries is found and passes
-  # the link test, LIBRARIES is set to the list of complete library paths that
-  # have been found.  Otherwise, LIBRARIES is set to FALSE.
-
-  # N.B. _prefix is the prefix applied to the names of all cached variables that
-  # are generated internally and marked advanced by this macro.
-  # _addlibdir is a list of additional search paths. _subdirs is a list of path
-  # suffixes to be used by find_library().
+function(CHECK_LAPACK_LIBRARIES LIBRARIES _prefix _name _flags _list _deps _addlibdir _subdirs _blas)
+  # This function checks for the existence of the combination of libraries
+  # given by _list.  If the combination is found, this checks whether can link
+  # against that library combination using the name of a routine given by _name
+  # using the linker flags given by _flags.  If the combination of libraries is
+  # found and passes the link test, ${LIBRARIES} is set to the list of complete
+  # library paths that have been found.  Otherwise, ${LIBRARIES} is set to FALSE.
 
   set(_libraries_work TRUE)
-  set(${LIBRARIES})
+  set(_libraries)
   set(_combined_name)
 
   set(_extaddlibdir "${_addlibdir}")
@@ -218,13 +212,16 @@
   endif()
   list(APPEND _extaddlibdir "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}")
 
-  foreach(_library ${_list} ${_threadlibs})
-    if(_library MATCHES "^-Wl,--(start|end)-group$")
-      # Respect linker flags like --start/end-group (required by MKL)
-      set(${LIBRARIES} ${${LIBRARIES}} "${_library}")
+  foreach(_library ${_list})
+    if(_library MATCHES "^-")
+      # Respect linker flags as-is (required by MKL)
+      list(APPEND _libraries "${_library}")
     else()
       string(REGEX REPLACE "[^A-Za-z0-9]" "_" _lib_var "${_library}")
       set(_combined_name ${_combined_name}_${_lib_var})
+      if(NOT "${_deps}" STREQUAL "")
+        set(_combined_name ${_combined_name}_deps)
+      endif()
       if(_libraries_work)
         find_library(${_prefix}_${_lib_var}_LIBRARY
           NAMES ${_library}
@@ -233,12 +230,11 @@
           PATH_SUFFIXES ${_subdirs}
         )
         mark_as_advanced(${_prefix}_${_lib_var}_LIBRARY)
-        set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_lib_var}_LIBRARY})
+        list(APPEND _libraries ${${_prefix}_${_lib_var}_LIBRARY})
         set(_libraries_work ${${_prefix}_${_lib_var}_LIBRARY})
       endif()
     endif()
   endforeach()
-  unset(_library)
 
   foreach(_flag ${_flags})
     string(REGEX REPLACE "[^A-Za-z0-9]" "_" _flag_var "${_flag}")
@@ -246,7 +242,7 @@
   endforeach()
   if(_libraries_work)
     # Test this combination of libraries.
-    set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_blas} ${_threadlibs})
+    set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${_libraries} ${_blas} ${_deps})
     if(CMAKE_Fortran_COMPILER_LOADED)
       check_fortran_function_exists("${_name}" ${_prefix}${_combined_name}_WORKS)
     else()
@@ -258,18 +254,15 @@
 
   if(_libraries_work)
     if("${_list}${_blas}" STREQUAL "")
-      set(${LIBRARIES} "${LIBRARIES}-PLACEHOLDER-FOR-EMPTY-LIBRARIES")
+      set(_libraries "${LIBRARIES}-PLACEHOLDER-FOR-EMPTY-LIBRARIES")
     else()
-      set(${LIBRARIES} ${${LIBRARIES}} ${_blas} ${_threadlibs})
+      list(APPEND _libraries ${_blas} ${_deps})
     endif()
   else()
-    set(${LIBRARIES} FALSE)
+    set(_libraries FALSE)
   endif()
-
-  unset(_extaddlibdir)
-  unset(_libraries_work)
-  unset(_combined_name)
-endmacro()
+  set(${LIBRARIES} "${_libraries}" PARENT_SCOPE)
+endfunction()
 
 macro(_lapack_find_dependency dep)
   set(_lapack_quiet_arg)
diff --git a/Source/CMakeVersion.cmake b/Source/CMakeVersion.cmake
index 8930a5f..14ed182 100644
--- a/Source/CMakeVersion.cmake
+++ b/Source/CMakeVersion.cmake
@@ -1,7 +1,7 @@
 # CMake version number components.
 set(CMake_VERSION_MAJOR 3)
 set(CMake_VERSION_MINOR 20)
-set(CMake_VERSION_PATCH 20210414)
+set(CMake_VERSION_PATCH 20210415)
 #set(CMake_VERSION_RC 0)
 set(CMake_VERSION_IS_DIRTY 0)
 
diff --git a/Tests/FindBLAS/CMakeLists.txt b/Tests/FindBLAS/CMakeLists.txt
index 667195d..47ec568 100644
--- a/Tests/FindBLAS/CMakeLists.txt
+++ b/Tests/FindBLAS/CMakeLists.txt
@@ -1,10 +1,12 @@
-add_test(NAME FindBLAS.Test COMMAND
-  ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
-  --build-and-test
-  "${CMake_SOURCE_DIR}/Tests/FindBLAS/Test"
-  "${CMake_BINARY_DIR}/Tests/FindBLAS/Test"
-  ${build_generator_args}
-  --build-project TestFindBLAS
-  --build-options ${build_options}
-  --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
-  )
+foreach(vendor IN LISTS CMake_TEST_FindBLAS)
+  add_test(NAME FindBLAS.Test_${vendor} COMMAND
+    ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+    --build-and-test
+    "${CMake_SOURCE_DIR}/Tests/FindBLAS/Test"
+    "${CMake_BINARY_DIR}/Tests/FindBLAS/Test_${vendor}"
+    ${build_generator_args}
+    --build-project TestFindBLAS
+    --build-options ${build_options} -DBLA_VENDOR=${vendor}
+    --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+    )
+endforeach()
diff --git a/Tests/FindBLAS/Test/CMakeLists.txt b/Tests/FindBLAS/Test/CMakeLists.txt
index 59418f3..1bebf8e 100644
--- a/Tests/FindBLAS/Test/CMakeLists.txt
+++ b/Tests/FindBLAS/Test/CMakeLists.txt
@@ -11,3 +11,9 @@
 add_executable(test_var main.c)
 target_link_libraries(test_var PRIVATE ${BLAS_LIBRARIES})
 add_test(NAME test_var COMMAND test_var)
+
+if(BLA_VENDOR STREQUAL "Intel10_64lp")
+  if(NOT BLAS_LIBRARIES MATCHES "^[^;]*mkl_intel_lp64")
+    message(FATAL_ERROR "BLAS_LIBRARIES does not start in mkl_intel_lp64:\n ${BLAS_LIBRARIES}")
+  endif()
+endif()
diff --git a/Tests/FindLAPACK/CMakeLists.txt b/Tests/FindLAPACK/CMakeLists.txt
index 2081d59..5e2ea7a 100644
--- a/Tests/FindLAPACK/CMakeLists.txt
+++ b/Tests/FindLAPACK/CMakeLists.txt
@@ -1,10 +1,12 @@
-add_test(NAME FindLAPACK.Test COMMAND
-  ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
-  --build-and-test
-  "${CMake_SOURCE_DIR}/Tests/FindLAPACK/Test"
-  "${CMake_BINARY_DIR}/Tests/FindLAPACK/Test"
-  ${build_generator_args}
-  --build-project TestFindLAPACK
-  --build-options ${build_options}
-  --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
-  )
+foreach(vendor IN LISTS CMake_TEST_FindLAPACK)
+  add_test(NAME FindLAPACK.Test_${vendor} COMMAND
+    ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+    --build-and-test
+    "${CMake_SOURCE_DIR}/Tests/FindLAPACK/Test"
+    "${CMake_BINARY_DIR}/Tests/FindLAPACK/Test_${vendor}"
+    ${build_generator_args}
+    --build-project TestFindLAPACK
+    --build-options ${build_options} -DBLA_VENDOR=${vendor}
+    --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+    )
+endforeach()
diff --git a/Tests/FindLAPACK/Test/CMakeLists.txt b/Tests/FindLAPACK/Test/CMakeLists.txt
index 8afa36a..67fb9bd 100644
--- a/Tests/FindLAPACK/Test/CMakeLists.txt
+++ b/Tests/FindLAPACK/Test/CMakeLists.txt
@@ -11,3 +11,9 @@
 add_executable(test_var main.c)
 target_link_libraries(test_var PRIVATE ${LAPACK_LIBRARIES})
 add_test(NAME test_var COMMAND test_var)
+
+if(BLA_VENDOR STREQUAL "Intel10_64lp")
+  if(NOT LAPACK_LIBRARIES MATCHES "^[^;]*mkl_intel_lp64")
+    message(FATAL_ERROR "LAPACK_LIBRARIES does not start in mkl_intel_lp64:\n ${LAPACK_LIBRARIES}")
+  endif()
+endif()