Merge topic 'doc-genex'

263f6b888c Help: Document TARGET_PROPERTY genex handling of transitive properties
f70eb84be7 Help: Clarify role of TARGET_NAME generator expression
36145e2680 Help: Organize target-dependent generator expressions into subsections
50eadd794e Help: Clarify cross-references to target-dependent generator expressions

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !9460
diff --git a/.clang-tidy b/.clang-tidy
index 03e6a51..6d2edd4 100644
--- a/.clang-tidy
+++ b/.clang-tidy
@@ -5,12 +5,16 @@
 -bugprone-easily-swappable-parameters,\
 -bugprone-empty-catch,\
 -bugprone-implicit-widening-of-multiplication-result,\
+-bugprone-inc-dec-in-conditions,\
 -bugprone-macro-parentheses,\
 -bugprone-misplaced-widening-cast,\
+-bugprone-multi-level-implicit-pointer-conversion,\
 -bugprone-narrowing-conversions,\
 -bugprone-switch-missing-default-case,\
 -bugprone-too-small-loop-variable,\
 -bugprone-unchecked-optional-access,\
+-bugprone-unused-local-non-trivial-variable,\
+-bugprone-unused-return-value,\
 misc-*,\
 -misc-confusable-identifiers,\
 -misc-const-correctness,\
@@ -31,9 +35,12 @@
 -modernize-use-transparent-functors,\
 performance-*,\
 -performance-avoid-endl,\
+-performance-enum-size,\
 -performance-inefficient-vector-operation,\
 -performance-noexcept-swap,\
 readability-*,\
+-readability-avoid-nested-conditional-operator,\
+-readability-avoid-return-with-void-value,\
 -readability-avoid-unconditional-preprocessor-if,\
 -readability-convert-member-functions-to-static,\
 -readability-function-cognitive-complexity,\
@@ -45,8 +52,11 @@
 -readability-magic-numbers,\
 -readability-make-member-function-const,\
 -readability-named-parameter,\
+-readability-redundant-casting,\
 -readability-redundant-declaration,\
+-readability-redundant-inline-specifier,\
 -readability-redundant-member-init,\
+-readability-reference-to-constructed-temporary,\
 -readability-simplify-boolean-expr,\
 -readability-static-accessed-through-instance,\
 -readability-suspicious-call-argument,\
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1508615..a3d959c 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -59,7 +59,7 @@
 
 p:doc-package:
     extends:
-        - .fedora39_sphinx_package
+        - .fedora40_sphinx_package
         - .cmake_prep_doc_linux
         - .linux_x86_64_tags
         - .cmake_doc_artifacts
@@ -108,18 +108,18 @@
         - .cmake_cdash_artifacts
         - .run_automatically
 
-l:tidy-fedora39:
+l:tidy-fedora40:
     extends:
-        - .fedora39_tidy
+        - .fedora40_tidy
         - .cmake_build_linux
         - .cmake_tidy_artifacts
         - .linux_x86_64_tags
         - .cmake_cdash_artifacts
         - .run_automatically
 
-l:sphinx-fedora39:
+l:sphinx-fedora40:
     extends:
-        - .fedora39_sphinx
+        - .fedora40_sphinx
         - .cmake_build_linux
         - .cmake_sphinx_artifacts
         - .linux_x86_64_tags
@@ -128,9 +128,9 @@
         CMAKE_CI_JOB_CONTINUOUS: "true"
         CMAKE_CI_JOB_HELP: "true"
 
-l:clang-analyzer-fedora39:
+l:clang-analyzer-fedora40:
     extends:
-        - .fedora39_clang_analyzer
+        - .fedora40_clang_analyzer
         - .cmake_build_linux
         - .linux_x86_64_tags
         - .run_automatically
@@ -234,9 +234,9 @@
     variables:
         CMAKE_CI_JOB_NIGHTLY: "true"
 
-t:fedora39-ninja-clang:
+t:fedora40-ninja-clang:
     extends:
-        - .fedora39_ninja_clang
+        - .fedora40_ninja_clang
         - .cmake_test_linux_release
         - .linux_x86_64_tags
         - .run_dependent
@@ -244,9 +244,9 @@
     variables:
         CMAKE_CI_JOB_NIGHTLY: "true"
 
-t:fedora39-ninja-multi-clang:
+t:fedora40-ninja-multi-clang:
     extends:
-        - .fedora39_ninja_multi_clang
+        - .fedora40_ninja_multi_clang
         - .cmake_test_linux_release
         - .linux_x86_64_tags
         - .run_dependent
@@ -254,9 +254,9 @@
     variables:
         CMAKE_CI_JOB_NIGHTLY: "true"
 
-t:fedora39-makefiles-clang:
+t:fedora40-makefiles-clang:
     extends:
-        - .fedora39_makefiles_clang
+        - .fedora40_makefiles_clang
         - .cmake_test_linux_release
         - .linux_x86_64_tags
         - .run_dependent
@@ -264,17 +264,17 @@
     variables:
         CMAKE_CI_JOB_NIGHTLY: "true"
 
-t:fedora39-makefiles:
+t:fedora40-makefiles:
     extends:
-        - .fedora39_makefiles
+        - .fedora40_makefiles
         - .cmake_test_linux_release
         - .linux_x86_64_tags
         - .run_dependent
         - .needs_centos7_x86_64
 
-t:fedora39-makefiles-nospace:
+t:fedora40-makefiles-nospace:
     extends:
-        - .fedora39_makefiles
+        - .fedora40_makefiles
         - .cmake_test_linux_release
         - .linux_x86_64_tags
         - .cmake_junit_artifacts
@@ -282,7 +282,7 @@
         - .needs_centos7_x86_64
     variables:
         GIT_CLONE_PATH: "$CI_BUILDS_DIR/cmake-ci"
-        CMAKE_CI_BUILD_NAME: fedora39_makefiles_nospace
+        CMAKE_CI_BUILD_NAME: fedora40_makefiles_nospace
         CMAKE_CI_JOB_NIGHTLY: "true"
 
 t:nvhpc22.11-ninja:
@@ -406,26 +406,6 @@
     variables:
         CMAKE_CI_JOB_NIGHTLY: "true"
 
-t:linux-gcc-cxx-modules-ninja:
-    extends:
-        - .gcc_cxx_modules_ninja
-        - .cmake_test_linux_release
-        - .linux_x86_64_tags
-        - .run_dependent
-        - .needs_centos7_x86_64
-    variables:
-        CMAKE_CI_JOB_NIGHTLY: "true"
-
-t:linux-gcc-cxx-modules-ninja-multi:
-    extends:
-        - .gcc_cxx_modules_ninja_multi
-        - .cmake_test_linux_release
-        - .linux_x86_64_tags
-        - .run_dependent
-        - .needs_centos7_x86_64
-    variables:
-        CMAKE_CI_JOB_NIGHTLY: "true"
-
 t:debian10-legacy:
     extends:
         - .debian10_legacy
@@ -437,9 +417,9 @@
     variables:
         CMAKE_CI_JOB_NIGHTLY: "true"
 
-b:fedora39-ninja:
+b:fedora40-ninja:
     extends:
-        - .fedora39_ninja
+        - .fedora40_ninja
         - .cmake_build_linux
         - .cmake_build_artifacts
         - .linux_x86_64_tags
@@ -447,9 +427,9 @@
     variables:
         CMAKE_CI_JOB_CONTINUOUS: "true"
 
-b:fedora39-makefiles-symlinked:
+b:fedora40-makefiles-symlinked:
     extends:
-        - .fedora39_makefiles_symlinked
+        - .fedora40_makefiles_symlinked
         - .cmake_build_linux
         - .cmake_build_artifacts
         - .linux_x86_64_tags
@@ -484,54 +464,54 @@
     variables:
         CMAKE_CI_JOB_NIGHTLY: "true"
 
-b:fedora39-extdeps:
+b:fedora40-extdeps:
     extends:
-        - .fedora39_extdeps
+        - .fedora40_extdeps
         - .cmake_build_linux_standalone
         - .linux_x86_64_tags
         - .run_manually
     variables:
         CMAKE_CI_JOB_NIGHTLY: "true"
 
-t:fedora39-ninja:
+t:fedora40-ninja:
     extends:
-        - .fedora39_ninja
+        - .fedora40_ninja
         - .cmake_test_linux
         - .linux_x86_64_tags_x11
         - .cmake_test_artifacts
         - .run_dependent
     dependencies:
-        - b:fedora39-ninja
+        - b:fedora40-ninja
     needs:
-        - b:fedora39-ninja
+        - b:fedora40-ninja
     variables:
         CMAKE_CI_JOB_CONTINUOUS: "true"
 
-t:fedora39-makefiles-symlinked:
+t:fedora40-makefiles-symlinked:
     extends:
-        - .fedora39_makefiles_symlinked
+        - .fedora40_makefiles_symlinked
         - .cmake_test_linux
         - .linux_x86_64_tags_x11
         - .cmake_test_artifacts
         - .run_dependent
     dependencies:
-        - b:fedora39-makefiles-symlinked
+        - b:fedora40-makefiles-symlinked
     needs:
-        - b:fedora39-makefiles-symlinked
+        - b:fedora40-makefiles-symlinked
     variables:
         CMAKE_CI_JOB_NIGHTLY: "true"
 
-t:fedora39-ninja-multi:
+t:fedora40-ninja-multi:
     extends:
-        - .fedora39_ninja_multi
+        - .fedora40_ninja_multi
         - .cmake_test_linux_external
         - .linux_x86_64_tags
         - .cmake_junit_artifacts
         - .run_dependent
     dependencies:
-        - t:fedora39-ninja
+        - t:fedora40-ninja
     needs:
-        - t:fedora39-ninja
+        - t:fedora40-ninja
 
 t:intel2016u2-makefiles:
     extends:
@@ -786,9 +766,9 @@
 
 ## Sanitizer builds
 
-b:fedora39-asan:
+b:fedora40-asan:
     extends:
-        - .fedora39_asan
+        - .fedora40_asan
         - .cmake_build_linux
         - .cmake_build_artifacts
         - .linux_x86_64_tags
@@ -796,16 +776,16 @@
     variables:
         CMAKE_CI_JOB_NIGHTLY: "true"
 
-t:fedora39-asan:
+t:fedora40-asan:
     extends:
-        - .fedora39_asan
+        - .fedora40_asan
         - .cmake_memcheck_linux
         - .linux_x86_64_tags
         - .run_dependent
     dependencies:
-        - b:fedora39-asan
+        - b:fedora40-asan
     needs:
-        - b:fedora39-asan
+        - b:fedora40-asan
     variables:
         CMAKE_CI_JOB_NIGHTLY: "true"
 
