[llvm] [CMake] Add dependent project mode for Flang's MLIR (PR #221724)

Mehdi Amini via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 7 06:15:14 PDT 2026


https://github.com/joker-eph created https://github.com/llvm/llvm-project/pull/221724

LLVM_ENABLE_PROJECTS currently treats projects enabled to satisfy another project's dependency the same as projects selected by the user. As a result, enabling Flang pulls the entire MLIR project, install rules, and test suites into aggregate targets.

Track implicitly configured projects in LLVM_DEPENDENT_PROJECTS and pass EXCLUDE_FROM_ALL when adding their source directories. This leaves all MLIR targets available for Flang's normal dependency resolution without attaching the MLIR-wide target to the default build or install.

Also force MLIR_INCLUDE_TESTS off when MLIR is pulled in by Flang. This avoids registering MLIR unit tests and lit suites with check-all. Explicitly listing mlir continues to use existing behavior and honors MLIR_INCLUDE_TESTS.

Assisted-by: Codex

>From 922d73fceb82db5f3b2eed970a365f8f280823c8 Mon Sep 17 00:00:00 2001
From: Mehdi Amini <joker.eph at gmail.com>
Date: Mon, 7 Sep 2026 06:11:56 -0700
Subject: [PATCH] [CMake] Add dependent project mode for Flang's MLIR

LLVM_ENABLE_PROJECTS currently treats projects enabled to satisfy another
project's dependency the same as projects selected by the user. As a result,
enabling Flang pulls the entire MLIR project, install rules, and test suites
into aggregate targets.

Track implicitly configured projects in LLVM_DEPENDENT_PROJECTS and pass
EXCLUDE_FROM_ALL when adding their source directories. This leaves all MLIR
targets available for Flang's normal dependency resolution without attaching
the MLIR-wide target to the default build or install.

Also force MLIR_INCLUDE_TESTS off when MLIR is pulled in by Flang. This avoids
registering MLIR unit tests and lit suites with check-all. Explicitly listing
mlir continues to use existing behavior and honors MLIR_INCLUDE_TESTS.

Assisted-by: Codex
---
 llvm/CMakeLists.txt              | 8 ++++++++
 llvm/cmake/modules/AddLLVM.cmake | 9 +++++++--
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
index 44299d51d784a..73a1d71c09ce0 100644
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -146,6 +146,10 @@ set(LLVM_EXTRA_PROJECTS "flang" "libc" "compiler-rt")
 set(LLVM_KNOWN_PROJECTS "${LLVM_ALL_PROJECTS};${LLVM_EXTRA_PROJECTS}")
 set(LLVM_ENABLE_PROJECTS "" CACHE STRING
     "Semicolon-separated list of projects to build (${LLVM_KNOWN_PROJECTS}), or \"all\".")
+# Projects that are configured only to satisfy another project's dependencies.
+# Their targets are available to the build but are excluded from the default
+# build and install.
+set(LLVM_DEPENDENT_PROJECTS "")
 # Make sure expansion happens first to not handle "all" in rest of the checks.
 if( LLVM_ENABLE_PROJECTS STREQUAL "all" )
   set( LLVM_ENABLE_PROJECTS ${LLVM_ALL_PROJECTS})
@@ -187,6 +191,10 @@ if ("flang" IN_LIST LLVM_ENABLE_PROJECTS)
   if (NOT "mlir" IN_LIST LLVM_ENABLE_PROJECTS)
     message(STATUS "Enabling MLIR as a dependency to flang")
     list(APPEND LLVM_ENABLE_PROJECTS "mlir")
+    list(APPEND LLVM_DEPENDENT_PROJECTS "mlir")
+    # MLIR's tests register themselves with check-all. Do not include them when
+    # MLIR is configured only to satisfy Flang's dependencies.
+    set(MLIR_INCLUDE_TESTS OFF)
   endif()
 
   if (NOT "clang" IN_LIST LLVM_ENABLE_PROJECTS)
diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake
index a267166eb6c2d..7d951d499e34a 100644
--- a/llvm/cmake/modules/AddLLVM.cmake
+++ b/llvm/cmake/modules/AddLLVM.cmake
@@ -1762,6 +1762,9 @@ function(add_llvm_subdirectory project type name)
   if("${add_llvm_external_dir}" STREQUAL "")
     set(add_llvm_external_dir ${name})
   endif()
+  if("${name}" IN_LIST LLVM_DEPENDENT_PROJECTS)
+    set(exclude_from_all EXCLUDE_FROM_ALL)
+  endif()
   canonicalize_tool_name(${name} nameUPPER)
   set(canonical_full_name ${project}_${type}_${nameUPPER})
   get_property(already_processed GLOBAL PROPERTY ${canonical_full_name}_PROCESSED)
@@ -1776,7 +1779,8 @@ function(add_llvm_subdirectory project type name)
            "Whether to build ${name} as part of ${project}" On)
     mark_as_advanced(${project}_${type}_${name}_BUILD)
     if(${canonical_full_name}_BUILD)
-      add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir} ${add_llvm_external_dir})
+      add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}
+                       ${add_llvm_external_dir} ${exclude_from_all})
     endif()
   else()
     set(LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR
@@ -1794,7 +1798,8 @@ function(add_llvm_subdirectory project type name)
       ${${canonical_full_name}_BUILD_DEFAULT})
     if (${canonical_full_name}_BUILD)
       if(EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR})
-        add_subdirectory(${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR} ${add_llvm_external_dir})
+        add_subdirectory(${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}
+                         ${add_llvm_external_dir} ${exclude_from_all})
       elseif(NOT "${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}" STREQUAL "")
         message(WARNING "Nonexistent directory for ${name}: ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}")
       endif()



More information about the llvm-commits mailing list