ci: Add LLVM/Clang 13.0 nightly CI jobs on Windows

Add jobs covering the `clang-cl` front-end with Ninja and NMake.
Add a job covering the `clang++` front-end with Ninja.
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d8d3a36..5e2df26f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -834,6 +834,51 @@
     variables:
         CMAKE_CI_JOB_NIGHTLY: "true"
 
+t:windows-clang13.0-cl-ninja:
+    extends:
+        - .windows_clang_ninja
+        - .cmake_test_windows_clang
+        - .windows_tags_concurrent
+        - .cmake_junit_artifacts
+        - .run_dependent
+    dependencies:
+        - t:windows-vs2022-x64-ninja
+    needs:
+        - t:windows-vs2022-x64-ninja
+    variables:
+        CMAKE_CI_BUILD_NAME: windows_clang13.0_cl_ninja
+        CMAKE_CI_JOB_NIGHTLY: "true"
+
+t:windows-clang13.0-cl-nmake:
+    extends:
+        - .windows_clang_nmake
+        - .cmake_test_windows_clang
+        - .windows_tags_concurrent
+        - .cmake_junit_artifacts
+        - .run_dependent
+    dependencies:
+        - t:windows-vs2022-x64-ninja
+    needs:
+        - t:windows-vs2022-x64-ninja
+    variables:
+        CMAKE_CI_BUILD_NAME: windows_clang13.0_cl_nmake
+        CMAKE_CI_JOB_NIGHTLY: "true"
+
+t:windows-clang13.0-gnu-ninja:
+    extends:
+        - .windows_clang_ninja
+        - .cmake_test_windows_clang
+        - .windows_tags_concurrent
+        - .cmake_junit_artifacts
+        - .run_dependent
+    dependencies:
+        - t:windows-vs2022-x64-ninja
+    needs:
+        - t:windows-vs2022-x64-ninja
+    variables:
+        CMAKE_CI_BUILD_NAME: windows_clang13.0_gnu_ninja
+        CMAKE_CI_JOB_NIGHTLY: "true"
+
 t:windows-msvc-v71-nmake:
     extends:
         - .windows_msvc_v71_nmake
