Merge topic 'iwyu-xcode'

67c75064d1 Source: Fix IWYU warnings in Xcode generators

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !6729
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index b9b020b..7f38659 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -742,6 +742,8 @@
         - build:windows-vs2022-x64-ninja
     needs:
         - build:windows-vs2022-x64-ninja
+    variables:
+        CMAKE_CI_JOB_NIGHTLY_NINJA: "true"
 
 test:windows-vs2022-x64:
     extends:
diff --git a/.gitlab/ci/ninja-nightly.ps1 b/.gitlab/ci/ninja-nightly.ps1
new file mode 100755
index 0000000..071b077
--- /dev/null
+++ b/.gitlab/ci/ninja-nightly.ps1
@@ -0,0 +1,9 @@
+$erroractionpreference = "stop"
+
+Invoke-Expression -Command .gitlab/ci/vcvarsall.ps1
+Set-Location -Path ".gitlab"
+git clone https://github.com/ninja-build/ninja.git ninja-src
+cmake -S ninja-src -B ninja-src/build -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release
+cmake --build ninja-src/build --target ninja
+Move-Item -Path "ninja-src\build\ninja.exe" -Destination . -Force
+Remove-Item "ninja-src" -Recurse -Force
diff --git a/.gitlab/ci/ninja.ps1 b/.gitlab/ci/ninja.ps1
index 4c5333a..47bb056 100755
--- a/.gitlab/ci/ninja.ps1
+++ b/.gitlab/ci/ninja.ps1
@@ -1,5 +1,10 @@
 $erroractionpreference = "stop"
 
+if ("$env:CMAKE_CI_JOB_NIGHTLY_NINJA" -eq "true" -And "$env:CMAKE_CI_NIGHTLY" -eq "true") {
+    & .gitlab/ci/ninja-nightly.ps1
+    exit $LASTEXITCODE
+}
+
 $version = "1.10.2"
 $sha256sum = "BBDE850D247D2737C5764C927D1071CBB1F1957DCABDA4A130FA8547C12C695F"
 $filename = "ninja-win"
diff --git a/.gitlab/ci/vcvarsall.ps1 b/.gitlab/ci/vcvarsall.ps1
index 57d3386..f91b100 100755
--- a/.gitlab/ci/vcvarsall.ps1
+++ b/.gitlab/ci/vcvarsall.ps1
@@ -1,6 +1,6 @@
 $erroractionpreference = "stop"
 
