#!/bin/bash
set -e -v -x

artifact=$(basename "$TOOLCHAIN_ARTIFACT")
project=${artifact%.tar.*}
workspace=$HOME/workspace

cd $MOZ_FETCHES_DIR/cmake

# Work around https://gitlab.kitware.com/cmake/cmake/-/issues/26031
patch -p1 <<'EOF'
diff --git a/Source/bindexplib.cxx b/Source/bindexplib.cxx
index bbcb0bccc9..f5d80dd784 100644
--- a/Source/bindexplib.cxx
+++ b/Source/bindexplib.cxx
@@ -414,7 +414,7 @@ static bool DumpFile(std::string const& nmPath, char const* filename,
                      std::set<std::string>& symbols,
                      std::set<std::string>& dataSymbols)
 {
-#ifndef _WIN32
+#if 1
   return DumpFileWithLlvmNm(nmPath, filename, symbols, dataSymbols);
 #else
   HANDLE hFile;
EOF

# Work around https://github.com/llvm/llvm-project/issues/94563
# The resulting cmake works well enough for our use.
patch -p1 <<'EOF'
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index 44f87dba80..0ff5214dd9 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -979,14 +979,6 @@ if(WIN32)
         cmVSSolution.h
         cmVSVersion.h
       )
-
-    # Add a manifest file to executables on Windows to allow for
-    # GetVersion to work properly on Windows 8 and above.
-    if(MSVC)
-      target_sources(ManifestLib INTERFACE cmake.version.manifest)
-    else()
-      target_sources(ManifestLib INTERFACE cmake.version.manifest.rc)
-    endif()
   endif()
 endif()

diff --git a/Source/kwsys/CMakeLists.txt b/Source/kwsys/CMakeLists.txt
index 08494b9bf5..0dfcc0f63a 100644
--- a/Source/kwsys/CMakeLists.txt
+++ b/Source/kwsys/CMakeLists.txt
@@ -977,7 +977,6 @@ if(KWSYS_STANDALONE OR CMake_SOURCE_DIR)
       )
     add_executable(${KWSYS_NAMESPACE}TestsCxx
       ${KWSYS_CXX_TEST_SRCS}
-      test.manifest
     )
     set_property(TARGET ${KWSYS_NAMESPACE}TestsCxx PROPERTY C_CLANG_TIDY "")
     set_property(TARGET ${KWSYS_NAMESPACE}TestsCxx PROPERTY CXX_CLANG_TIDY "")
EOF

# Work around https://github.com/llvm/llvm-project/issues/134237
# Should be removable once we update to clang 21.
patch -p1 <<'EOF'
diff --git a/Modules/CMakeFindBinUtils.cmake b/Modules/CMakeFindBinUtils.cmake
index 91543a6853..ea9627a0de 100644
--- a/Modules/CMakeFindBinUtils.cmake
+++ b/Modules/CMakeFindBinUtils.cmake
@@ -87,9 +87,9 @@ if(("x${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_SIMULATE_ID}" STREQUAL "xMSVC" AND
   if("x${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_ID}" MATCHES "^x(Clang|LLVMFlang)$")
     set(_CMAKE_NM_NAMES "llvm-nm" "nm")
     list(PREPEND _CMAKE_AR_NAMES "llvm-lib")
-    if("${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_VERSION}" VERSION_GREATER_EQUAL 14.0.2)
-      list(PREPEND _CMAKE_MT_NAMES "llvm-mt")
-    endif()
+    # if("${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_VERSION}" VERSION_GREATER_EQUAL 14.0.2)
+    #   list(PREPEND _CMAKE_MT_NAMES "llvm-mt")
+    # endif()
     list(PREPEND _CMAKE_LINKER_NAMES "lld-link")
     list(APPEND _CMAKE_TOOL_VARS NM)
   elseif("x${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_ID}" STREQUAL "xIntel")
EOF

export PATH="$MOZ_FETCHES_DIR/clang/bin:$PATH"

cmake \
  -GNinja \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_C_COMPILER=clang-cl \
  -DCMAKE_CXX_COMPILER=clang-cl \
  -DCMAKE_LINKER=lld-link \
  -DCMAKE_MT=llvm-mt \
  -DCMAKE_C_FLAGS="-Xclang -ivfsoverlay -Xclang $MOZ_FETCHES_DIR/vs/overlay.yaml -winsysroot $MOZ_FETCHES_DIR/vs" \
  -DCMAKE_CXX_FLAGS="-GR -EHsc -Xclang -ivfsoverlay -Xclang $MOZ_FETCHES_DIR/vs/overlay.yaml -winsysroot $MOZ_FETCHES_DIR/vs" \
  -DCMAKE_EXE_LINKER_FLAGS="-winsysroot:$MOZ_FETCHES_DIR/vs" \
  -DCMAKE_MODULE_LINKER_FLAGS="-winsysroot:$MOZ_FETCHES_DIR/vs" \
  -DCMAKE_SHARED_LINKER_FLAGS="-winsysroot:$MOZ_FETCHES_DIR/vs" \
  -DCMAKE_SYSTEM_NAME=Windows \
  -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded \
  -DCMAKE_INSTALL_PREFIX=$workspace/$project \
  -B $workspace/build

ninja -C $workspace/build -v install

tar -C $workspace -acvf $artifact $project
mkdir -p $UPLOAD_DIR
mv $artifact $UPLOAD_DIR