diff --git a/.gitlab/ci/clang.ps1 b/.gitlab/ci/clang.ps1
new file mode 100755
index 0000000..25d64ba
--- /dev/null
+++ b/.gitlab/ci/clang.ps1
@@ -0,0 +1,37 @@
+$erroractionpreference = "stop"
+
+if ("$env:CMAKE_CI_BUILD_NAME".Contains("clang13.0")) {
+    # LLVM/Clang 13.0
+    # https://github.com/llvm/llvm-project/releases/tag/llvmorg-13.0.0
+    $filename = "llvm-13.0.0-win-x86_64-1"
+    $sha256sum = "F1B7CE360DACBC9776D7F84BE714766D60CF3D47492AFE34C45D574D1C597264"
+} else {
+    throw ('unknown CMAKE_CI_BUILD_NAME: ' + "$env:CMAKE_CI_BUILD_NAME")
+}
+$tarball = "$filename.zip"
+
+$outdir = $pwd.Path
+$outdir = "$outdir\.gitlab"
+$ProgressPreference = 'SilentlyContinue'
+# This URL is only visible inside of Kitware's network.  See above filename table.
+Invoke-WebRequest -Uri "https://cmake.org/files/dependencies/internal/$tarball" -OutFile "$outdir\$tarball"
+$hash = Get-FileHash "$outdir\$tarball" -Algorithm SHA256
+if ($hash.Hash -ne $sha256sum) {
+    exit 1
+}
+
+Add-Type -AssemblyName System.IO.Compression.FileSystem
+[System.IO.Compression.ZipFile]::ExtractToDirectory("$outdir\$tarball", "$outdir")
+Move-Item -Path "$outdir\$filename" -Destination "$outdir\llvm"
+
+$bin = "$outdir\llvm\bin"
+$null = New-Item -ItemType HardLink -Path "$bin\clang++.exe"      -Target "$bin\clang.exe"
+$null = New-Item -ItemType HardLink -Path "$bin\clang-cl.exe"     -Target "$bin\clang.exe"
+$null = New-Item -ItemType HardLink -Path "$bin\clang-cpp.exe"    -Target "$bin\clang.exe"
+$null = New-Item -ItemType HardLink -Path "$bin\ld.lld.exe"       -Target "$bin\lld.exe"
+$null = New-Item -ItemType HardLink -Path "$bin\ld64.lld.exe"     -Target "$bin\lld.exe"
+$null = New-Item -ItemType HardLink -Path "$bin\lld-link.exe"     -Target "$bin\lld.exe"
+$null = New-Item -ItemType HardLink -Path "$bin\llvm-lib.exe"     -Target "$bin\llvm-ar.exe"
+$null = New-Item -ItemType HardLink -Path "$bin\llvm-ranlib.exe"  -Target "$bin\llvm-ar.exe"
+$null = New-Item -ItemType HardLink -Path "$bin\llvm-objcopy.exe" -Target "$bin\llvm-strip.exe"
+Clear-Variable -Name bin
diff --git a/.gitlab/ci/configure_windows_clang_common.cmake b/.gitlab/ci/configure_windows_clang_common.cmake
new file mode 100644
index 0000000..6d66a05
--- /dev/null
+++ b/.gitlab/ci/configure_windows_clang_common.cmake
@@ -0,0 +1,2 @@
+set(configure_no_sccache 1)
+include("${CMAKE_CURRENT_LIST_DIR}/configure_external_test.cmake")
diff --git a/.gitlab/ci/configure_windows_clang_ninja.cmake b/.gitlab/ci/configure_windows_clang_ninja.cmake
new file mode 100644
index 0000000..ba19834
--- /dev/null
+++ b/.gitlab/ci/configure_windows_clang_ninja.cmake
@@ -0,0 +1 @@
+include("${CMAKE_CURRENT_LIST_DIR}/configure_windows_clang_common.cmake")
diff --git a/.gitlab/ci/configure_windows_clang_nmake.cmake b/.gitlab/ci/configure_windows_clang_nmake.cmake
new file mode 100644
index 0000000..ba19834
--- /dev/null
+++ b/.gitlab/ci/configure_windows_clang_nmake.cmake
@@ -0,0 +1 @@
+include("${CMAKE_CURRENT_LIST_DIR}/configure_windows_clang_common.cmake")
diff --git a/.gitlab/ci/env_windows_clang_common.cmake b/.gitlab/ci/env_windows_clang_common.cmake
new file mode 100644
index 0000000..fdd668f
--- /dev/null
+++ b/.gitlab/ci/env_windows_clang_common.cmake
@@ -0,0 +1,7 @@
+if("$ENV{CMAKE_CI_BUILD_NAME}" MATCHES "(^|_)gnu(_|$)")
+  set(ENV{CC} clang)
+  set(ENV{CXX} clang++)
+else()
+  set(ENV{CC} clang-cl)
+  set(ENV{CXX} clang-cl)
+endif()
diff --git a/.gitlab/ci/env_windows_clang_ninja.cmake b/.gitlab/ci/env_windows_clang_ninja.cmake
new file mode 100644
index 0000000..f3834a2
--- /dev/null
+++ b/.gitlab/ci/env_windows_clang_ninja.cmake
@@ -0,0 +1 @@
+include("${CMAKE_CURRENT_LIST_DIR}/env_windows_clang_common.cmake")
diff --git a/.gitlab/ci/env_windows_clang_nmake.cmake b/.gitlab/ci/env_windows_clang_nmake.cmake
new file mode 100644
index 0000000..f3834a2
--- /dev/null
+++ b/.gitlab/ci/env_windows_clang_nmake.cmake
@@ -0,0 +1 @@
+include("${CMAKE_CURRENT_LIST_DIR}/env_windows_clang_common.cmake")
diff --git a/.gitlab/os-windows.yml b/.gitlab/os-windows.yml
index 2bce8c8..d01c828 100644
--- a/.gitlab/os-windows.yml
+++ b/.gitlab/os-windows.yml
@@ -87,6 +87,14 @@
     variables:
         CMAKE_CONFIGURATION: windows_borland5.8
 
+.windows_ninja:
+    extends: .windows
+
+    variables:
+        CMAKE_GENERATOR: "Ninja"
+        CMAKE_CI_BUILD_TYPE: Release
+        CMAKE_CI_NIGHTLY_IGNORE_DEPS: "true"
+
 .windows_nmake:
     extends: .windows
 
@@ -119,6 +127,22 @@
     variables:
         CMAKE_CONFIGURATION: windows_vs2022_x64_jom
 
+.windows_clang_ninja:
+    extends:
+        - .windows_ninja
+        - .windows_vcvarsall_vs2022_x64
+
+    variables:
+        CMAKE_CONFIGURATION: windows_clang_ninja
+
+.windows_clang_nmake:
+    extends:
+        - .windows_nmake
+        - .windows_vcvarsall_vs2022_x64
+
+    variables:
+        CMAKE_CONFIGURATION: windows_clang_nmake
+
 .windows_msvc_v71_nmake:
     extends: .windows_nmake
 
@@ -262,6 +286,20 @@
 
     interruptible: true
 
+.cmake_test_windows_clang:
+    stage: test-ext
+
+    script:
+        - $pwdpath = $pwd.Path
+        - powershell -File ".gitlab/ci/ninja.ps1"
+        - Set-Item -Force -Path "env:PATH" -Value "$pwdpath\.gitlab;$env:PATH"
+        - Invoke-Expression -Command .gitlab/ci/clang.ps1
+        - Invoke-Expression -Command .gitlab/ci/vcvarsall.ps1
+        - Set-Item -Force -Path "env:PATH" -Value "$pwdpath\.gitlab\llvm\bin;$env:PATH"
+        - build/install/bin/ctest --output-on-failure -V -S .gitlab/ci/ctest_test_external.cmake
+
+    interruptible: true
+
 .cmake_test_windows_msvc:
     stage: test-ext