-cmd /c "`"$env:VCVARSALL`" $VCVARSPLATFORM -vcvars_ver=$VCVARSVERSION & set" |
+cmd /c "`"$env:VCVARSALL`" $env:VCVARSPLATFORM -vcvars_ver=$env:VCVARSVERSION & set" |
 foreach {
     if ($_ -match "=") {
         $v = $_.split("=")
diff --git a/.gitlab/os-windows.yml b/.gitlab/os-windows.yml
index 4ecc120..7c578aa 100644
--- a/.gitlab/os-windows.yml
+++ b/.gitlab/os-windows.yml
@@ -151,13 +151,14 @@
 ## Windows-specific scripts
 
 .before_script_windows: &before_script_windows
-    - Invoke-Expression -Command .gitlab/ci/wix.ps1
-    - Invoke-Expression -Command .gitlab/ci/cmake.ps1
-    - Invoke-Expression -Command .gitlab/ci/ninja.ps1
     - $pwdpath = $pwd.Path
+    - powershell -File ".gitlab/ci/wix.ps1"
     - Set-Item -Force -Path "env:WIX" -Value "$pwdpath\.gitlab\wix"
+    - powershell -File ".gitlab/ci/cmake.ps1"
+    - Set-Item -Force -Path "env:PATH" -Value "$pwdpath\.gitlab\cmake\bin;$env:PATH"
+    - powershell -File ".gitlab/ci/ninja.ps1"
+    - Set-Item -Force -Path "env:PATH" -Value "$pwdpath\.gitlab;$env:PATH"
     - (& "$env:WIX\bin\light.exe" -help) | Select -First 1
-    - Set-Item -Force -Path "env:PATH" -Value "$pwdpath\.gitlab;$pwdpath\.gitlab\cmake\bin;$env:PATH"
     - cmake --version
     - ninja --version
     - cmake -P .gitlab/ci/download_qt.cmake
diff --git a/Modules/GoogleTest.cmake b/Modules/GoogleTest.cmake
index efc33e3..f5f4f02 100644
--- a/Modules/GoogleTest.cmake
+++ b/Modules/GoogleTest.cmake
@@ -516,7 +516,8 @@
     string(CONCAT ctest_include_content
       "if(EXISTS \"$<TARGET_FILE:${TARGET}>\")"                                    "\n"
       "  if(NOT EXISTS \"${ctest_tests_file}\" OR"                                 "\n"
-      "     NOT \"${ctest_tests_file}\" IS_NEWER_THAN \"$<TARGET_FILE:${TARGET}>\")" "\n"
+      "     NOT \"${ctest_tests_file}\" IS_NEWER_THAN \"$<TARGET_FILE:${TARGET}>\" OR\n"
+      "     NOT \"${ctest_tests_file}\" IS_NEWER_THAN \"\${CMAKE_CURRENT_LIST_FILE}\")\n"
       "    include(\"${_GOOGLETEST_DISCOVER_TESTS_SCRIPT}\")"                      "\n"
       "    gtest_discover_tests_impl("                                             "\n"
       "      TEST_EXECUTABLE"        " [==[" "$<TARGET_FILE:${TARGET}>"   "]==]"   "\n"
diff --git a/Modules/Platform/Windows-Clang.cmake b/Modules/Platform/Windows-Clang.cmake
index 1c32018..c4d6fd8 100644
--- a/Modules/Platform/Windows-Clang.cmake
+++ b/Modules/Platform/Windows-Clang.cmake
@@ -56,7 +56,12 @@
   set(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_LIBRARIES 1)
   set(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_INCLUDES 1)
 
-  set(CMAKE_${lang}_COMPILE_OPTIONS_IPO "-flto")
+  if(CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL 3.9)
+    set(CMAKE_${lang}_COMPILE_OPTIONS_IPO "-flto=thin")
+  else()
+    set(CMAKE_${lang}_COMPILE_OPTIONS_IPO "-flto")
+  endif()
+
   set(_CMAKE_${lang}_IPO_SUPPORTED_BY_CMAKE YES)
   set(_CMAKE_${lang}_IPO_MAY_BE_SUPPORTED_BY_COMPILER YES)
   set(CMAKE_${lang}_ARCHIVE_CREATE_IPO "<CMAKE_AR> qc <TARGET> <LINK_FLAGS> <OBJECTS>")
diff --git a/Source/CMakeVersion.cmake b/Source/CMakeVersion.cmake
index fef5691..5c01ca0 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 22)
-set(CMake_VERSION_PATCH 20211115)
+set(CMake_VERSION_PATCH 20211117)
 #set(CMake_VERSION_RC 0)
 set(CMake_VERSION_IS_DIRTY 0)
 
diff --git a/Tests/CMakeCommands/target_link_directories/CMakeLists.txt b/Tests/CMakeCommands/target_link_directories/CMakeLists.txt
index bc7b9b2..a5f69f3 100644
--- a/Tests/CMakeCommands/target_link_directories/CMakeLists.txt
+++ b/Tests/CMakeCommands/target_link_directories/CMakeLists.txt
@@ -10,31 +10,31 @@
 add_library(target_link_directories_2 SHARED EXCLUDE_FROM_ALL LinkDirectoriesLib.c)
 target_link_directories(target_link_directories_2 PRIVATE /private/dir INTERFACE /interface/dir)
 get_target_property(result target_link_directories_2 LINK_DIRECTORIES)
-if (NOT result MATCHES "/private/dir")
+if (NOT result STREQUAL "/private/dir")
   message(SEND_ERROR "${result} target_link_directories not populated the LINK_DIRECTORIES target property")
 endif()
 get_target_property(result target_link_directories_2 INTERFACE_LINK_DIRECTORIES)
-if (NOT result MATCHES "/interface/dir")
+if (NOT result STREQUAL "/interface/dir")
   message(SEND_ERROR "target_link_directories not populated the INTERFACE_LINK_DIRECTORIES target property of shared library")
 endif()
 
 add_library(target_link_directories_3 STATIC EXCLUDE_FROM_ALL LinkDirectoriesLib.c)
 target_link_directories(target_link_directories_3 INTERFACE /interface/dir)
 get_target_property(result target_link_directories_3 INTERFACE_LINK_DIRECTORIES)
-if (NOT result MATCHES "/interface/dir")
+if (NOT result STREQUAL "/interface/dir")
   message(SEND_ERROR "target_link_directories not populated the INTERFACE_LINK_DIRECTORIES target property of static library")
 endif()
 
 add_library(target_link_directories_4 SHARED EXCLUDE_FROM_ALL LinkDirectoriesLib.c)
 target_link_directories(target_link_directories_4 PRIVATE relative/dir)
 get_target_property(result target_link_directories_4 LINK_DIRECTORIES)
-if (NOT result MATCHES "${CMAKE_CURRENT_SOURCE_DIR}/relative/dir")
+if (NOT result STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}/relative/dir")
   message(SEND_ERROR "target_link_directories not populated the LINK_DIRECTORIES with relative path")
 endif()
 
 add_subdirectory(subdir)
 target_link_directories(target_link_directories_5 PRIVATE relative/dir)
 get_target_property(result target_link_directories_5 LINK_DIRECTORIES)
-if (NOT result MATCHES "${CMAKE_CURRENT_SOURCE_DIR}/relative/dir")
+if (NOT result STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}/relative/dir")
   message(SEND_ERROR "target_link_directories not populated the LINK_DIRECTORIES with relative path")
 endif()
diff --git a/Tests/RunCMake/GoogleTest/GoogleTest-discovery-arg-change-basic-stdout.txt b/Tests/RunCMake/GoogleTest/GoogleTest-discovery-arg-change-basic-stdout.txt
new file mode 100644
index 0000000..385159d
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/GoogleTest-discovery-arg-change-basic-stdout.txt
@@ -0,0 +1,7 @@
+Test project .*/Tests/RunCMake/GoogleTest/GoogleTest-discovery-arg-change
+  Test #1: basic\.case_foo
+  Test #2: basic\.case_bar
+  Test #3: basic\.disabled_case \(Disabled\)
+  Test #4: basic\.DISABLEDnot_really_case
+
+Total Tests: 4
diff --git a/Tests/RunCMake/GoogleTest/GoogleTest-discovery-arg-change-typed-stdout.txt b/Tests/RunCMake/GoogleTest/GoogleTest-discovery-arg-change-typed-stdout.txt
new file mode 100644
index 0000000..095fdcd
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/GoogleTest-discovery-arg-change-typed-stdout.txt
@@ -0,0 +1,5 @@
+Test project .*/Tests/RunCMake/GoogleTest/GoogleTest-discovery-arg-change
+  Test #1: typed/short\.case
+  Test #2: typed/float\.case
+
+Total Tests: 2
diff --git a/Tests/RunCMake/GoogleTest/GoogleTest-skip-test-stdout.txt b/Tests/RunCMake/GoogleTest/GoogleTest-skip-test-stdout.txt
new file mode 100644
index 0000000..d06cd0a
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/GoogleTest-skip-test-stdout.txt
@@ -0,0 +1,10 @@
+Test project .*
+    Start 36: skip_test.test1
+1/1 Test #36: skip_test.test1 \.+\*\*\*Skipped +[0-9.]+ sec
+
+100% tests passed, 0 tests failed out of 1
+
+Total Test time \(real\) = +[0-9.]+ sec
+
+The following tests did not run:
+.*36 - skip_test\.test1 \(Skipped\)
diff --git a/Tests/RunCMake/GoogleTest/GoogleTest-skip-timeout-stdout.txt b/Tests/RunCMake/GoogleTest/GoogleTest-skip-timeout-stdout.txt
deleted file mode 100644
index eeecb6a..0000000
--- a/Tests/RunCMake/GoogleTest/GoogleTest-skip-timeout-stdout.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-Test project .*
-    Start 20: skip_test.test1
-1/1 Test #20: skip_test.test1 \.+\*\*\*Skipped +[0-9.]+ sec
-
-100% tests passed, 0 tests failed out of 1
-
-Total Test time \(real\) = +[0-9.]+ sec
-
-The following tests did not run:
-.*20 - skip_test\.test1 \(Skipped\)
diff --git a/Tests/RunCMake/GoogleTest/GoogleTestDiscoveryArgChange.cmake b/Tests/RunCMake/GoogleTest/GoogleTestDiscoveryArgChange.cmake
new file mode 100644
index 0000000..e4e13c5
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/GoogleTestDiscoveryArgChange.cmake
@@ -0,0 +1,14 @@
+enable_language(CXX)
+include(GoogleTest)
+
+enable_testing()
+
+include(xcode_sign_adhoc.cmake)
+
+add_executable(fake_gtest fake_gtest.cpp)
+xcode_sign_adhoc(fake_gtest)
+
+gtest_discover_tests(
+  fake_gtest
+  TEST_FILTER "${TEST_FILTER}*"
+)
diff --git a/Tests/RunCMake/GoogleTest/RunCMakeTest.cmake b/Tests/RunCMake/GoogleTest/RunCMakeTest.cmake
index c5c5925..33a4b43 100644
--- a/Tests/RunCMake/GoogleTest/RunCMakeTest.cmake
+++ b/Tests/RunCMake/GoogleTest/RunCMakeTest.cmake
@@ -1,5 +1,12 @@
 include(RunCMake)
 
+if(RunCMake_GENERATOR STREQUAL "Borland Makefiles" OR
+   RunCMake_GENERATOR STREQUAL "Watcom WMake")
+  set(fs_delay 3)
+else()
+  set(fs_delay 1.125)
+endif()
+
 function(run_GoogleTest DISCOVERY_MODE)
   # Use a single build tree for a few tests without cleaning.
   set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/GoogleTest-build)
@@ -153,6 +160,46 @@
   )
 endfunction()
 
