[CMake][Python] Bump minimum CMake version to 3.26 (#23607)

CMake 3.26 added FindPython's `Development.SABIModule` component, which
is required for building Stable ABI (abi3). With this minimum version,
we can unconditionally request `SABIModule` upfront in the Python
`find_package` calls, before deciding whether to enable abi3. This is
appealing because the SABI module must be found early and cannot be
deferred to after the abi3 option is resolved; otherwise we need the
user to decide through cmake flags.

CMake 3.26 availability:
  pip install cmake: 4.2.3
  Homebrew: 4.2.3
  Chocolatey (Windows CI): 4.2.3
  Ubuntu 24.04 (apt): 3.28.3
  Ubuntu 22.04 (apt): 3.22.1 (use pip or Kitware APT repo)
  Debian 12 bookworm (apt): 3.25.1 (3.31.6 in backports)
  
ci-extra: all

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
diff --git a/.github/workflows/build_clang_tidy.yml b/.github/workflows/build_clang_tidy.yml
index 04a7b06..0668248 100644
--- a/.github/workflows/build_clang_tidy.yml
+++ b/.github/workflows/build_clang_tidy.yml
@@ -42,6 +42,8 @@
         with:
           submodules: true
 
+      - name: Install Python requirements
+        run: python3 -m pip install -r ./build_tools/github_actions/ci_requirements.txt
       - name: "Setting up CMake"
         run: |
           source ./build_tools/cmake/setup_build.sh
diff --git a/.github/workflows/ci_linux_arm64_clang.yml b/.github/workflows/ci_linux_arm64_clang.yml
index 9dd0df6..3f79c3b 100644
--- a/.github/workflows/ci_linux_arm64_clang.yml
+++ b/.github/workflows/ci_linux_arm64_clang.yml
@@ -32,7 +32,9 @@
         with:
           submodules: true
       - name: Install Python requirements
-        run: python3 -m pip install -r ./runtime/bindings/python/iree/runtime/build_requirements.txt
+        run: |
+          python3 -m pip install -r ./runtime/bindings/python/iree/runtime/build_requirements.txt
+          python3 -m pip install -r ./build_tools/github_actions/ci_requirements.txt
       # TODO(#18557): enable sccache (watching for network bandwidth charges
       #               between the cache server and AWS VMs)
       - name: CMake - configure
diff --git a/.github/workflows/ci_linux_x64_clang.yml b/.github/workflows/ci_linux_x64_clang.yml
index b29617f..df37b55 100644
--- a/.github/workflows/ci_linux_x64_clang.yml
+++ b/.github/workflows/ci_linux_x64_clang.yml
@@ -30,7 +30,9 @@
         with:
           submodules: true
       - name: Install Python requirements
-        run: python3 -m pip install -r ./runtime/bindings/python/iree/runtime/build_requirements.txt
+        run: |
+          python3 -m pip install -r ./runtime/bindings/python/iree/runtime/build_requirements.txt
+          python3 -m pip install -r ./build_tools/github_actions/ci_requirements.txt
       - name: Build IREE
         run: |
           source ./build_tools/cmake/setup_sccache.sh
diff --git a/.github/workflows/ci_linux_x64_clang_asan.yml b/.github/workflows/ci_linux_x64_clang_asan.yml
index 31e3ee7..a9721a0 100644
--- a/.github/workflows/ci_linux_x64_clang_asan.yml
+++ b/.github/workflows/ci_linux_x64_clang_asan.yml
@@ -23,7 +23,9 @@
         with:
           submodules: true
       - name: Install Python requirements
-        run: python3 -m pip install -r ./runtime/bindings/python/iree/runtime/build_requirements.txt
+        run: |
+          python3 -m pip install -r ./runtime/bindings/python/iree/runtime/build_requirements.txt
+          python3 -m pip install -r ./build_tools/github_actions/ci_requirements.txt
       - name: Build and test with ASan
         env:
           # Use a modern clang explicitly.
diff --git a/.github/workflows/ci_linux_x64_clang_byollvm.yml b/.github/workflows/ci_linux_x64_clang_byollvm.yml
index 4dab755..2313d4a 100644
--- a/.github/workflows/ci_linux_x64_clang_byollvm.yml
+++ b/.github/workflows/ci_linux_x64_clang_byollvm.yml
@@ -26,6 +26,8 @@
         uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
         with:
           submodules: true
+      - name: Install Python requirements
+        run: python3 -m pip install -r ./build_tools/github_actions/ci_requirements.txt
       - name: "Building and testing with bring-your-own-LLVM"
         run: ./build_tools/cmake/build_and_test_byo_llvm.sh
 
diff --git a/.github/workflows/ci_linux_x64_clang_debug.yml b/.github/workflows/ci_linux_x64_clang_debug.yml
index 137ce46..412d0d1 100644
--- a/.github/workflows/ci_linux_x64_clang_debug.yml
+++ b/.github/workflows/ci_linux_x64_clang_debug.yml
@@ -35,7 +35,9 @@
         with:
           submodules: true
       - name: Install Python requirements
-        run: python3 -m pip install -r ./runtime/bindings/python/iree/runtime/build_requirements.txt
+        run: |
+          python3 -m pip install -r ./runtime/bindings/python/iree/runtime/build_requirements.txt
+          python3 -m pip install -r ./build_tools/github_actions/ci_requirements.txt
       - name: Build IREE
         env:
           CMAKE_BUILD_TYPE: Debug
diff --git a/.github/workflows/ci_linux_x64_clang_tsan.yml b/.github/workflows/ci_linux_x64_clang_tsan.yml
index 1a1a015..e6a7b69 100644
--- a/.github/workflows/ci_linux_x64_clang_tsan.yml
+++ b/.github/workflows/ci_linux_x64_clang_tsan.yml
@@ -34,7 +34,9 @@
         with:
           submodules: true
       - name: Install Python requirements
-        run: python3 -m pip install -r ./runtime/bindings/python/iree/runtime/build_requirements.txt
+        run: |
+          python3 -m pip install -r ./runtime/bindings/python/iree/runtime/build_requirements.txt
+          python3 -m pip install -r ./build_tools/github_actions/ci_requirements.txt
       - name: Build and test with TSan
         env:
           # Use a modern clang explicitly.
diff --git a/.github/workflows/ci_linux_x64_clang_ubsan.yml b/.github/workflows/ci_linux_x64_clang_ubsan.yml
index 6ebd404..d57a781 100644
--- a/.github/workflows/ci_linux_x64_clang_ubsan.yml
+++ b/.github/workflows/ci_linux_x64_clang_ubsan.yml
@@ -23,7 +23,9 @@
         with:
           submodules: true
       - name: Install Python requirements
-        run: python3 -m pip install -r ./runtime/bindings/python/iree/runtime/build_requirements.txt
+        run: |
+          python3 -m pip install -r ./runtime/bindings/python/iree/runtime/build_requirements.txt
+          python3 -m pip install -r ./build_tools/github_actions/ci_requirements.txt
       - name: Build and test with UBSan
         env:
           # Use a modern clang explicitly.
diff --git a/.github/workflows/ci_linux_x64_gcc.yml b/.github/workflows/ci_linux_x64_gcc.yml
index 20636fa..7ad792f 100644
--- a/.github/workflows/ci_linux_x64_gcc.yml
+++ b/.github/workflows/ci_linux_x64_gcc.yml
@@ -28,6 +28,8 @@
         uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
         with:
           submodules: true
+      - name: Install Python requirements
+        run: python3 -m pip install -r ./build_tools/github_actions/ci_requirements.txt
       - name: "Building IREE with gcc"
         env:
           CC: gcc-11
diff --git a/.github/workflows/clang_tidy.yml b/.github/workflows/clang_tidy.yml
index 88ac5ac..ee40c92 100644
--- a/.github/workflows/clang_tidy.yml
+++ b/.github/workflows/clang_tidy.yml
@@ -71,6 +71,7 @@
           echo "$HOME/.local/bin" >> "$GITHUB_PATH"
           export PATH="$HOME/.local/bin:$PATH"
           uv pip install --system -r ./runtime/bindings/python/iree/runtime/build_requirements.txt
+          uv pip install --system -r ./build_tools/github_actions/ci_requirements.txt
 
       - name: Generate compilation database (compile_commands.json)
         run: |
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 75d57b6..ee755c6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,7 +4,7 @@
 # See https://llvm.org/LICENSE.txt for license information.
 # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
-cmake_minimum_required(VERSION 3.21...3.24)
+cmake_minimum_required(VERSION 3.26...3.29)
 
 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
 
diff --git a/build_tools/cmake/generic_riscv32.cmake b/build_tools/cmake/generic_riscv32.cmake
index 32b2f36..c77e583 100644
--- a/build_tools/cmake/generic_riscv32.cmake
+++ b/build_tools/cmake/generic_riscv32.cmake
@@ -4,7 +4,7 @@
 # See https://llvm.org/LICENSE.txt for license information.
 # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
-cmake_minimum_required(VERSION 3.13)
+cmake_minimum_required(VERSION 3.26)
 
 # CMake invokes the toolchain file twice during the first build, but only once
 # during subsequent rebuilds. This was causing the various flags to be added
diff --git a/build_tools/cmake/generic_riscv64.cmake b/build_tools/cmake/generic_riscv64.cmake
index 1852e80..cd0e2ea 100644
--- a/build_tools/cmake/generic_riscv64.cmake
+++ b/build_tools/cmake/generic_riscv64.cmake
@@ -4,7 +4,7 @@
 # See https://llvm.org/LICENSE.txt for license information.
 # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
-cmake_minimum_required(VERSION 3.13)
+cmake_minimum_required(VERSION 3.26)
 
 # CMake invokes the toolchain file twice during the first build, but only once
 # during subsequent rebuilds. This was causing the various flags to be added
diff --git a/build_tools/cmake/linux_riscv32.cmake b/build_tools/cmake/linux_riscv32.cmake
index 37a3cbd..72965fe 100644
--- a/build_tools/cmake/linux_riscv32.cmake
+++ b/build_tools/cmake/linux_riscv32.cmake
@@ -4,7 +4,7 @@
 # See https://llvm.org/LICENSE.txt for license information.
 # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
-cmake_minimum_required(VERSION 3.13)
+cmake_minimum_required(VERSION 3.26)
 
 # CMake invokes the toolchain file twice during the first build, but only once
 # during subsequent rebuilds. This was causing the various flags to be added
diff --git a/build_tools/cmake/linux_riscv64.cmake b/build_tools/cmake/linux_riscv64.cmake
index bd0e3ce..c7a95f4 100644
--- a/build_tools/cmake/linux_riscv64.cmake
+++ b/build_tools/cmake/linux_riscv64.cmake
@@ -4,7 +4,7 @@
 # See https://llvm.org/LICENSE.txt for license information.
 # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
-cmake_minimum_required(VERSION 3.13)
+cmake_minimum_required(VERSION 3.26)
 
 # CMake invokes the toolchain file twice during the first build, but only once
 # during subsequent rebuilds. This was causing the various flags to be added
diff --git a/build_tools/github_actions/ci_requirements.txt b/build_tools/github_actions/ci_requirements.txt
index 9f707f1..5648db8 100644
--- a/build_tools/github_actions/ci_requirements.txt
+++ b/build_tools/github_actions/ci_requirements.txt
@@ -1,5 +1,5 @@
 # In addition to runtime/bindings/python/iree/runtime/build_requirements.txt.
 # Ensure a recent cmake
-cmake>=3.18.4
+cmake>=3.26
 ninja
 packaging
diff --git a/build_tools/third_party/tracy/CMakeLists.txt b/build_tools/third_party/tracy/CMakeLists.txt
index 9a7148e..61b7a81 100644
--- a/build_tools/third_party/tracy/CMakeLists.txt
+++ b/build_tools/third_party/tracy/CMakeLists.txt
@@ -4,7 +4,7 @@
 # See https://llvm.org/LICENSE.txt for license information.
 # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
-cmake_minimum_required(VERSION 3.16.3)
+cmake_minimum_required(VERSION 3.26)
 
 project(IREETracyServer C CXX)
 
diff --git a/integrations/pjrt/CMakeLists.txt b/integrations/pjrt/CMakeLists.txt
index 8f54ed6..fd7242a 100644
--- a/integrations/pjrt/CMakeLists.txt
+++ b/integrations/pjrt/CMakeLists.txt
@@ -4,7 +4,7 @@
 # See https://llvm.org/LICENSE.txt for license information.
 # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
-cmake_minimum_required(VERSION 3.21...3.24)
+cmake_minimum_required(VERSION 3.26...3.29)
 
 project(IREE_PJRT)
 cmake_policy(SET CMP0069 NEW)