diff --git a/.gitlab/ci/configure_debian12_aarch64_ninja.cmake b/.gitlab/ci/configure_debian12_aarch64_ninja.cmake
index 0e2c991..24be975 100644
--- a/.gitlab/ci/configure_debian12_aarch64_ninja.cmake
+++ b/.gitlab/ci/configure_debian12_aarch64_ninja.cmake
@@ -64,6 +64,9 @@
 set(CMake_TEST_FindMPI "ON" CACHE BOOL "")
 set(CMake_TEST_FindODBC "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenACC "ON" CACHE BOOL "")
+set(CMake_TEST_FindOpenACC_C "ON" CACHE BOOL "")
+set(CMake_TEST_FindOpenACC_CXX "ON" CACHE BOOL "")
+set(CMake_TEST_FindOpenACC_Fortran "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenAL "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenGL "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenMP_C "ON" CACHE BOOL "")
diff --git a/.gitlab/ci/configure_debian12_ninja_common.cmake b/.gitlab/ci/configure_debian12_ninja_common.cmake
index b3a97f6..98ae771 100644
--- a/.gitlab/ci/configure_debian12_ninja_common.cmake
+++ b/.gitlab/ci/configure_debian12_ninja_common.cmake
@@ -69,6 +69,9 @@
 set(CMake_TEST_FindMPI "ON" CACHE BOOL "")
 set(CMake_TEST_FindODBC "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenACC "ON" CACHE BOOL "")
+set(CMake_TEST_FindOpenACC_C "ON" CACHE BOOL "")
+set(CMake_TEST_FindOpenACC_CXX "ON" CACHE BOOL "")
+set(CMake_TEST_FindOpenACC_Fortran "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenAL "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenGL "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenMP_C "ON" CACHE BOOL "")
diff --git a/.gitlab/ci/configure_fedora39_clang_analyzer.cmake b/.gitlab/ci/configure_fedora39_clang_analyzer.cmake
deleted file mode 100644
index 1bfb3fb..0000000
--- a/.gitlab/ci/configure_fedora39_clang_analyzer.cmake
+++ /dev/null
@@ -1,3 +0,0 @@
-set(configure_no_sccache 1)
-
-include("${CMAKE_CURRENT_LIST_DIR}/configure_fedora39_common.cmake")
diff --git a/.gitlab/ci/configure_fedora39_common_clang.cmake b/.gitlab/ci/configure_fedora39_common_clang.cmake
deleted file mode 100644
index 1b3835a..0000000
--- a/.gitlab/ci/configure_fedora39_common_clang.cmake
+++ /dev/null
@@ -1,5 +0,0 @@
-set(CMAKE_Fortran_COMPILER "/usr/bin/flang-new" CACHE FILEPATH "")
-set(CMAKE_Fortran_COMPILER_ID "LLVMFlang" CACHE STRING "")
-set(CMAKE_Fortran_COMPILER_SUPPORTS_F90 "1" CACHE BOOL "")
-
-include("${CMAKE_CURRENT_LIST_DIR}/configure_external_test.cmake")
diff --git a/.gitlab/ci/configure_fedora39_makefiles_symlinked.cmake b/.gitlab/ci/configure_fedora39_makefiles_symlinked.cmake
deleted file mode 100644
index b53ab66..0000000
--- a/.gitlab/ci/configure_fedora39_makefiles_symlinked.cmake
+++ /dev/null
@@ -1,2 +0,0 @@
-include("${CMAKE_CURRENT_LIST_DIR}/configure_symlinked_common.cmake")
-include("${CMAKE_CURRENT_LIST_DIR}/configure_fedora39_common.cmake")
diff --git a/.gitlab/ci/configure_fedora39_ninja_multi.cmake b/.gitlab/ci/configure_fedora39_ninja_multi.cmake
deleted file mode 100644
index 94af721..0000000
--- a/.gitlab/ci/configure_fedora39_ninja_multi.cmake
+++ /dev/null
@@ -1,5 +0,0 @@
-if (NOT "$ENV{CMAKE_CI_NIGHTLY}" STREQUAL "")
-  set(CMake_TEST_ISPC "ON" CACHE STRING "")
-endif()
-
-include("${CMAKE_CURRENT_LIST_DIR}/configure_external_test.cmake")
diff --git a/.gitlab/ci/configure_fedora39_ninja_multi_clang.cmake b/.gitlab/ci/configure_fedora39_ninja_multi_clang.cmake
deleted file mode 100644
index 79d3eaa..0000000
--- a/.gitlab/ci/configure_fedora39_ninja_multi_clang.cmake
+++ /dev/null
@@ -1,3 +0,0 @@
-set(CMake_TEST_MODULE_COMPILATION "named,compile_commands,collation,partitions,internal_partitions,export_bmi,install_bmi,shared,bmionly" CACHE STRING "")
-
-include("${CMAKE_CURRENT_LIST_DIR}/configure_fedora39_common_clang.cmake")
diff --git a/.gitlab/ci/configure_fedora39_asan.cmake b/.gitlab/ci/configure_fedora40_asan.cmake
similarity index 65%
rename from .gitlab/ci/configure_fedora39_asan.cmake
rename to .gitlab/ci/configure_fedora40_asan.cmake
index 872517c..ccdba4e 100644
--- a/.gitlab/ci/configure_fedora39_asan.cmake
+++ b/.gitlab/ci/configure_fedora40_asan.cmake
@@ -1,4 +1,4 @@
 set(CMAKE_C_FLAGS "-fsanitize=address" CACHE STRING "")
 set(CMAKE_CXX_FLAGS "-fsanitize=address" CACHE STRING "")
 
-include("${CMAKE_CURRENT_LIST_DIR}/configure_fedora39_common.cmake")
+include("${CMAKE_CURRENT_LIST_DIR}/configure_fedora40_common.cmake")
diff --git a/.gitlab/ci/configure_fedora40_clang_analyzer.cmake b/.gitlab/ci/configure_fedora40_clang_analyzer.cmake
new file mode 100644
index 0000000..c210126
--- /dev/null
+++ b/.gitlab/ci/configure_fedora40_clang_analyzer.cmake
@@ -0,0 +1,3 @@
+set(configure_no_sccache 1)
+
+include("${CMAKE_CURRENT_LIST_DIR}/configure_fedora40_common.cmake")
diff --git a/.gitlab/ci/configure_fedora39_common.cmake b/.gitlab/ci/configure_fedora40_common.cmake
similarity index 100%
rename from .gitlab/ci/configure_fedora39_common.cmake
rename to .gitlab/ci/configure_fedora40_common.cmake
diff --git a/.gitlab/ci/configure_fedora40_common_clang.cmake b/.gitlab/ci/configure_fedora40_common_clang.cmake
new file mode 100644
index 0000000..a4ae3f3
--- /dev/null
+++ b/.gitlab/ci/configure_fedora40_common_clang.cmake
@@ -0,0 +1,17 @@
+set(CMAKE_Fortran_COMPILER "/usr/bin/flang-new" CACHE FILEPATH "")
+set(CMAKE_Fortran_COMPILER_ID "LLVMFlang" CACHE STRING "")
+set(CMAKE_Fortran_COMPILER_SUPPORTS_F90 "1" CACHE BOOL "")
+
+set(CMake_TEST_C_STANDARDS "90;99;11;17;23" CACHE STRING "")
+set(CMake_TEST_CXX_STANDARDS "98;11;14;17;20;23;26" CACHE STRING "")
+
+set(CMake_TEST_FindOpenACC "ON" CACHE BOOL "")
+set(CMake_TEST_FindOpenACC_C "ON" CACHE BOOL "")
+set(CMake_TEST_FindOpenACC_CXX "ON" CACHE BOOL "")
+set(CMake_TEST_FindOpenACC_Fortran "OFF" CACHE BOOL "") # flang-new fails producing LLVM IR
+set(CMake_TEST_FindOpenMP_C "ON" CACHE BOOL "")
+set(CMake_TEST_FindOpenMP_CXX "ON" CACHE BOOL "")
+set(CMake_TEST_FindOpenMP_Fortran "ON" CACHE BOOL "")
+set(CMake_TEST_FindOpenMP "ON" CACHE BOOL "")
+
+include("${CMAKE_CURRENT_LIST_DIR}/configure_external_test.cmake")
diff --git a/.gitlab/ci/configure_fedora39_extdeps.cmake b/.gitlab/ci/configure_fedora40_extdeps.cmake
similarity index 100%
rename from .gitlab/ci/configure_fedora39_extdeps.cmake
rename to .gitlab/ci/configure_fedora40_extdeps.cmake
diff --git a/.gitlab/ci/configure_fedora39_makefiles.cmake b/.gitlab/ci/configure_fedora40_makefiles.cmake
similarity index 96%
rename from .gitlab/ci/configure_fedora39_makefiles.cmake
rename to .gitlab/ci/configure_fedora40_makefiles.cmake
index 90d8343..478ba11 100644
--- a/.gitlab/ci/configure_fedora39_makefiles.cmake
+++ b/.gitlab/ci/configure_fedora40_makefiles.cmake
@@ -1,5 +1,5 @@
 set(CMake_TEST_C_STANDARDS "90;99;11;17;23" CACHE STRING "")
-set(CMake_TEST_CXX_STANDARDS "98;11;14;17;20;23" CACHE STRING "")
+set(CMake_TEST_CXX_STANDARDS "98;11;14;17;20;23;26" CACHE STRING "")
 
 set(CMake_TEST_CTestUpdate_BZR "ON" CACHE BOOL "")
 set(CMake_TEST_CTestUpdate_GIT "ON" CACHE BOOL "")
@@ -67,6 +67,9 @@
 set(CMake_TEST_FindMPI "ON" CACHE BOOL "")
 set(CMake_TEST_FindODBC "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenACC "ON" CACHE BOOL "")
+set(CMake_TEST_FindOpenACC_C "ON" CACHE BOOL "")
+set(CMake_TEST_FindOpenACC_CXX "ON" CACHE BOOL "")
+set(CMake_TEST_FindOpenACC_Fortran "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenAL "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenGL "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenMP_C "ON" CACHE BOOL "")
diff --git a/.gitlab/ci/configure_fedora39_makefiles_clang.cmake b/.gitlab/ci/configure_fedora40_makefiles_clang.cmake
similarity index 68%
rename from .gitlab/ci/configure_fedora39_makefiles_clang.cmake
rename to .gitlab/ci/configure_fedora40_makefiles_clang.cmake
index a85ae70..d5739c3 100644
--- a/.gitlab/ci/configure_fedora39_makefiles_clang.cmake
+++ b/.gitlab/ci/configure_fedora40_makefiles_clang.cmake
@@ -2,4 +2,4 @@
   set(CMAKE_TESTS_CDASH_SERVER "https://open.cdash.org" CACHE STRING "")
 endif()
 
-include("${CMAKE_CURRENT_LIST_DIR}/configure_fedora39_common_clang.cmake")
+include("${CMAKE_CURRENT_LIST_DIR}/configure_fedora40_common_clang.cmake")
diff --git a/.gitlab/ci/configure_fedora40_makefiles_symlinked.cmake b/.gitlab/ci/configure_fedora40_makefiles_symlinked.cmake
new file mode 100644
index 0000000..6a677fd
--- /dev/null
+++ b/.gitlab/ci/configure_fedora40_makefiles_symlinked.cmake
@@ -0,0 +1,2 @@
+include("${CMAKE_CURRENT_LIST_DIR}/configure_symlinked_common.cmake")
+include("${CMAKE_CURRENT_LIST_DIR}/configure_fedora40_common.cmake")
diff --git a/.gitlab/ci/configure_fedora39_ninja.cmake b/.gitlab/ci/configure_fedora40_ninja.cmake
similarity index 71%
rename from .gitlab/ci/configure_fedora39_ninja.cmake
rename to .gitlab/ci/configure_fedora40_ninja.cmake
index 8d04bde..b16e928 100644
--- a/.gitlab/ci/configure_fedora39_ninja.cmake
+++ b/.gitlab/ci/configure_fedora40_ninja.cmake
@@ -2,6 +2,7 @@
 if (NOT "$ENV{CMAKE_CI_NIGHTLY}" STREQUAL "")
   set(CMake_TEST_ISPC "ON" CACHE STRING "")
 endif()
+set(CMake_TEST_MODULE_COMPILATION "named,compile_commands,collation,partitions,internal_partitions,export_bmi,install_bmi,shared,bmionly" CACHE STRING "")
 set(CMake_TEST_TLS_VERIFY_URL "https://gitlab.kitware.com" CACHE STRING "")
 set(CMake_TEST_TLS_VERSION "1.3" CACHE STRING "")
 
@@ -12,4 +13,4 @@
 # Cover compilation with C++11 only and not higher standards.
 set(CMAKE_CXX_STANDARD "11" CACHE STRING "")
 
-include("${CMAKE_CURRENT_LIST_DIR}/configure_fedora39_common.cmake")
+include("${CMAKE_CURRENT_LIST_DIR}/configure_fedora40_common.cmake")
diff --git a/.gitlab/ci/configure_fedora39_ninja_clang.cmake b/.gitlab/ci/configure_fedora40_ninja_clang.cmake
similarity index 72%
rename from .gitlab/ci/configure_fedora39_ninja_clang.cmake
rename to .gitlab/ci/configure_fedora40_ninja_clang.cmake
index 79d3eaa..c760603 100644
--- a/.gitlab/ci/configure_fedora39_ninja_clang.cmake
+++ b/.gitlab/ci/configure_fedora40_ninja_clang.cmake
@@ -1,3 +1,3 @@
 set(CMake_TEST_MODULE_COMPILATION "named,compile_commands,collation,partitions,internal_partitions,export_bmi,install_bmi,shared,bmionly" CACHE STRING "")
 
-include("${CMAKE_CURRENT_LIST_DIR}/configure_fedora39_common_clang.cmake")
+include("${CMAKE_CURRENT_LIST_DIR}/configure_fedora40_common_clang.cmake")
diff --git a/.gitlab/ci/configure_fedora40_ninja_multi.cmake b/.gitlab/ci/configure_fedora40_ninja_multi.cmake
new file mode 100644
index 0000000..f77606e
--- /dev/null
+++ b/.gitlab/ci/configure_fedora40_ninja_multi.cmake
@@ -0,0 +1,6 @@
+if (NOT "$ENV{CMAKE_CI_NIGHTLY}" STREQUAL "")
+  set(CMake_TEST_ISPC "ON" CACHE STRING "")
+endif()
+set(CMake_TEST_MODULE_COMPILATION "named,compile_commands,collation,partitions,internal_partitions,export_bmi,install_bmi,shared,bmionly" CACHE STRING "")
+
+include("${CMAKE_CURRENT_LIST_DIR}/configure_external_test.cmake")
diff --git a/.gitlab/ci/configure_fedora39_ninja_clang.cmake b/.gitlab/ci/configure_fedora40_ninja_multi_clang.cmake
similarity index 72%
copy from .gitlab/ci/configure_fedora39_ninja_clang.cmake
copy to .gitlab/ci/configure_fedora40_ninja_multi_clang.cmake
index 79d3eaa..c760603 100644
--- a/.gitlab/ci/configure_fedora39_ninja_clang.cmake
+++ b/.gitlab/ci/configure_fedora40_ninja_multi_clang.cmake
@@ -1,3 +1,3 @@
 set(CMake_TEST_MODULE_COMPILATION "named,compile_commands,collation,partitions,internal_partitions,export_bmi,install_bmi,shared,bmionly" CACHE STRING "")
 
-include("${CMAKE_CURRENT_LIST_DIR}/configure_fedora39_common_clang.cmake")
+include("${CMAKE_CURRENT_LIST_DIR}/configure_fedora40_common_clang.cmake")
diff --git a/.gitlab/ci/configure_fedora39_sphinx.cmake b/.gitlab/ci/configure_fedora40_sphinx.cmake
similarity index 100%
rename from .gitlab/ci/configure_fedora39_sphinx.cmake
rename to .gitlab/ci/configure_fedora40_sphinx.cmake
diff --git a/.gitlab/ci/configure_fedora39_sphinx_package.cmake b/.gitlab/ci/configure_fedora40_sphinx_package.cmake
similarity index 100%
rename from .gitlab/ci/configure_fedora39_sphinx_package.cmake
rename to .gitlab/ci/configure_fedora40_sphinx_package.cmake
diff --git a/.gitlab/ci/configure_fedora39_tidy.cmake b/.gitlab/ci/configure_fedora40_tidy.cmake
similarity index 83%
rename from .gitlab/ci/configure_fedora39_tidy.cmake
rename to .gitlab/ci/configure_fedora40_tidy.cmake
index 7a3eaa6..037732c 100644
--- a/.gitlab/ci/configure_fedora39_tidy.cmake
+++ b/.gitlab/ci/configure_fedora40_tidy.cmake
@@ -3,4 +3,4 @@
 set(CMake_CLANG_TIDY_MODULE "$ENV{CI_PROJECT_DIR}/Utilities/ClangTidyModule/build/libcmake-clang-tidy-module.so" CACHE FILEPATH "")
 set(CMake_CLANG_TIDY_EXPORT_FIXES_DIR "$ENV{CI_PROJECT_DIR}/.gitlab/clang-tidy-fixes" CACHE PATH "")
 
-include("${CMAKE_CURRENT_LIST_DIR}/configure_fedora39_common.cmake")
+include("${CMAKE_CURRENT_LIST_DIR}/configure_fedora40_common.cmake")
diff --git a/.gitlab/ci/configure_linux_gcc_cxx_modules_ninja.cmake b/.gitlab/ci/configure_linux_gcc_cxx_modules_ninja.cmake
deleted file mode 100644
index f0ba9eb..0000000
--- a/.gitlab/ci/configure_linux_gcc_cxx_modules_ninja.cmake
+++ /dev/null
@@ -1,3 +0,0 @@
-set(CMake_TEST_MODULE_COMPILATION "named,compile_commands,collation,partitions,internal_partitions,export_bmi,install_bmi,bmionly" CACHE STRING "")
-
-include("${CMAKE_CURRENT_LIST_DIR}/configure_external_test.cmake")
diff --git a/.gitlab/ci/configure_linux_gcc_cxx_modules_ninja_multi.cmake b/.gitlab/ci/configure_linux_gcc_cxx_modules_ninja_multi.cmake
deleted file mode 100644
index f0ba9eb..0000000
--- a/.gitlab/ci/configure_linux_gcc_cxx_modules_ninja_multi.cmake
+++ /dev/null
@@ -1,3 +0,0 @@
-set(CMake_TEST_MODULE_COMPILATION "named,compile_commands,collation,partitions,internal_partitions,export_bmi,install_bmi,bmionly" CACHE STRING "")
-
-include("${CMAKE_CURRENT_LIST_DIR}/configure_external_test.cmake")
diff --git a/.gitlab/ci/ctest_memcheck_fedora39_asan.lsan.supp b/.gitlab/ci/ctest_memcheck_fedora40_asan.lsan.supp
similarity index 100%
rename from .gitlab/ci/ctest_memcheck_fedora39_asan.lsan.supp
rename to .gitlab/ci/ctest_memcheck_fedora40_asan.lsan.supp
diff --git a/.gitlab/ci/docker/fedora39-hip/Dockerfile b/.gitlab/ci/docker/fedora39-hip/Dockerfile
new file mode 100644
index 0000000..0347cc4
--- /dev/null
+++ b/.gitlab/ci/docker/fedora39-hip/Dockerfile
@@ -0,0 +1,27 @@
+# syntax=docker/dockerfile:1
+
+ARG BASE_IMAGE=fedora:39
+
+FROM ${BASE_IMAGE} AS dnf-cache
+# Populate DNF cache w/ the fresh metadata and prefetch packages.
+RUN --mount=type=bind,source=deps_packages.lst,target=/root/deps_packages.lst \
+    --mount=type=tmpfs,target=/var/log \
+    --mount=type=tmpfs,target=/tmp \
+    dnf install \
+        --setopt=install_weak_deps=False \
+        --setopt=fastestmirror=True \
+        --setopt=max_parallel_downloads=10 \
+        --downloadonly \
+        -y \
+        $(grep -h '^[^#]\+$' /root/*.lst)
+
+FROM ${BASE_IMAGE}
+LABEL maintainer="Brad King <brad.king@kitware.com>"
+
+RUN --mount=type=bind,source=install_deps.sh,target=/root/install_deps.sh \
+    --mount=type=bind,source=deps_packages.lst,target=/root/deps_packages.lst \
+    --mount=type=cache,from=dnf-cache,source=/var/cache/dnf,target=/var/cache/dnf,sharing=private \
+    --mount=type=cache,target=/var/cache/pip \
+    --mount=type=tmpfs,target=/var/log \
+    --mount=type=tmpfs,target=/tmp \
+    sh /root/install_deps.sh
diff --git a/.gitlab/ci/docker/fedora39-hip/deps_packages.lst b/.gitlab/ci/docker/fedora39-hip/deps_packages.lst
new file mode 100644
index 0000000..70b114c
--- /dev/null
+++ b/.gitlab/ci/docker/fedora39-hip/deps_packages.lst
@@ -0,0 +1,15 @@
+# Install development tools.
+clang
+clang-tools-extra
+compiler-rt
+gcc-c++
+git-core
+make
+
+# Install HIP language toolchain.
+hsakmt-devel
+lld
+llvm
+rocm-comgr-devel
+rocm-hip-devel
+rocm-runtime-devel
diff --git a/.gitlab/ci/docker/fedora39-hip/install_deps.sh b/.gitlab/ci/docker/fedora39-hip/install_deps.sh
new file mode 100755
index 0000000..eedff9c
--- /dev/null
+++ b/.gitlab/ci/docker/fedora39-hip/install_deps.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+set -e
+
+dnf install \
+    --setopt=install_weak_deps=False \
+    --setopt=fastestmirror=True \
+    --setopt=max_parallel_downloads=10 \
+    -y \
+    $(grep '^[^#]\+$' /root/deps_packages.lst)
diff --git a/.gitlab/ci/docker/fedora39/Dockerfile b/.gitlab/ci/docker/fedora40/Dockerfile
similarity index 98%
rename from .gitlab/ci/docker/fedora39/Dockerfile
rename to .gitlab/ci/docker/fedora40/Dockerfile
index f14e017..896456c 100644
--- a/.gitlab/ci/docker/fedora39/Dockerfile
+++ b/.gitlab/ci/docker/fedora40/Dockerfile
@@ -1,6 +1,6 @@
 # syntax=docker/dockerfile:1
 
-ARG BASE_IMAGE=fedora:39
+ARG BASE_IMAGE=fedora:40
 
 FROM ${BASE_IMAGE} AS dnf-cache
 # Populate DNF cache w/ the fresh metadata and prefetch packages.
diff --git a/.gitlab/ci/docker/fedora39/deps_packages.lst b/.gitlab/ci/docker/fedora40/deps_packages.lst
similarity index 93%
rename from .gitlab/ci/docker/fedora39/deps_packages.lst
rename to .gitlab/ci/docker/fedora40/deps_packages.lst
index 1459894..c7bad7c 100644
--- a/.gitlab/ci/docker/fedora39/deps_packages.lst
+++ b/.gitlab/ci/docker/fedora40/deps_packages.lst
@@ -11,7 +11,6 @@
 clang-tools-extra-devel
 compiler-rt
 flang
-flang-devel
 gcc-c++
 git-core
 llvm-devel
@@ -32,6 +31,7 @@
 
 # Install documentation tools.
 python3-sphinx
+python3-sphinxcontrib-qthelp
 texinfo
 qt5-qttools-devel
 qt6-qttools-devel
@@ -49,13 +49,6 @@
 # Install ASM_NASM language toolchain.
 nasm
 
-# Install HIP language toolchain.
-hsakmt-devel
-lld
-rocm-comgr-devel
-rocm-hip-devel
-rocm-runtime-devel
-
 # Packages needed to test CTest.
 breezy
 subversion
@@ -99,6 +92,7 @@
 libicu-devel
 libinput-devel systemd-devel
 libjpeg-turbo-devel
+libomp-devel
 libpng-devel
 opensp-devel
 postgresql-server-devel
@@ -126,3 +120,6 @@
 xalan-c-devel
 xerces-c-devel
 xz-devel
+
+# Packages needed to test third-party binaries.
+ncurses-compat-libs
diff --git a/.gitlab/ci/docker/fedora39/install_deps.sh b/.gitlab/ci/docker/fedora40/install_deps.sh
similarity index 100%
rename from .gitlab/ci/docker/fedora39/install_deps.sh
rename to .gitlab/ci/docker/fedora40/install_deps.sh
diff --git a/.gitlab/ci/docker/fedora39/install_iwyu.sh b/.gitlab/ci/docker/fedora40/install_iwyu.sh
similarity index 77%
rename from .gitlab/ci/docker/fedora39/install_iwyu.sh
rename to .gitlab/ci/docker/fedora40/install_iwyu.sh
index 684e355..50ed612 100755
--- a/.gitlab/ci/docker/fedora39/install_iwyu.sh
+++ b/.gitlab/ci/docker/fedora40/install_iwyu.sh
@@ -18,13 +18,13 @@
 git checkout "clang_$llvm_version"
 git apply <<EOF
 diff --git a/iwyu_driver.cc b/iwyu_driver.cc
-index 42fea35..fbb77a9 100644
+index dd4b046..cfd568a 100644
 --- a/iwyu_driver.cc
 +++ b/iwyu_driver.cc
-@@ -167,6 +167,7 @@ CompilerInstance* CreateCompilerInstance(int argc, const char **argv) {
-   DiagnosticsEngine diagnostics(diagnostic_id, &*diagnostic_options,
-                                 diagnostic_client);
-   Driver driver(path, getDefaultTargetTriple(), diagnostics);
+@@ -249,6 +249,7 @@ bool ExecuteAction(int argc, const char** argv,
+                                           /*CodeGenOpts=*/nullptr);
+
+   Driver driver(path, getDefaultTargetTriple(), *diagnostics);
 +  driver.ResourceDir = "/usr/lib64/clang/$llvm_full_version";
    driver.setTitle("include what you use");
 
diff --git a/.gitlab/ci/docker/fedora39/install_rvm.sh b/.gitlab/ci/docker/fedora40/install_rvm.sh
similarity index 100%
rename from .gitlab/ci/docker/fedora39/install_rvm.sh
rename to .gitlab/ci/docker/fedora40/install_rvm.sh
diff --git a/.gitlab/ci/docker/fedora39/iwyu_packages.lst b/.gitlab/ci/docker/fedora40/iwyu_packages.lst
similarity index 100%
rename from .gitlab/ci/docker/fedora39/iwyu_packages.lst
rename to .gitlab/ci/docker/fedora40/iwyu_packages.lst
diff --git a/.gitlab/ci/docker/fedora39/rvm_packages.lst b/.gitlab/ci/docker/fedora40/rvm_packages.lst
similarity index 100%
rename from .gitlab/ci/docker/fedora39/rvm_packages.lst
rename to .gitlab/ci/docker/fedora40/rvm_packages.lst
diff --git a/.gitlab/ci/docker/gcc_cxx_modules/Dockerfile b/.gitlab/ci/docker/gcc_cxx_modules/Dockerfile
deleted file mode 100644
index d8e8238..0000000
--- a/.gitlab/ci/docker/gcc_cxx_modules/Dockerfile
+++ /dev/null
@@ -1,9 +0,0 @@
-FROM fedora:38
-MAINTAINER Ben Boeckel <ben.boeckel@kitware.com>
-
-# Install build dependencies for packages.
-COPY install_deps.sh /root/install_deps.sh
-RUN sh /root/install_deps.sh
-
-COPY install_gcc.sh /root/install_gcc.sh
-RUN sh /root/install_gcc.sh
diff --git a/.gitlab/ci/docker/gcc_cxx_modules/install_deps.sh b/.gitlab/ci/docker/gcc_cxx_modules/install_deps.sh
deleted file mode 100755
index b8b706b..0000000
--- a/.gitlab/ci/docker/gcc_cxx_modules/install_deps.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-
-set -e
-
-dnf install -y --setopt=install_weak_deps=False \
-    gcc-c++ mpfr-devel libmpc-devel isl-devel flex bison file findutils diffutils git-core
-dnf clean all
diff --git a/.gitlab/ci/docker/gcc_cxx_modules/install_gcc.sh b/.gitlab/ci/docker/gcc_cxx_modules/install_gcc.sh
deleted file mode 100755
index 15cfe39..0000000
--- a/.gitlab/ci/docker/gcc_cxx_modules/install_gcc.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/sh
-
-set -e
-
-readonly revision="29862e21f6d656eca59284c927d0c4c0698eb99c" # master as of 21 Sep 2023
-readonly tarball="git://gcc.gnu.org/git/gcc.git"
-
-readonly workdir="$HOME/gcc"
-readonly srcdir="$workdir/gcc"
-readonly builddir="$workdir/build"
-readonly njobs="$( nproc )"
-
-mkdir -p "$workdir"
-cd "$workdir"
-git clone "$tarball" "$srcdir"
-git -C "$srcdir" checkout "$revision"
-mkdir -p "$builddir"
-cd "$builddir"
-"$srcdir/configure" \
-    --disable-multilib \
-    --enable-languages=c,c++ \
-    --prefix="/opt/gcc-p1689"
-make "-j$njobs"
-make "-j$njobs" install-strip
-rm -rf "$workdir"
diff --git a/.gitlab/ci/env_fedora39_common_clang.sh b/.gitlab/ci/env_fedora39_common_clang.sh
deleted file mode 100644
index 076669b..0000000
--- a/.gitlab/ci/env_fedora39_common_clang.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-export CC=/usr/bin/clang-17
-export CXX=/usr/bin/clang++-17
-export FC=/usr/bin/flang-new
diff --git a/.gitlab/ci/env_fedora39_makefiles_clang.sh b/.gitlab/ci/env_fedora39_makefiles_clang.sh
deleted file mode 100644
index 6200f82..0000000
--- a/.gitlab/ci/env_fedora39_makefiles_clang.sh
+++ /dev/null
@@ -1 +0,0 @@
-. .gitlab/ci/env_fedora39_common_clang.sh
diff --git a/.gitlab/ci/env_fedora39_makefiles_symlinked.cmake b/.gitlab/ci/env_fedora39_makefiles_symlinked.cmake
deleted file mode 100644
index 052e9a7..0000000
--- a/.gitlab/ci/env_fedora39_makefiles_symlinked.cmake
+++ /dev/null
@@ -1 +0,0 @@
-include("${CMAKE_CURRENT_LIST_DIR}/env_fedora39_makefiles.cmake")
diff --git a/.gitlab/ci/env_fedora39_makefiles_symlinked.sh b/.gitlab/ci/env_fedora39_makefiles_symlinked.sh
deleted file mode 100644
index 39ac189..0000000
--- a/.gitlab/ci/env_fedora39_makefiles_symlinked.sh
+++ /dev/null
@@ -1 +0,0 @@
-. .gitlab/ci/env_fedora39_makefiles.sh
diff --git a/.gitlab/ci/env_fedora39_ninja_clang.sh b/.gitlab/ci/env_fedora39_ninja_clang.sh
deleted file mode 100644
index 6200f82..0000000
--- a/.gitlab/ci/env_fedora39_ninja_clang.sh
+++ /dev/null
@@ -1 +0,0 @@
-. .gitlab/ci/env_fedora39_common_clang.sh
diff --git a/.gitlab/ci/env_fedora39_ninja_multi_clang.sh b/.gitlab/ci/env_fedora39_ninja_multi_clang.sh
deleted file mode 100644
index 6200f82..0000000
--- a/.gitlab/ci/env_fedora39_ninja_multi_clang.sh
+++ /dev/null
@@ -1 +0,0 @@
-. .gitlab/ci/env_fedora39_common_clang.sh
diff --git a/.gitlab/ci/env_fedora39_asan.sh b/.gitlab/ci/env_fedora40_asan.sh
similarity index 100%
rename from .gitlab/ci/env_fedora39_asan.sh
rename to .gitlab/ci/env_fedora40_asan.sh
diff --git a/.gitlab/ci/env_fedora39_clang_analyzer.sh b/.gitlab/ci/env_fedora40_clang_analyzer.sh
similarity index 100%
rename from .gitlab/ci/env_fedora39_clang_analyzer.sh
rename to .gitlab/ci/env_fedora40_clang_analyzer.sh
diff --git a/.gitlab/ci/env_fedora40_common_clang.sh b/.gitlab/ci/env_fedora40_common_clang.sh
new file mode 100644
index 0000000..a3861d0
--- /dev/null
+++ b/.gitlab/ci/env_fedora40_common_clang.sh
@@ -0,0 +1,3 @@
+export CC=/usr/bin/clang-18
+export CXX=/usr/bin/clang++-18
+export FC=/usr/bin/flang-new
diff --git a/.gitlab/ci/env_fedora39_extdeps.sh b/.gitlab/ci/env_fedora40_extdeps.sh
similarity index 100%
rename from .gitlab/ci/env_fedora39_extdeps.sh
rename to .gitlab/ci/env_fedora40_extdeps.sh
diff --git a/.gitlab/ci/env_fedora39_makefiles.cmake b/.gitlab/ci/env_fedora40_makefiles.cmake
similarity index 100%
rename from .gitlab/ci/env_fedora39_makefiles.cmake
rename to .gitlab/ci/env_fedora40_makefiles.cmake
diff --git a/.gitlab/ci/env_fedora39_makefiles.sh b/.gitlab/ci/env_fedora40_makefiles.sh
similarity index 100%
rename from .gitlab/ci/env_fedora39_makefiles.sh
rename to .gitlab/ci/env_fedora40_makefiles.sh
diff --git a/.gitlab/ci/env_fedora40_makefiles_clang.sh b/.gitlab/ci/env_fedora40_makefiles_clang.sh
new file mode 100644
index 0000000..2021086
--- /dev/null
+++ b/.gitlab/ci/env_fedora40_makefiles_clang.sh
@@ -0,0 +1 @@
+. .gitlab/ci/env_fedora40_common_clang.sh
diff --git a/.gitlab/ci/env_fedora40_makefiles_symlinked.cmake b/.gitlab/ci/env_fedora40_makefiles_symlinked.cmake
new file mode 100644
index 0000000..d381807
--- /dev/null
+++ b/.gitlab/ci/env_fedora40_makefiles_symlinked.cmake
@@ -0,0 +1 @@
+include("${CMAKE_CURRENT_LIST_DIR}/env_fedora40_makefiles.cmake")
diff --git a/.gitlab/ci/env_fedora40_makefiles_symlinked.sh b/.gitlab/ci/env_fedora40_makefiles_symlinked.sh
new file mode 100644
index 0000000..5a7584a
--- /dev/null
+++ b/.gitlab/ci/env_fedora40_makefiles_symlinked.sh
@@ -0,0 +1 @@
+. .gitlab/ci/env_fedora40_makefiles.sh
diff --git a/.gitlab/ci/env_fedora39_ninja.sh b/.gitlab/ci/env_fedora40_ninja.sh
similarity index 100%
rename from .gitlab/ci/env_fedora39_ninja.sh
rename to .gitlab/ci/env_fedora40_ninja.sh
diff --git a/.gitlab/ci/env_fedora40_ninja_clang.sh b/.gitlab/ci/env_fedora40_ninja_clang.sh
new file mode 100644
index 0000000..2021086
--- /dev/null
+++ b/.gitlab/ci/env_fedora40_ninja_clang.sh
@@ -0,0 +1 @@
+. .gitlab/ci/env_fedora40_common_clang.sh
diff --git a/.gitlab/ci/env_fedora39_ninja_multi.sh b/.gitlab/ci/env_fedora40_ninja_multi.sh
similarity index 100%
rename from .gitlab/ci/env_fedora39_ninja_multi.sh
rename to .gitlab/ci/env_fedora40_ninja_multi.sh
diff --git a/.gitlab/ci/env_fedora40_ninja_multi_clang.sh b/.gitlab/ci/env_fedora40_ninja_multi_clang.sh
new file mode 100644
index 0000000..2021086
--- /dev/null
+++ b/.gitlab/ci/env_fedora40_ninja_multi_clang.sh
@@ -0,0 +1 @@
+. .gitlab/ci/env_fedora40_common_clang.sh
diff --git a/.gitlab/ci/post_build_fedora39_tidy.sh b/.gitlab/ci/post_build_fedora40_tidy.sh
similarity index 100%
rename from .gitlab/ci/post_build_fedora39_tidy.sh
rename to .gitlab/ci/post_build_fedora40_tidy.sh
diff --git a/.gitlab/ci/pre_build_fedora39_tidy.sh b/.gitlab/ci/pre_build_fedora40_tidy.sh
similarity index 100%
rename from .gitlab/ci/pre_build_fedora39_tidy.sh
rename to .gitlab/ci/pre_build_fedora40_tidy.sh
diff --git a/.gitlab/os-linux.yml b/.gitlab/os-linux.yml
index 03778c2..f9fd6c2 100644
--- a/.gitlab/os-linux.yml
+++ b/.gitlab/os-linux.yml
@@ -5,7 +5,7 @@
 ### Release
 
 .linux_prep_source:
-    image: "fedora:39"
+    image: "fedora:40"
 
     variables:
         GIT_CLONE_PATH: "$CI_BUILDS_DIR/cmake ci"
@@ -68,45 +68,53 @@
 
 ### Fedora
 
-.fedora39:
-    image: "kitware/cmake:ci-fedora39-x86_64-2024-04-10"
+.fedora40:
+    image: "kitware/cmake:ci-fedora40-x86_64-2024-04-24"
 
     variables:
         GIT_CLONE_PATH: "$CI_BUILDS_DIR/cmake ci/long file name for testing purposes"
         CMAKE_ARCH: x86_64
 
+# FIXME(#25932): Our HIP tests do not fully work in CI with Fedora 40.
+.fedora39_hip:
+    image: "kitware/cmake:ci-fedora39-hip-x86_64-2024-04-24"
+
+    variables:
+        GIT_CLONE_PATH: "$CI_BUILDS_DIR/cmake ci"
+        CMAKE_ARCH: x86_64
+
 #### Lint builds
 
-.fedora39_tidy:
-    extends: .fedora39
+.fedora40_tidy:
+    extends: .fedora40
 
     variables:
-        CMAKE_CONFIGURATION: fedora39_tidy
+        CMAKE_CONFIGURATION: fedora40_tidy
         CMAKE_CI_NO_INSTALL: 1
 
-.fedora39_clang_analyzer:
-    extends: .fedora39
+.fedora40_clang_analyzer:
+    extends: .fedora40
 
     variables:
-        CMAKE_CONFIGURATION: fedora39_clang_analyzer
+        CMAKE_CONFIGURATION: fedora40_clang_analyzer
         CMAKE_CI_BUILD_TYPE: Debug
         CTEST_NO_WARNINGS_ALLOWED: 1
         CMAKE_CI_NO_INSTALL: 1
 
-.fedora39_sphinx:
-    extends: .fedora39
+.fedora40_sphinx:
+    extends: .fedora40
 
     variables:
-        CMAKE_CONFIGURATION: fedora39_sphinx
+        CMAKE_CONFIGURATION: fedora40_sphinx
         CTEST_NO_WARNINGS_ALLOWED: 1
         CTEST_SOURCE_SUBDIRECTORY: "Utilities/Sphinx"
         CMAKE_CI_NO_INSTALL: 1
 
-.fedora39_sphinx_package:
-    extends: .fedora39
+.fedora40_sphinx_package:
+    extends: .fedora40
 
     variables:
-        CMAKE_CONFIGURATION: fedora39_sphinx_package
+        CMAKE_CONFIGURATION: fedora40_sphinx_package
         CTEST_SOURCE_SUBDIRECTORY: "Utilities/Sphinx"
 
 #### Build and test
@@ -162,43 +170,43 @@
         CMAKE_CI_BUILD_TYPE: Release
         CTEST_NO_WARNINGS_ALLOWED: 1
 
-.fedora39_extdeps:
-    extends: .fedora39
+.fedora40_extdeps:
+    extends: .fedora40
 
     variables:
-        CMAKE_CONFIGURATION: fedora39_extdeps
+        CMAKE_CONFIGURATION: fedora40_extdeps
         CMAKE_CI_BUILD_TYPE: Release
         CTEST_NO_WARNINGS_ALLOWED: 1
 
-.fedora39_ninja:
-    extends: .fedora39
+.fedora40_ninja:
+    extends: .fedora40
 
     variables:
-        CMAKE_CONFIGURATION: fedora39_ninja
+        CMAKE_CONFIGURATION: fedora40_ninja
         CMAKE_CI_BUILD_TYPE: Release
         CTEST_NO_WARNINGS_ALLOWED: 1
 
-.fedora39_ninja_multi:
-    extends: .fedora39
+.fedora40_ninja_multi:
+    extends: .fedora40
 
     variables:
-        CMAKE_CONFIGURATION: fedora39_ninja_multi
+        CMAKE_CONFIGURATION: fedora40_ninja_multi
         CTEST_NO_WARNINGS_ALLOWED: 1
         CMAKE_GENERATOR: "Ninja Multi-Config"
 
-.fedora39_makefiles:
-    extends: .fedora39
+.fedora40_makefiles:
+    extends: .fedora40
 
     variables:
-        CMAKE_CONFIGURATION: fedora39_makefiles
+        CMAKE_CONFIGURATION: fedora40_makefiles
         CTEST_NO_WARNINGS_ALLOWED: 1
         CMAKE_GENERATOR: "Unix Makefiles"
 
-.fedora39_makefiles_symlinked:
-    extends: .fedora39
+.fedora40_makefiles_symlinked:
+    extends: .fedora40
 
     variables:
-        CMAKE_CONFIGURATION: fedora39_makefiles_symlinked
+        CMAKE_CONFIGURATION: fedora40_makefiles_symlinked
         CTEST_NO_WARNINGS_ALLOWED: 1
         CMAKE_GENERATOR: "Unix Makefiles"
         CMAKE_CI_IN_SYMLINK_TREE: 1
@@ -219,24 +227,24 @@
     variables:
         CMAKE_CONFIGURATION: debian12_ninja_clang
 
-.fedora39_makefiles_clang:
-    extends: .fedora39
+.fedora40_makefiles_clang:
+    extends: .fedora40
 
     variables:
-        CMAKE_CONFIGURATION: fedora39_makefiles_clang
+        CMAKE_CONFIGURATION: fedora40_makefiles_clang
         CMAKE_GENERATOR: "Unix Makefiles"
 
-.fedora39_ninja_clang:
-    extends: .fedora39
+.fedora40_ninja_clang:
+    extends: .fedora40
 
     variables:
-        CMAKE_CONFIGURATION: fedora39_ninja_clang
+        CMAKE_CONFIGURATION: fedora40_ninja_clang
 
-.fedora39_ninja_multi_clang:
-    extends: .fedora39
+.fedora40_ninja_multi_clang:
+    extends: .fedora40
 
     variables:
-        CMAKE_CONFIGURATION: fedora39_ninja_multi_clang
+        CMAKE_CONFIGURATION: fedora40_ninja_multi_clang
         CMAKE_GENERATOR: "Ninja Multi-Config"
 
 ### Sanitizers
@@ -252,13 +260,13 @@
         CTEST_MEMORYCHECK_TYPE: AddressSanitizer
         CTEST_MEMORYCHECK_SANITIZER_OPTIONS: ""
 
-.fedora39_asan:
+.fedora40_asan:
     extends:
-        - .fedora39
+        - .fedora40
         - .fedora_asan_addon
 
     variables:
-        CMAKE_CONFIGURATION: fedora39_asan
+        CMAKE_CONFIGURATION: fedora40_asan
 
 ### Intel Compiler
 
@@ -410,7 +418,7 @@
         CTEST_LABELS: "HIP"
 
 .fedora39_hip_radeon:
-    extends: .fedora39
+    extends: .fedora39_hip
 
     variables:
         CMAKE_CONFIGURATION: fedora39_hip_radeon
@@ -423,30 +431,6 @@
         CMAKE_CONFIGURATION: hip5.5_nvidia
         CTEST_LABELS: "HIP"
 
-### C++ modules
-
-.gcc_cxx_modules_x86_64:
-    image: "kitware/cmake:ci-gcc_cxx_modules-x86_64-2023-09-21"
-
-    variables:
-        GIT_CLONE_PATH: "$CI_BUILDS_DIR/cmake ci"
-        CMAKE_ARCH: x86_64
-        CC: "/opt/gcc-p1689/bin/gcc"
-        CXX: "/opt/gcc-p1689/bin/g++"
-
-.gcc_cxx_modules_ninja:
-    extends: .gcc_cxx_modules_x86_64
-
-    variables:
-        CMAKE_CONFIGURATION: linux_gcc_cxx_modules_ninja
-
-.gcc_cxx_modules_ninja_multi:
-    extends: .gcc_cxx_modules_x86_64
-
-    variables:
-        CMAKE_CONFIGURATION: linux_gcc_cxx_modules_ninja_multi
-        CMAKE_GENERATOR: "Ninja Multi-Config"
-
 ### Debian 10 legacy packages
 
 .debian10:
@@ -539,7 +523,7 @@
 
 .cmake_codespell_linux:
     stage: build
-    extends: .fedora39
+    extends: .fedora40
     script:
         - .gitlab/ci/codespell.sh
     interruptible: true
@@ -682,7 +666,7 @@
 .cmake_org_help:
     stage: build
     extends:
-        - .fedora39
+        - .fedora40
         - .linux_x86_64_tags
         - .cmake_org_help_artifacts
     script:
diff --git a/.gitlab/upload.yml b/.gitlab/upload.yml
index 56793af..6b46313 100644
--- a/.gitlab/upload.yml
+++ b/.gitlab/upload.yml
@@ -1,7 +1,7 @@
 # Steps for uploading artifacts
 
 .rsync_upload_package:
-    image: "fedora:39"
+    image: "fedora:40"
     stage: upload
     tags:
         - cmake
@@ -21,7 +21,7 @@
 
 .rsync_upload_help:
     stage: upload
-    image: "fedora:39"
+    image: "fedora:40"
     tags:
         - cmake
         - docker
diff --git a/CTestCustom.cmake.in b/CTestCustom.cmake.in
index a81ee4b..ae55715 100644
--- a/CTestCustom.cmake.in
+++ b/CTestCustom.cmake.in
@@ -17,6 +17,7 @@
   "not sorted slower link editing will result"
   "stl_deque.h:479"
   "Utilities.cmzlib."
+  "Utilities.cmzstd."
   "Utilities.cmbzip2."
   "Source.CTest.Curl"
   "Source.CursesDialog.form"
diff --git a/Help/command/file.rst b/Help/command/file.rst
index ee7d05d..ef49faa 100644
--- a/Help/command/file.rst
+++ b/Help/command/file.rst
@@ -28,7 +28,6 @@
     file(`STRINGS`_ <filename> <out-var> [...])
     file(`\<HASH\>`_ <filename> <out-var>)
     file(`TIMESTAMP`_ <filename> <out-var> [...])
-    file(`GET_RUNTIME_DEPENDENCIES`_ [...])
 
   `Writing`_
     file({`WRITE`_ | `APPEND`_} <filename> <content>...)
@@ -65,6 +64,10 @@
     file(`ARCHIVE_CREATE`_ OUTPUT <archive> PATHS <paths>... [...])
     file(`ARCHIVE_EXTRACT`_ INPUT <archive> [...])
 
+  `Handling Runtime Binaries`_
+    file(`GET_RUNTIME_DEPENDENCIES`_ [...])
+
+
 Reading
 ^^^^^^^
 
@@ -157,323 +160,6 @@
   See the :command:`string(TIMESTAMP)` command for documentation of
   the ``<format>`` and ``UTC`` options.
 
-.. signature::
-  file(GET_RUNTIME_DEPENDENCIES [...])
-
-  .. versionadded:: 3.16
-
-  Recursively get the list of libraries depended on by the given files:
-
-  .. code-block:: cmake
-
-    file(GET_RUNTIME_DEPENDENCIES
-      [RESOLVED_DEPENDENCIES_VAR <deps_var>]
-      [UNRESOLVED_DEPENDENCIES_VAR <unresolved_deps_var>]
-      [CONFLICTING_DEPENDENCIES_PREFIX <conflicting_deps_prefix>]
-      [EXECUTABLES <executable_files>...]
-      [LIBRARIES <library_files>...]
-      [MODULES <module_files>...]
-      [DIRECTORIES <directories>...]
-      [BUNDLE_EXECUTABLE <bundle_executable_file>]
-      [PRE_INCLUDE_REGEXES <regexes>...]
-      [PRE_EXCLUDE_REGEXES <regexes>...]
-      [POST_INCLUDE_REGEXES <regexes>...]
-      [POST_EXCLUDE_REGEXES <regexes>...]
-      [POST_INCLUDE_FILES <files>...]
-      [POST_EXCLUDE_FILES <files>...]
-      )
-
-  Please note that this sub-command is not intended to be used in project mode.
-  It is intended for use at install time, either from code generated by the
-  :command:`install(RUNTIME_DEPENDENCY_SET)` command, or from code provided by
-  the project via :command:`install(CODE)` or :command:`install(SCRIPT)`.
-  For example:
-
-  .. code-block:: cmake
-
-    install(CODE [[
-      file(GET_RUNTIME_DEPENDENCIES
-        # ...
-        )
-      ]])
-
-  The arguments are as follows:
-
-    ``RESOLVED_DEPENDENCIES_VAR <deps_var>``
-      Name of the variable in which to store the list of resolved dependencies.
-
-    ``UNRESOLVED_DEPENDENCIES_VAR <unresolved_deps_var>``
-      Name of the variable in which to store the list of unresolved
-      dependencies. If this variable is not specified, and there are any
-      unresolved dependencies, an error is issued.
-
-    ``CONFLICTING_DEPENDENCIES_PREFIX <conflicting_deps_prefix>``
-      Variable prefix in which to store conflicting dependency information.
-      Dependencies are conflicting if two files with the same name are found in
-      two different directories. The list of filenames that conflict are stored
-      in ``<conflicting_deps_prefix>_FILENAMES``. For each filename, the list
-      of paths that were found for that filename are stored in
-      ``<conflicting_deps_prefix>_<filename>``.
-
-    ``EXECUTABLES <executable_files>...``
-      List of executable files to read for dependencies. These are executables
-      that are typically created with :command:`add_executable`, but they do
-      not have to be created by CMake. On Apple platforms, the paths to these
-      files determine the value of ``@executable_path`` when recursively
-      resolving the libraries. Specifying any kind of library (``STATIC``,
-      ``MODULE``, or ``SHARED``) here will result in undefined behavior.
-
-    ``LIBRARIES <library_files>...``
-      List of library files to read for dependencies. These are libraries that
-      are typically created with :command:`add_library(SHARED)`, but they do
-      not have to be created by CMake. Specifying ``STATIC`` libraries,
-      ``MODULE`` libraries, or executables here will result in undefined
-      behavior.
-
-    ``MODULES <module_files>...``
-      List of loadable module files to read for dependencies. These are modules
-      that are typically created with :command:`add_library(MODULE)`, but they
-      do not have to be created by CMake. They are typically used by calling
-      ``dlopen()`` at runtime rather than linked at link time with ``ld -l``.
-      Specifying ``STATIC`` libraries, ``SHARED`` libraries, or executables
-      here will result in undefined behavior.
-
-    ``DIRECTORIES <directories>...``
-      List of additional directories to search for dependencies. On Linux
-      platforms, these directories are searched if the dependency is not found
-      in any of the other usual paths. If it is found in such a directory, a
-      warning is issued, because it means that the file is incomplete (it does
-      not list all of the directories that contain its dependencies).
-      On Windows platforms, these directories are searched if the dependency
-      is not found in any of the other search paths, but no warning is issued,
-      because searching other paths is a normal part of Windows dependency
-      resolution. On Apple platforms, this argument has no effect.
-
-    ``BUNDLE_EXECUTABLE <bundle_executable_file>``
-      Executable to treat as the "bundle executable" when resolving libraries.
-      On Apple platforms, this argument determines the value of
-      ``@executable_path`` when recursively resolving libraries for
-      ``LIBRARIES`` and ``MODULES`` files. It has no effect on ``EXECUTABLES``
-      files. On other platforms, it has no effect. This is typically (but not
-      always) one of the executables in the ``EXECUTABLES`` argument which
-      designates the "main" executable of the package.
-
-  The following arguments specify filters for including or excluding libraries
-  to be resolved. See below for a full description of how they work.
-
-    ``PRE_INCLUDE_REGEXES <regexes>...``
-      List of pre-include regexes through which to filter the names of
-      not-yet-resolved dependencies.
-
-    ``PRE_EXCLUDE_REGEXES <regexes>...``
-      List of pre-exclude regexes through which to filter the names of
-      not-yet-resolved dependencies.
-
-    ``POST_INCLUDE_REGEXES <regexes>...``
-      List of post-include regexes through which to filter the names of
-      resolved dependencies.
-
-    ``POST_EXCLUDE_REGEXES <regexes>...``
-      List of post-exclude regexes through which to filter the names of
-      resolved dependencies.
-
-    ``POST_INCLUDE_FILES <files>...``
-      .. versionadded:: 3.21
-
-      List of post-include filenames through which to filter the names of
-      resolved dependencies. Symlinks are resolved when attempting to match
-      these filenames.
-
-    ``POST_EXCLUDE_FILES <files>...``
-      .. versionadded:: 3.21
-
-      List of post-exclude filenames through which to filter the names of
-      resolved dependencies. Symlinks are resolved when attempting to match
-      these filenames.
-
-  These arguments can be used to exclude unwanted system libraries when
-  resolving the dependencies, or to include libraries from a specific
-  directory. The filtering works as follows:
-
-  1. If the not-yet-resolved dependency matches any of the
-     ``PRE_INCLUDE_REGEXES``, steps 2 and 3 are skipped, and the dependency
-     resolution proceeds to step 4.
-
-  2. If the not-yet-resolved dependency matches any of the
-     ``PRE_EXCLUDE_REGEXES``, dependency resolution stops for that dependency.
-
-  3. Otherwise, dependency resolution proceeds.
-
-  4. ``file(GET_RUNTIME_DEPENDENCIES)`` searches for the dependency according
-     to the linking rules of the platform (see below).
-
-  5. If the dependency is found, and its full path matches one of the
-     ``POST_INCLUDE_REGEXES`` or ``POST_INCLUDE_FILES``, the full path is added
-     to the resolved dependencies, and ``file(GET_RUNTIME_DEPENDENCIES)``
-     recursively resolves that library's own dependencies. Otherwise, resolution
-     proceeds to step 6.
-
-  6. If the dependency is found, but its full path matches one of the
-     ``POST_EXCLUDE_REGEXES`` or ``POST_EXCLUDE_FILES``, it is not added to the
-     resolved dependencies, and dependency resolution stops for that dependency.
-
-  7. If the dependency is found, and its full path does not match either
-     ``POST_INCLUDE_REGEXES``, ``POST_INCLUDE_FILES``, ``POST_EXCLUDE_REGEXES``,
-     or ``POST_EXCLUDE_FILES``, the full path is added to the resolved
-     dependencies, and ``file(GET_RUNTIME_DEPENDENCIES)``  recursively resolves
-     that library's own dependencies.
-
-  Different platforms have different rules for how dependencies are resolved.
-  These specifics are described here.
-
-  On Linux platforms, library resolution works as follows:
-
-  1. If the depending file does not have any ``RUNPATH`` entries, and the
-     library exists in one of the depending file's ``RPATH`` entries, or its
-     parents', in that order, the dependency is resolved to that file.
-  2. Otherwise, if the depending file has any ``RUNPATH`` entries, and the
-     library exists in one of those entries, the dependency is resolved to that
-     file.
-  3. Otherwise, if the library exists in one of the directories listed by
-     ``ldconfig``, the dependency is resolved to that file.
-  4. Otherwise, if the library exists in one of the ``DIRECTORIES`` entries,
-     the dependency is resolved to that file. In this case, a warning is
-     issued, because finding a file in one of the ``DIRECTORIES`` means that
-     the depending file is not complete (it does not list all the directories
-     from which it pulls dependencies).
-
-  5. Otherwise, the dependency is unresolved.
-
-  On Windows platforms, library resolution works as follows:
-
-  1. DLL dependency names are converted to lowercase for matching filters.
-     Windows DLL names are case-insensitive, and some linkers mangle the
-     case of the DLL dependency names.  However, this makes it more difficult
-     for ``PRE_INCLUDE_REGEXES``, ``PRE_EXCLUDE_REGEXES``,
-     ``POST_INCLUDE_REGEXES``, and ``POST_EXCLUDE_REGEXES`` to properly
-     filter DLL names - every regex would have to check for both uppercase
-     and lowercase letters.  For example:
-
-     .. code-block:: cmake
-
-       file(GET_RUNTIME_DEPENDENCIES
-         # ...
-         PRE_INCLUDE_REGEXES "^[Mm][Yy][Ll][Ii][Bb][Rr][Aa][Rr][Yy]\\.[Dd][Ll][Ll]$"
-         )
-
-     Converting the DLL name to lowercase allows the regexes to only match
-     lowercase names, thus simplifying the regex. For example:
-
-     .. code-block:: cmake
-
-       file(GET_RUNTIME_DEPENDENCIES
-         # ...
-         PRE_INCLUDE_REGEXES "^mylibrary\\.dll$"
-         )
-
-     This regex will match ``mylibrary.dll`` regardless of how it is cased,
-     either on disk or in the depending file. (For example, it will match
-     ``mylibrary.dll``, ``MyLibrary.dll``, and ``MYLIBRARY.DLL``.)
-
-     .. versionchanged:: 3.27
-
-       The conversion to lowercase only applies while matching filters.
-       Results reported after filtering case-preserve each DLL name as it is
-       found on disk, if resolved, and otherwise as it is referenced by the
-       dependent binary.
-
-       Prior to CMake 3.27, the results were reported with lowercase DLL
-       file names, but the directory portion retained its casing.
-
-  2. (**Not yet implemented**) If the depending file is a Windows Store app,
-     and the dependency is listed as a dependency in the application's package
-     manifest, the dependency is resolved to that file.
-
-  3. Otherwise, if the library exists in the same directory as the depending
-     file, the dependency is resolved to that file.
-
-  4. Otherwise, if the library exists in either the operating system's
-     ``system32`` directory or the ``Windows`` directory, in that order, the
-     dependency is resolved to that file.
-
-  5. Otherwise, if the library exists in one of the directories specified by
-     ``DIRECTORIES``, in the order they are listed, the dependency is resolved
-     to that file. In this case, a warning is not issued, because searching
-     other directories is a normal part of Windows library resolution.
-
-  6. Otherwise, the dependency is unresolved.
-
-  On Apple platforms, library resolution works as follows:
-
-  1. If the dependency starts with ``@executable_path/``, and an
-     ``EXECUTABLES`` argument is in the process of being resolved, and
-     replacing ``@executable_path/`` with the directory of the executable
-     yields an existing file, the dependency is resolved to that file.
-
-  2. Otherwise, if the dependency starts with ``@executable_path/``, and there
-     is a ``BUNDLE_EXECUTABLE`` argument, and replacing ``@executable_path/``
-     with the directory of the bundle executable yields an existing file, the
-     dependency is resolved to that file.
-
-  3. Otherwise, if the dependency starts with ``@loader_path/``, and replacing
-     ``@loader_path/`` with the directory of the depending file yields an
-     existing file, the dependency is resolved to that file.
-
-  4. Otherwise, if the dependency starts with ``@rpath/``, and replacing
-     ``@rpath/`` with one of the ``RPATH`` entries of the depending file
-     yields an existing file, the dependency is resolved to that file.
-     Note that ``RPATH`` entries that start with ``@executable_path/`` or
-     ``@loader_path/`` also have these items replaced with the appropriate
-     path.
-
-  5. Otherwise, if the dependency is an absolute file that exists,
-     the dependency is resolved to that file.
-
-  6. Otherwise, the dependency is unresolved.
-
-  This function accepts several variables that determine which tool is used for
-  dependency resolution:
-
-  .. variable:: CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM
-
-    Determines which operating system and executable format the files are built
-    for. This could be one of several values:
-
-    * ``linux+elf``
-    * ``windows+pe``
-    * ``macos+macho``
-
-    If this variable is not specified, it is determined automatically by system
-    introspection.
-
-  .. variable:: CMAKE_GET_RUNTIME_DEPENDENCIES_TOOL
-
-    Determines the tool to use for dependency resolution. It could be one of
-    several values, depending on the value of
-    :variable:`CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM`:
-
-    ================================================= =============================================
-       ``CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM``       ``CMAKE_GET_RUNTIME_DEPENDENCIES_TOOL``
-    ================================================= =============================================
-    ``linux+elf``                                     ``objdump``
-    ``windows+pe``                                    ``objdump`` or ``dumpbin``
-    ``macos+macho``                                   ``otool``
-    ================================================= =============================================
-
-    If this variable is not specified, it is determined automatically by system
-    introspection.
-
-  .. variable:: CMAKE_GET_RUNTIME_DEPENDENCIES_COMMAND
-
-    Determines the path to the tool to use for dependency resolution. This is
-    the actual path to ``objdump``, ``dumpbin``, or ``otool``.
-
-    If this variable is not specified, it is determined by the value of
-    ``CMAKE_OBJDUMP`` if set, else by system introspection.
-
-    .. versionadded:: 3.18
-      Use ``CMAKE_OBJDUMP`` if set.
-
 Writing
 ^^^^^^^
 
@@ -1275,3 +961,323 @@
     timestamp instead of extracting file timestamps from the archive.
 
   With ``VERBOSE``, the command will produce verbose output.
+
+Handling Runtime Binaries
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. signature::
+  file(GET_RUNTIME_DEPENDENCIES [...])
+
+  .. versionadded:: 3.16
+
+  Recursively get the list of libraries depended on by the given files:
+
+  .. code-block:: cmake
+
+    file(GET_RUNTIME_DEPENDENCIES
+      [RESOLVED_DEPENDENCIES_VAR <deps_var>]
+      [UNRESOLVED_DEPENDENCIES_VAR <unresolved_deps_var>]
+      [CONFLICTING_DEPENDENCIES_PREFIX <conflicting_deps_prefix>]
+      [EXECUTABLES <executable_files>...]
+      [LIBRARIES <library_files>...]
+      [MODULES <module_files>...]
+      [DIRECTORIES <directories>...]
+      [BUNDLE_EXECUTABLE <bundle_executable_file>]
+      [PRE_INCLUDE_REGEXES <regexes>...]
+      [PRE_EXCLUDE_REGEXES <regexes>...]
+      [POST_INCLUDE_REGEXES <regexes>...]
+      [POST_EXCLUDE_REGEXES <regexes>...]
+      [POST_INCLUDE_FILES <files>...]
+      [POST_EXCLUDE_FILES <files>...]
+      )
+
+  Please note that this sub-command is not intended to be used in project mode.
+  It is intended for use at install time, either from code generated by the
+  :command:`install(RUNTIME_DEPENDENCY_SET)` command, or from code provided by
+  the project via :command:`install(CODE)` or :command:`install(SCRIPT)`.
+  For example:
+
+  .. code-block:: cmake
+
+    install(CODE [[
+      file(GET_RUNTIME_DEPENDENCIES
+        # ...
+        )
+      ]])
+
+  The arguments are as follows:
+
+    ``RESOLVED_DEPENDENCIES_VAR <deps_var>``
+      Name of the variable in which to store the list of resolved dependencies.
+
+    ``UNRESOLVED_DEPENDENCIES_VAR <unresolved_deps_var>``
+      Name of the variable in which to store the list of unresolved
+      dependencies. If this variable is not specified, and there are any
+      unresolved dependencies, an error is issued.
+
+    ``CONFLICTING_DEPENDENCIES_PREFIX <conflicting_deps_prefix>``
+      Variable prefix in which to store conflicting dependency information.
+      Dependencies are conflicting if two files with the same name are found in
+      two different directories. The list of filenames that conflict are stored
+      in ``<conflicting_deps_prefix>_FILENAMES``. For each filename, the list
+      of paths that were found for that filename are stored in
+      ``<conflicting_deps_prefix>_<filename>``.
+
+    ``EXECUTABLES <executable_files>...``
+      List of executable files to read for dependencies. These are executables
+      that are typically created with :command:`add_executable`, but they do
+      not have to be created by CMake. On Apple platforms, the paths to these
+      files determine the value of ``@executable_path`` when recursively
+      resolving the libraries. Specifying any kind of library (``STATIC``,
+      ``MODULE``, or ``SHARED``) here will result in undefined behavior.
+
+    ``LIBRARIES <library_files>...``
+      List of library files to read for dependencies. These are libraries that
+      are typically created with :command:`add_library(SHARED)`, but they do
+      not have to be created by CMake. Specifying ``STATIC`` libraries,
+      ``MODULE`` libraries, or executables here will result in undefined
+      behavior.
+
+    ``MODULES <module_files>...``
+      List of loadable module files to read for dependencies. These are modules
+      that are typically created with :command:`add_library(MODULE)`, but they
+      do not have to be created by CMake. They are typically used by calling
+      ``dlopen()`` at runtime rather than linked at link time with ``ld -l``.
+      Specifying ``STATIC`` libraries, ``SHARED`` libraries, or executables
+      here will result in undefined behavior.
+
+    ``DIRECTORIES <directories>...``
+      List of additional directories to search for dependencies. On Linux
+      platforms, these directories are searched if the dependency is not found
+      in any of the other usual paths. If it is found in such a directory, a
+      warning is issued, because it means that the file is incomplete (it does
+      not list all of the directories that contain its dependencies).
+      On Windows platforms, these directories are searched if the dependency
+      is not found in any of the other search paths, but no warning is issued,
+      because searching other paths is a normal part of Windows dependency
+      resolution. On Apple platforms, this argument has no effect.
+
+    ``BUNDLE_EXECUTABLE <bundle_executable_file>``
+      Executable to treat as the "bundle executable" when resolving libraries.
+      On Apple platforms, this argument determines the value of
+      ``@executable_path`` when recursively resolving libraries for
+      ``LIBRARIES`` and ``MODULES`` files. It has no effect on ``EXECUTABLES``
+      files. On other platforms, it has no effect. This is typically (but not
+      always) one of the executables in the ``EXECUTABLES`` argument which
+      designates the "main" executable of the package.
+
+  The following arguments specify filters for including or excluding libraries
+  to be resolved. See below for a full description of how they work.
+
+    ``PRE_INCLUDE_REGEXES <regexes>...``
+      List of pre-include regexes through which to filter the names of
+      not-yet-resolved dependencies.
+
+    ``PRE_EXCLUDE_REGEXES <regexes>...``
+      List of pre-exclude regexes through which to filter the names of
+      not-yet-resolved dependencies.
+
+    ``POST_INCLUDE_REGEXES <regexes>...``
+      List of post-include regexes through which to filter the names of
+      resolved dependencies.
+
+    ``POST_EXCLUDE_REGEXES <regexes>...``
+      List of post-exclude regexes through which to filter the names of
+      resolved dependencies.
+
+    ``POST_INCLUDE_FILES <files>...``
+      .. versionadded:: 3.21
+
+      List of post-include filenames through which to filter the names of
+      resolved dependencies. Symlinks are resolved when attempting to match
+      these filenames.
+
+    ``POST_EXCLUDE_FILES <files>...``
+      .. versionadded:: 3.21
+
+      List of post-exclude filenames through which to filter the names of
+      resolved dependencies. Symlinks are resolved when attempting to match
+      these filenames.
+
+  These arguments can be used to exclude unwanted system libraries when
+  resolving the dependencies, or to include libraries from a specific
+  directory. The filtering works as follows:
+
+  1. If the not-yet-resolved dependency matches any of the
+     ``PRE_INCLUDE_REGEXES``, steps 2 and 3 are skipped, and the dependency
+     resolution proceeds to step 4.
+
+  2. If the not-yet-resolved dependency matches any of the
+     ``PRE_EXCLUDE_REGEXES``, dependency resolution stops for that dependency.
+
+  3. Otherwise, dependency resolution proceeds.
+
+  4. ``file(GET_RUNTIME_DEPENDENCIES)`` searches for the dependency according
+     to the linking rules of the platform (see below).
+
+  5. If the dependency is found, and its full path matches one of the
+     ``POST_INCLUDE_REGEXES`` or ``POST_INCLUDE_FILES``, the full path is added
+     to the resolved dependencies, and ``file(GET_RUNTIME_DEPENDENCIES)``
+     recursively resolves that library's own dependencies. Otherwise, resolution
+     proceeds to step 6.
+
+  6. If the dependency is found, but its full path matches one of the
+     ``POST_EXCLUDE_REGEXES`` or ``POST_EXCLUDE_FILES``, it is not added to the
+     resolved dependencies, and dependency resolution stops for that dependency.
+
+  7. If the dependency is found, and its full path does not match either
+     ``POST_INCLUDE_REGEXES``, ``POST_INCLUDE_FILES``, ``POST_EXCLUDE_REGEXES``,
+     or ``POST_EXCLUDE_FILES``, the full path is added to the resolved
+     dependencies, and ``file(GET_RUNTIME_DEPENDENCIES)``  recursively resolves
+     that library's own dependencies.
+
+  Different platforms have different rules for how dependencies are resolved.
+  These specifics are described here.
+
+  On Linux platforms, library resolution works as follows:
+
+  1. If the depending file does not have any ``RUNPATH`` entries, and the
+     library exists in one of the depending file's ``RPATH`` entries, or its
+     parents', in that order, the dependency is resolved to that file.
+  2. Otherwise, if the depending file has any ``RUNPATH`` entries, and the
+     library exists in one of those entries, the dependency is resolved to that
+     file.
+  3. Otherwise, if the library exists in one of the directories listed by
+     ``ldconfig``, the dependency is resolved to that file.
+  4. Otherwise, if the library exists in one of the ``DIRECTORIES`` entries,
+     the dependency is resolved to that file. In this case, a warning is
+     issued, because finding a file in one of the ``DIRECTORIES`` means that
+     the depending file is not complete (it does not list all the directories
+     from which it pulls dependencies).
+
+  5. Otherwise, the dependency is unresolved.
+
+  On Windows platforms, library resolution works as follows:
+
+  1. DLL dependency names are converted to lowercase for matching filters.
+     Windows DLL names are case-insensitive, and some linkers mangle the
+     case of the DLL dependency names.  However, this makes it more difficult
+     for ``PRE_INCLUDE_REGEXES``, ``PRE_EXCLUDE_REGEXES``,
+     ``POST_INCLUDE_REGEXES``, and ``POST_EXCLUDE_REGEXES`` to properly
+     filter DLL names - every regex would have to check for both uppercase
+     and lowercase letters.  For example:
+
+     .. code-block:: cmake
+
+       file(GET_RUNTIME_DEPENDENCIES
+         # ...
+         PRE_INCLUDE_REGEXES "^[Mm][Yy][Ll][Ii][Bb][Rr][Aa][Rr][Yy]\\.[Dd][Ll][Ll]$"
+         )
+
+     Converting the DLL name to lowercase allows the regexes to only match
+     lowercase names, thus simplifying the regex. For example:
+
+     .. code-block:: cmake
+
+       file(GET_RUNTIME_DEPENDENCIES
+         # ...
+         PRE_INCLUDE_REGEXES "^mylibrary\\.dll$"
+         )
+
+     This regex will match ``mylibrary.dll`` regardless of how it is cased,
+     either on disk or in the depending file. (For example, it will match
+     ``mylibrary.dll``, ``MyLibrary.dll``, and ``MYLIBRARY.DLL``.)
+
+     .. versionchanged:: 3.27
+
+       The conversion to lowercase only applies while matching filters.
+       Results reported after filtering case-preserve each DLL name as it is
+       found on disk, if resolved, and otherwise as it is referenced by the
+       dependent binary.
+
+       Prior to CMake 3.27, the results were reported with lowercase DLL
+       file names, but the directory portion retained its casing.
+
+  2. (**Not yet implemented**) If the depending file is a Windows Store app,
+     and the dependency is listed as a dependency in the application's package
+     manifest, the dependency is resolved to that file.
+
+  3. Otherwise, if the library exists in the same directory as the depending
+     file, the dependency is resolved to that file.
+
+  4. Otherwise, if the library exists in either the operating system's
+     ``system32`` directory or the ``Windows`` directory, in that order, the
+     dependency is resolved to that file.
+
+  5. Otherwise, if the library exists in one of the directories specified by
+     ``DIRECTORIES``, in the order they are listed, the dependency is resolved
+     to that file. In this case, a warning is not issued, because searching
+     other directories is a normal part of Windows library resolution.
+
+  6. Otherwise, the dependency is unresolved.
+
+  On Apple platforms, library resolution works as follows:
+
+  1. If the dependency starts with ``@executable_path/``, and an
+     ``EXECUTABLES`` argument is in the process of being resolved, and
+     replacing ``@executable_path/`` with the directory of the executable
+     yields an existing file, the dependency is resolved to that file.
+
+  2. Otherwise, if the dependency starts with ``@executable_path/``, and there
+     is a ``BUNDLE_EXECUTABLE`` argument, and replacing ``@executable_path/``
+     with the directory of the bundle executable yields an existing file, the
+     dependency is resolved to that file.
+
+  3. Otherwise, if the dependency starts with ``@loader_path/``, and replacing
+     ``@loader_path/`` with the directory of the depending file yields an
+     existing file, the dependency is resolved to that file.
+
+  4. Otherwise, if the dependency starts with ``@rpath/``, and replacing
+     ``@rpath/`` with one of the ``RPATH`` entries of the depending file
+     yields an existing file, the dependency is resolved to that file.
+     Note that ``RPATH`` entries that start with ``@executable_path/`` or
+     ``@loader_path/`` also have these items replaced with the appropriate
+     path.
+
+  5. Otherwise, if the dependency is an absolute file that exists,
+     the dependency is resolved to that file.
+
+  6. Otherwise, the dependency is unresolved.
+
+  This function accepts several variables that determine which tool is used for
+  dependency resolution:
+
+  .. variable:: CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM
+
+    Determines which operating system and executable format the files are built
+    for. This could be one of several values:
+
+    * ``linux+elf``
+    * ``windows+pe``
+    * ``macos+macho``
+
+    If this variable is not specified, it is determined automatically by system
+    introspection.
+
+  .. variable:: CMAKE_GET_RUNTIME_DEPENDENCIES_TOOL
+
+    Determines the tool to use for dependency resolution. It could be one of
+    several values, depending on the value of
+    :variable:`CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM`:
+
+    ================================================= =============================================
+       ``CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM``       ``CMAKE_GET_RUNTIME_DEPENDENCIES_TOOL``
+    ================================================= =============================================
+    ``linux+elf``                                     ``objdump``
+    ``windows+pe``                                    ``objdump`` or ``dumpbin``
+    ``macos+macho``                                   ``otool``
+    ================================================= =============================================
+
+    If this variable is not specified, it is determined automatically by system
+    introspection.
+
+  .. variable:: CMAKE_GET_RUNTIME_DEPENDENCIES_COMMAND
+
+    Determines the path to the tool to use for dependency resolution. This is
+    the actual path to ``objdump``, ``dumpbin``, or ``otool``.
+
+    If this variable is not specified, it is determined by the value of
+    ``CMAKE_OBJDUMP`` if set, else by system introspection.
+
+    .. versionadded:: 3.18
+      Use ``CMAKE_OBJDUMP`` if set.
diff --git a/Modules/Compiler/GNU.cmake b/Modules/Compiler/GNU.cmake
index 1113e9a..857399c 100644
--- a/Modules/Compiler/GNU.cmake
+++ b/Modules/Compiler/GNU.cmake
@@ -151,7 +151,7 @@
       list(APPEND __lto_flags -flto)
     endif()
 
-    if(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.7)
+    if(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.7 AND NOT APPLE)
       # '-ffat-lto-objects' introduced since GCC 4.7:
       # * https://gcc.gnu.org/onlinedocs/gcc-4.6.4/gcc/Option-Summary.html (no)
       # * https://gcc.gnu.org/onlinedocs/gcc-4.7.4/gcc/Option-Summary.html (yes)
diff --git a/Modules/FortranCInterface/CMakeLists.txt b/Modules/FortranCInterface/CMakeLists.txt
index a0f1862..2e8e14f 100644
--- a/Modules/FortranCInterface/CMakeLists.txt
+++ b/Modules/FortranCInterface/CMakeLists.txt
@@ -113,11 +113,15 @@
 if(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU" AND
   CMAKE_Fortran_COMPILER_VERSION VERSION_GREATER_EQUAL 12)
   target_compile_options(FortranCInterface PRIVATE "-fno-lto")
-  target_compile_options(myfort PRIVATE "-flto=auto" "-ffat-lto-objects")
+  if(NOT APPLE)
+    target_compile_options(myfort PRIVATE "-flto=auto" "-ffat-lto-objects")
+  endif()
 endif()
 if(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND
   CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 12)
-  target_compile_options(symbols PRIVATE "-flto=auto" "-ffat-lto-objects")
+  if(NOT APPLE)
+    target_compile_options(symbols PRIVATE "-flto=auto" "-ffat-lto-objects")
+  endif()
 endif()
 
 file(GENERATE OUTPUT exe-$<CONFIG>.cmake CONTENT [[
diff --git a/Source/CPack/cmCPackGenerator.cxx b/Source/CPack/cmCPackGenerator.cxx
index b7786d3..6889656 100644
--- a/Source/CPack/cmCPackGenerator.cxx
+++ b/Source/CPack/cmCPackGenerator.cxx
@@ -187,7 +187,7 @@
   this->CleanTemporaryDirectory();
 
   std::string bareTempInstallDirectory =
-    this->GetOption("CPACK_TEMPORARY_INSTALL_DIRECTORY");
+    this->GetOption("CPACK_TEMPORARY_DIRECTORY");
   std::string tempInstallDirectoryStr = bareTempInstallDirectory;
   bool setDestDir = this->GetOption("CPACK_SET_DESTDIR").IsOn() ||
     cmIsInternallyOn(this->GetOption("CPACK_SET_DESTDIR"));
@@ -1218,6 +1218,60 @@
   // it, the default value should be:
   this->SetOptionIfNotSet("CPACK_PACKAGING_INSTALL_PREFIX", "/");
 
+  // Special handling for CPACK_TEMPORARY[_INSTALL]_DIRECTORY.
+  // Note: Make sure that if only one of these variables is already set, the
+  //       other will be set to the same value. If they are set to different
+  //       values, however, we cannot proceed.
+  cmValue val1 =
+    this->MakefileMap->GetDefinition("CPACK_TEMPORARY_INSTALL_DIRECTORY");
+  cmValue val2 = this->MakefileMap->GetDefinition("CPACK_TEMPORARY_DIRECTORY");
+  if (val1 != val2) {
+    // One variable is set but not the other?
+    // Then set the other variable to the same value (even if it is invalid).
+    if (val1.Get() != nullptr && val2.Get() == nullptr) {
+      cmCPackLogger(cmCPackLog::LOG_WARNING,
+                    "Variable CPACK_TEMPORARY_INSTALL_DIRECTORY is set, which "
+                    "is not recommended. For backwards-compatibility we will "
+                    "also set CPACK_TEMPORARY_DIRECTORY to the same value and "
+                    "proceed. However, better set neither of them!"
+                      << std::endl);
+      this->MakefileMap->AddDefinition("CPACK_TEMPORARY_DIRECTORY", val1);
+    } else if (val1.Get() == nullptr && val2.Get() != nullptr) {
+      cmCPackLogger(
+        cmCPackLog::LOG_WARNING,
+        "Variable CPACK_TEMPORARY_DIRECTORY is set, which is not recommended."
+          << std::endl);
+      cmCPackLogger(
+        cmCPackLog::LOG_DEBUG,
+        "For backwards-compatibility we will set "
+        "CPACK_TEMPORARY_INSTALL_DIRECTORY to the same value as "
+        "CPACK_TEMPORARY_DIRECTORY. However, better set neither of them!"
+          << std::endl);
+      this->MakefileMap->AddDefinition("CPACK_TEMPORARY_INSTALL_DIRECTORY",
+                                       val2);
+    } else {
+      cmCPackLogger(cmCPackLog::LOG_VERBOSE,
+                    "CPACK_TEMPORARY_INSTALL_DIRECTORY is already set to: "
+                      << val1 << std::endl);
+      cmCPackLogger(
+        cmCPackLog::LOG_VERBOSE,
+        "CPACK_TEMPORARY_DIRECTORY is already set to: " << val2 << std::endl);
+      cmCPackLogger(cmCPackLog::LOG_ERROR,
+                    "Variables CPACK_TEMPORARY_DIRECTORY and "
+                    "CPACK_TEMPORARY_INSTALL_DIRECTORY are both set but to "
+                    "different values. This is not supported!"
+                      << std::endl);
+      return 0;
+    }
+  } else if (val1.Get() != nullptr && val2.Get() != nullptr) {
+    cmCPackLogger(cmCPackLog::LOG_WARNING,
+                  "Variables CPACK_TEMPORARY_DIRECTORY and "
+                  "CPACK_TEMPORARY_INSTALL_DIRECTORY are both set. Because "
+                  "they are set to the same value we can still proceed. "
+                  "However, better set neither of them!"
+                    << std::endl);
+  }
+
   return result;
 }
 
@@ -1356,7 +1410,7 @@
 int cmCPackGenerator::CleanTemporaryDirectory()
 {
   std::string tempInstallDirectory =
-    this->GetOption("CPACK_TEMPORARY_INSTALL_DIRECTORY");
+    this->GetOption("CPACK_TEMPORARY_DIRECTORY");
   if (cmsys::SystemTools::FileExists(tempInstallDirectory)) {
     cmCPackLogger(cmCPackLog::LOG_OUTPUT,
                   "- Clean temporary : " << tempInstallDirectory << std::endl);
diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx
index 498fd6e..e1aefd9 100644
--- a/Source/cmCTest.cxx
+++ b/Source/cmCTest.cxx
@@ -760,7 +760,9 @@
   }
   if (!this->GetCTestConfiguration("BuildDirectory").empty()) {
     this->Impl->BinaryDir = this->GetCTestConfiguration("BuildDirectory");
-    cmSystemTools::ChangeDirectory(this->Impl->BinaryDir);
+    if (this->Impl->TestDir.empty()) {
+      cmSystemTools::ChangeDirectory(this->Impl->BinaryDir);
+    }
   }
   this->Impl->TimeOut =
     std::chrono::seconds(atoi(this->GetCTestConfiguration("TimeOut").c_str()));
diff --git a/Source/cmELF.cxx b/Source/cmELF.cxx
index d9a4408..a71e5f1 100644
--- a/Source/cmELF.cxx
+++ b/Source/cmELF.cxx
@@ -621,7 +621,19 @@
 
       // Make sure the whole value was read.
       if (!(*this->Stream)) {
-        this->SetErrorMessage("Dynamic section specifies unreadable RPATH.");
+        if (tag == cmELF::TagRPath) {
+          this->SetErrorMessage(
+            "Dynamic section specifies unreadable DT_RPATH");
+        } else if (tag == cmELF::TagRunPath) {
+          this->SetErrorMessage(
+            "Dynamic section specifies unreadable DT_RUNPATH");
+        } else if (tag == cmELF::TagMipsRldMapRel) {
+          this->SetErrorMessage(
+            "Dynamic section specifies unreadable DT_MIPS_RLD_MAP_REL");
+        } else {
+          this->SetErrorMessage("Dynamic section specifies unreadable value"
+                                " for unexpected attribute");
+        }
         se.Value = "";
         return nullptr;
       }
diff --git a/Tests/FindOpenACC/CMakeLists.txt b/Tests/FindOpenACC/CMakeLists.txt
index ef7de65..1b6bcf2 100644
--- a/Tests/FindOpenACC/CMakeLists.txt
+++ b/Tests/FindOpenACC/CMakeLists.txt
@@ -1,11 +1,5 @@
-
-set(langs C CXX)
-if(NOT CMAKE_GENERATOR STREQUAL "Ninja")
-  list(APPEND langs Fortran)
-endif()
-
-foreach(lang IN LISTS langs)
-  if(CMAKE_${lang}_COMPILER)
+foreach(lang IN ITEMS C CXX Fortran)
+  if(CMake_TEST_FindOpenACC_${lang})
     add_test(NAME FindOpenACC.Test${lang} COMMAND
       ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
       --build-and-test
diff --git a/Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake b/Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake
index 3ce2a08..190c6c1 100644
--- a/Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake
+++ b/Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake
@@ -542,7 +542,7 @@
 run_cmake_command(test-dir-invalid-arg ${CMAKE_CTEST_COMMAND} --test-dir)
 run_cmake_command(test-dir-non-existing-dir ${CMAKE_CTEST_COMMAND} --test-dir non-existing-dir)
 
-function(run_testDir)
+function(run_testDir testName testPreset)
   set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/testDir)
   set(RunCMake_TEST_NO_CLEAN 1)
   file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
@@ -552,9 +552,16 @@
   add_test(Test1 \"${CMAKE_COMMAND}\" -E true)
   add_test(Test2 \"${CMAKE_COMMAND}\" -E true)
   ")
-  run_cmake_command(testDir ${CMAKE_CTEST_COMMAND} --test-dir "${RunCMake_TEST_BINARY_DIR}/sub")
+  if (testPreset)
+    set(presetCommandLine --preset=default)
+    configure_file(
+      ${RunCMake_SOURCE_DIR}/testDir-presets.json.in
+      ${RunCMake_TEST_BINARY_DIR}/CMakePresets.json)
+  endif()
+  run_cmake_command(${testName} ${CMAKE_CTEST_COMMAND} --test-dir "${RunCMake_TEST_BINARY_DIR}/sub" ${presetCommandLine})
 endfunction()
-run_testDir()
+run_testDir(testDir 0)
+run_testDir(testDir-preset 1)
 
 # Test --output-junit
 function(run_output_junit)
diff --git a/Tests/RunCMake/CTestCommandLine/testDir-presets.json.in b/Tests/RunCMake/CTestCommandLine/testDir-presets.json.in
new file mode 100644
index 0000000..46391f8
--- /dev/null
+++ b/Tests/RunCMake/CTestCommandLine/testDir-presets.json.in
@@ -0,0 +1,20 @@
+{
+  "version": 3,
+  "cmakeMinimumRequired": {
+    "major": 3,
+    "minor": 22,
+    "patch": 0
+  },
+  "configurePresets": [
+    {
+      "name": "default",
+      "binaryDir": "presetBinaryDir"
+    }
+  ],
+  "testPresets": [
+    {
+      "name": "default",
+      "configurePreset": "default"
+    }
+  ]
+}
diff --git a/Utilities/ClangTidyModule/UsePragmaOnceCheck.cxx b/Utilities/ClangTidyModule/UsePragmaOnceCheck.cxx
index 37ecd70..9ec8e5f 100644
--- a/Utilities/ClangTidyModule/UsePragmaOnceCheck.cxx
+++ b/Utilities/ClangTidyModule/UsePragmaOnceCheck.cxx
@@ -55,10 +55,10 @@
     , FID(FID)
   {
     SourceManager& SM = this->PP->getSourceManager();
-    const FileEntry* Entry = SM.getFileEntryForID(FID);
+    OptionalFileEntryRef Entry = SM.getFileEntryRefForID(FID);
     assert(Entry && "Invalid FileID given");
 
-    Lexer MyLexer(FID, SM.getMemoryBufferForFileOrFake(Entry), SM,
+    Lexer MyLexer(FID, SM.getMemoryBufferForFileOrFake(*Entry), SM,
                   this->PP->getLangOpts());
     Token Tok;
 
@@ -157,9 +157,10 @@
     // guards.
     SourceManager& SM = this->PP->getSourceManager();
     if (Reason == EnterFile && FileType == SrcMgr::C_User) {
-      if (const FileEntry* FE = SM.getFileEntryForID(SM.getFileID(Loc))) {
+      if (OptionalFileEntryRef FE =
+            SM.getFileEntryRefForID(SM.getFileID(Loc))) {
         std::string FileName = cleanPath(FE->getName());
-        this->Files[FileName] = FE;
+        this->Files.try_emplace(FileName, *FE);
       }
     }
   }
@@ -205,9 +206,9 @@
         continue;
       }
 
-      const FileEntry* FE =
-        SM.getFileEntryForID(SM.getFileID(MI->getDefinitionLoc()));
-      std::string FileName = cleanPath(FE->getName());
+      FileEntryRef FE =
+        *SM.getFileEntryRefForID(SM.getFileID(MI->getDefinitionLoc()));
+      std::string FileName = cleanPath(FE.getName());
       this->Files.erase(FileName);
 
       // Look up Locations for this guard.
@@ -290,7 +291,7 @@
   }
 
   std::vector<std::pair<Token, const MacroInfo*>> Macros;
-  llvm::StringMap<const FileEntry*> Files;
+  llvm::StringMap<FileEntryRef> Files;
   std::map<const IdentifierInfo*, std::pair<SourceLocation, SourceLocation>>
     Ifndefs;
   std::map<SourceLocation, SourceLocation> EndIfs;
diff --git a/Utilities/Sphinx/CTestCustom.cmake.in b/Utilities/Sphinx/CTestCustom.cmake.in
index 840121b..ee13aa1 100644
--- a/Utilities/Sphinx/CTestCustom.cmake.in
+++ b/Utilities/Sphinx/CTestCustom.cmake.in
@@ -1,3 +1,4 @@
 list(APPEND CTEST_CUSTOM_WARNING_EXCEPTION
   "cmake.texi:[0-9]+: warning: .definfoenclose is obsolete"
+  "cmake.texi:[0-9]+: warning: @ref should not appear on @item line"
   )