+function(run_GoogleTest_discovery_arg_change DISCOVERY_MODE)
+  # Use a single build tree for a few tests without cleaning.
+  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/GoogleTest-discovery-arg-change)
+  set(RunCMake_TEST_NO_CLEAN 1)
+  file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
+  file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
+
+  run_cmake_with_options(GoogleTestDiscoveryArgChange
+    -DCMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE=${DISCOVERY_MODE}
+    -DTEST_FILTER=basic
+  )
+  run_cmake_command(GoogleTest-discovery-arg-change-build
+    ${CMAKE_COMMAND}
+    --build .
+    --config Release
+    --target fake_gtest
+  )
+  run_cmake_command(GoogleTest-discovery-arg-change-basic
+    ${CMAKE_CTEST_COMMAND}
+    -C Release
+    -N
+  )
+  execute_process(COMMAND ${CMAKE_COMMAND} -E sleep ${fs_delay}) # handle 1s resolution
+  run_cmake_with_options(GoogleTestDiscoveryArgChange
+    -DCMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE=${DISCOVERY_MODE}
+    -DTEST_FILTER=typed
+  )
+  run_cmake_command(GoogleTest-discovery-arg-change-build
+    ${CMAKE_COMMAND}
+    --build .
+    --config Release
+    --target fake_gtest
+  )
+  run_cmake_command(GoogleTest-discovery-arg-change-typed
+    ${CMAKE_CTEST_COMMAND}
+    -C Release
+    -N
+  )
+endfunction()
+
 function(run_GoogleTest_discovery_multi_config)
   # Use a single build tree for a few tests without cleaning.
   set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/GoogleTest-discovery-multi-config)
@@ -195,6 +242,10 @@
   run_GoogleTestXML(${DISCOVERY_MODE})
   message("Testing ${DISCOVERY_MODE} discovery mode via DISCOVERY_MODE option...")
   run_GoogleTest_discovery_timeout(${DISCOVERY_MODE})
+  if(# VS 9 does not rebuild if POST_BUILD command changes.
+      NOT "${DISCOVERY_MODE};${RunCMake_GENERATOR}" MATCHES "^POST_BUILD;Visual Studio 9")
+    run_GoogleTest_discovery_arg_change(${DISCOVERY_MODE})
+  endif()
 endforeach()
 
 if(RunCMake_GENERATOR_IS_MULTI_CONFIG)