[Mlir-commits] [clang] [llvm] [mlir] [MLIR][CMake] Model transitive generated header dependencies (PR #222170)

Mehdi Amini llvmlistbot at llvm.org
Tue Sep 8 15:48:04 PDT 2026


https://github.com/joker-eph updated https://github.com/llvm/llvm-project/pull/222170

>From d6c8601aad52dec0cffc091e00f1f1fec5379263 Mon Sep 17 00:00:00 2001
From: Mehdi Amini <joker.eph at gmail.com>
Date: Tue, 8 Sep 2026 12:04:07 -0700
Subject: [PATCH] [MLIR][CMake] Model transitive generated header dependencies

MLIR libraries currently depend on broad header aggregates and repeat private
TableGen targets such as *IncGen in DEPENDS. This serializes unrelated
generation, masks missing transitive edges, and can leave object compilation
unordered when a private link dependency provides a generated header.

Record each TableGen target's exact outputs at its generation site and resolve
logical ownership after the complete CMake graph exists. Conventional target
and dialect names cover the common case; ordered candidates select one owner,
unique mirrored directories provide a fallback, and OWNER handles exceptional
mixed layouts. This makes generator and library declaration order equivalent
without associating every generator in a shared directory with every library.

Model header usage through LINK_LIBS and HEADER_LIBS with PUBLIC, PRIVATE, and
INTERFACE semantics. Resolve target names hidden in generator expressions
conservatively, and accept imported providers because installed generated
headers need no build-tree ordering. CMake 3.28 uses CMP0154 header file sets;
older versions retain documented custom-target fallbacks with TODOs for
removal once LLVM requires CMake 3.28.

Preserve LLVM's public-only whole-library ordering while following private and
legacy-unqualified public link closures for generated-header carriers and
explicit custom prerequisites only. This keeps non-MLIR consumers correct
without serializing their object compilation behind compiled provider
libraries.

Remove duplicated generated-target dependencies while retaining true source
generation and build-order edges. Require each HEADER_LIBS use to document
the source include that needs it, and add an MLIR CMake Infrastructure guide
covering libraries, dialects, interfaces, generated files, and validation.

Validate from a new Ninja build directory whenever practical. If reusing a
directory, first run `ninja -C <build> -t clean`, then rerun CMake so the
initial Ninja graph contains only dependencies expressed by the current
configuration.

Before building a broad aggregate, build representative leaf targets in
parallel, for example:

  cmake --build <build> --target MLIRArmNeonDialect \
    MLIRLinalgDialect --parallel 32

This exposes first-build races that an aggregate may hide by generating
headers incidentally.

Next build `check-mlir` and `MLIRUnitTests` to test MLIR and populate compiler
depfiles. Only after that successful build, run
`ninja -C <build> -t missingdeps`; the tool needs populated depfiles to
compare generated-file producers with observed include relationships.

When compatibility or package-export behavior changes, repeat the sequence
with CMake older than 3.28 and with an empty out-of-tree standalone build.

Assisted-by: Codex
---
 clang/lib/CIR/Dialect/IR/CMakeLists.txt       |   2 +-
 clang/lib/CIR/Interfaces/CMakeLists.txt       |   2 +
 llvm/cmake/modules/AddLLVM.cmake              | 182 +++-
 mlir/cmake/modules/AddMLIR.cmake              | 796 +++++++++++++++++-
 mlir/docs/CMakeInfrastructure.md              | 391 +++++++++
 .../DefiningDialects/AttributesAndTypes.md    |   7 +-
 mlir/docs/Tutorials/CreatingADialect.md       |  68 +-
 mlir/docs/Tutorials/QuickstartRewrites.md     |   9 +-
 mlir/docs/Tutorials/transform/Ch2.md          |   9 +-
 .../include/Standalone/CMakeLists.txt         |   2 +-
 .../standalone/lib/Standalone/CMakeLists.txt  |   4 -
 .../transform/Ch2/include/CMakeLists.txt      |   2 +-
 .../examples/transform/Ch2/lib/CMakeLists.txt |   4 -
 .../transform/Ch3/include/CMakeLists.txt      |   2 +-
 .../examples/transform/Ch3/lib/CMakeLists.txt |   4 -
 .../transform/Ch4/include/CMakeLists.txt      |   2 +-
 .../examples/transform/Ch4/lib/CMakeLists.txt |   4 -
 .../mlir/Dialect/GPU/IR/CMakeLists.txt        |  18 +-
 .../mlir/Dialect/LLVMIR/CMakeLists.txt        |  41 +-
 .../mlir/Dialect/Ptr/IR/CMakeLists.txt        |   8 +-
 .../Dialect/SPIRV/Transforms/CMakeLists.txt   |   3 +-
 .../Transform/SMTExtension/CMakeLists.txt     |   3 +-
 .../Dialect/XeGPU/TransformOps/CMakeLists.txt |   3 +-
 mlir/include/mlir/IR/CMakeLists.txt           |   2 +-
 mlir/include/mlir/Interfaces/CMakeLists.txt   |   2 +-
 .../include/mlir/Target/LLVMIR/CMakeLists.txt |   6 +-
 mlir/lib/CAPI/Conversion/CMakeLists.txt       |   3 -
 mlir/lib/CAPI/Dialect/CMakeLists.txt          |  32 -
 .../Conversion/AMDGPUToROCDL/CMakeLists.txt   |   3 -
 .../AffineToStandard/CMakeLists.txt           |   3 -
 .../ArithAndMathToAPFloat/CMakeLists.txt      |   6 -
 .../Conversion/ArithToAMDGPU/CMakeLists.txt   |   3 -
 .../Conversion/ArithToArmSME/CMakeLists.txt   |   3 -
 .../Conversion/ArithToEmitC/CMakeLists.txt    |   3 -
 .../lib/Conversion/ArithToLLVM/CMakeLists.txt |   3 -
 .../Conversion/ArithToSPIRV/CMakeLists.txt    |   3 -
 .../Conversion/ArmNeon2dToIntr/CMakeLists.txt |   3 -
 .../Conversion/ArmSMEToLLVM/CMakeLists.txt    |   3 -
 .../lib/Conversion/ArmSMEToSCF/CMakeLists.txt |   3 -
 .../lib/Conversion/AsyncToLLVM/CMakeLists.txt |   3 -
 .../BufferizationToMemRef/CMakeLists.txt      |   3 -
 .../Conversion/ComplexToLLVM/CMakeLists.txt   |   3 -
 .../Conversion/ComplexToLibm/CMakeLists.txt   |   3 -
 .../ComplexToROCDLLibraryCalls/CMakeLists.txt |   3 -
 .../Conversion/ComplexToSPIRV/CMakeLists.txt  |   3 -
 .../ComplexToStandard/CMakeLists.txt          |   3 -
 .../ControlFlowToLLVM/CMakeLists.txt          |   1 -
 .../ControlFlowToSCF/CMakeLists.txt           |   3 -
 .../ControlFlowToSPIRV/CMakeLists.txt         |   3 -
 .../Conversion/ConvertToEmitC/CMakeLists.txt  |   4 -
 .../Conversion/ConvertToLLVM/CMakeLists.txt   |   6 -
 .../lib/Conversion/FuncToEmitC/CMakeLists.txt |   3 -
 mlir/lib/Conversion/FuncToLLVM/CMakeLists.txt |   1 -
 .../lib/Conversion/FuncToSPIRV/CMakeLists.txt |   3 -
 mlir/lib/Conversion/GPUCommon/CMakeLists.txt  |   1 -
 .../Conversion/GPUToLLVMSPV/CMakeLists.txt    |   3 -
 mlir/lib/Conversion/GPUToNVVM/CMakeLists.txt  |   3 -
 mlir/lib/Conversion/GPUToROCDL/CMakeLists.txt |   7 +-
 mlir/lib/Conversion/GPUToSPIRV/CMakeLists.txt |   3 -
 .../lib/Conversion/IndexToLLVM/CMakeLists.txt |   3 -
 .../Conversion/IndexToSPIRV/CMakeLists.txt    |   3 -
 .../LinalgToStandard/CMakeLists.txt           |   3 -
 mlir/lib/Conversion/MPIToLLVM/CMakeLists.txt  |   3 -
 .../lib/Conversion/MathToEmitC/CMakeLists.txt |   3 -
 .../lib/Conversion/MathToFuncs/CMakeLists.txt |   3 -
 mlir/lib/Conversion/MathToLLVM/CMakeLists.txt |   3 -
 mlir/lib/Conversion/MathToLibm/CMakeLists.txt |   3 -
 mlir/lib/Conversion/MathToNVVM/CMakeLists.txt |   3 -
 .../lib/Conversion/MathToROCDL/CMakeLists.txt |   3 -
 .../lib/Conversion/MathToSPIRV/CMakeLists.txt |   3 -
 mlir/lib/Conversion/MathToXeVM/CMakeLists.txt |   3 -
 .../Conversion/MemRefToEmitC/CMakeLists.txt   |   3 -
 .../Conversion/MemRefToLLVM/CMakeLists.txt    |   3 -
 .../Conversion/MemRefToSPIRV/CMakeLists.txt   |   3 -
 .../lib/Conversion/NVGPUToNVVM/CMakeLists.txt |   3 -
 mlir/lib/Conversion/NVVMToLLVM/CMakeLists.txt |   3 -
 .../Conversion/OpenACCToLLVM/CMakeLists.txt   |   3 -
 .../Conversion/OpenACCToSCF/CMakeLists.txt    |   3 -
 .../Conversion/OpenMPToLLVM/CMakeLists.txt    |   1 -
 .../Conversion/PDLToPDLInterp/CMakeLists.txt  |   3 -
 mlir/lib/Conversion/PtrToLLVM/CMakeLists.txt  |   3 -
 mlir/lib/Conversion/RaiseWasm/CMakeLists.txt  |   3 -
 .../ReconcileUnrealizedCasts/CMakeLists.txt   |   3 -
 .../lib/Conversion/SCFToAffine/CMakeLists.txt |   3 -
 .../SCFToControlFlow/CMakeLists.txt           |   3 -
 mlir/lib/Conversion/SCFToEmitC/CMakeLists.txt |   3 -
 mlir/lib/Conversion/SCFToGPU/CMakeLists.txt   |   3 -
 .../lib/Conversion/SCFToOpenMP/CMakeLists.txt |   3 -
 mlir/lib/Conversion/SCFToSPIRV/CMakeLists.txt |   3 -
 .../lib/Conversion/SPIRVCommon/CMakeLists.txt |   5 +-
 .../lib/Conversion/SPIRVToLLVM/CMakeLists.txt |   1 -
 .../Conversion/ShapeToStandard/CMakeLists.txt |   6 +-
 mlir/lib/Conversion/ShardToMPI/CMakeLists.txt |   3 -
 .../Conversion/TensorToLinalg/CMakeLists.txt  |   3 -
 .../Conversion/TensorToSPIRV/CMakeLists.txt   |   3 -
 .../lib/Conversion/TosaToArith/CMakeLists.txt |   3 -
 .../Conversion/TosaToLinalg/CMakeLists.txt    |   3 -
 .../Conversion/TosaToMLProgram/CMakeLists.txt |   3 -
 mlir/lib/Conversion/TosaToSCF/CMakeLists.txt  |   3 -
 .../Conversion/TosaToSPIRVTosa/CMakeLists.txt |   3 -
 .../Conversion/TosaToTensor/CMakeLists.txt    |   3 -
 mlir/lib/Conversion/UBToLLVM/CMakeLists.txt   |   3 -
 mlir/lib/Conversion/UBToSPIRV/CMakeLists.txt  |   3 -
 .../lib/Conversion/VectorToAMX/CMakeLists.txt |   3 -
 .../Conversion/VectorToArmSME/CMakeLists.txt  |   3 -
 .../Conversion/VectorToLLVM/CMakeLists.txt    |   1 -
 .../Conversion/VectorToSPIRV/CMakeLists.txt   |   1 -
 .../Conversion/VectorToXeGPU/CMakeLists.txt   |   3 -
 .../lib/Conversion/XeGPUToXeVM/CMakeLists.txt |   3 -
 mlir/lib/Conversion/XeVMToLLVM/CMakeLists.txt |   3 -
 mlir/lib/Dialect/AMDGPU/IR/CMakeLists.txt     |   5 -
 .../Dialect/AMDGPU/Transforms/CMakeLists.txt  |   3 -
 .../Dialect/Affine/Analysis/CMakeLists.txt    |   3 -
 mlir/lib/Dialect/Affine/IR/CMakeLists.txt     |   4 -
 .../Affine/TransformOps/CMakeLists.txt        |   3 -
 .../Dialect/Affine/Transforms/CMakeLists.txt  |   5 -
 mlir/lib/Dialect/Arith/IR/CMakeLists.txt      |   8 +-
 .../Dialect/Arith/Transforms/CMakeLists.txt   |   3 -
 mlir/lib/Dialect/ArmNeon/IR/CMakeLists.txt    |   7 +-
 .../ArmNeon/TransformOps/CMakeLists.txt       |   3 -
 .../Dialect/ArmNeon/Transforms/CMakeLists.txt |   3 -
 mlir/lib/Dialect/ArmSME/IR/CMakeLists.txt     |   4 -
 .../Dialect/ArmSME/Transforms/CMakeLists.txt  |   3 -
 mlir/lib/Dialect/ArmSVE/IR/CMakeLists.txt     |   3 -
 .../ArmSVE/TransformOps/CMakeLists.txt        |   3 -
 .../Dialect/ArmSVE/Transforms/CMakeLists.txt  |   4 -
 mlir/lib/Dialect/Async/IR/CMakeLists.txt      |   3 -
 .../Dialect/Async/Transforms/CMakeLists.txt   |   3 -
 .../Dialect/Bufferization/IR/CMakeLists.txt   |   5 -
 .../Bufferization/TransformOps/CMakeLists.txt |   3 -
 .../Bufferization/Transforms/CMakeLists.txt   |   4 -
 mlir/lib/Dialect/Complex/IR/CMakeLists.txt    |   6 +-
 .../lib/Dialect/ControlFlow/IR/CMakeLists.txt |   7 +-
 mlir/lib/Dialect/DLTI/CMakeLists.txt          |   3 -
 .../Dialect/DLTI/TransformOps/CMakeLists.txt  |   4 -
 mlir/lib/Dialect/EmitC/IR/CMakeLists.txt      |   4 -
 .../Dialect/EmitC/Transforms/CMakeLists.txt   |   3 -
 .../Dialect/Func/Extensions/CMakeLists.txt    |   4 +
 mlir/lib/Dialect/Func/IR/CMakeLists.txt       |   6 +-
 .../Dialect/Func/TransformOps/CMakeLists.txt  |   3 -
 .../Dialect/Func/Transforms/CMakeLists.txt    |   3 -
 mlir/lib/Dialect/GPU/CMakeLists.txt           |  11 -
 .../Dialect/GPU/TransformOps/CMakeLists.txt   |   5 -
 mlir/lib/Dialect/IRDL/CMakeLists.txt          |   5 -
 mlir/lib/Dialect/Index/IR/CMakeLists.txt      |   5 +-
 mlir/lib/Dialect/LLVMIR/CMakeLists.txt        |  39 +-
 .../Dialect/LLVMIR/Transforms/CMakeLists.txt  |   3 -
 mlir/lib/Dialect/Linalg/IR/CMakeLists.txt     |   9 -
 .../Linalg/TransformOps/CMakeLists.txt        |   5 -
 .../Dialect/Linalg/Transforms/CMakeLists.txt  |   3 -
 mlir/lib/Dialect/MLProgram/IR/CMakeLists.txt  |   5 -
 .../MLProgram/Transforms/CMakeLists.txt       |   3 -
 mlir/lib/Dialect/MPI/IR/CMakeLists.txt        |   6 -
 mlir/lib/Dialect/Math/IR/CMakeLists.txt       |   5 +-
 .../Dialect/Math/Transforms/CMakeLists.txt    |   3 -
 mlir/lib/Dialect/MemRef/IR/CMakeLists.txt     |   4 -
 .../MemRef/TransformOps/CMakeLists.txt        |   3 -
 .../Dialect/MemRef/Transforms/CMakeLists.txt  |   3 -
 mlir/lib/Dialect/NVGPU/IR/CMakeLists.txt      |   6 -
 .../Dialect/NVGPU/TransformOps/CMakeLists.txt |   3 -
 .../Dialect/NVGPU/Transforms/CMakeLists.txt   |   3 -
 .../Dialect/NVVM/Transforms/CMakeLists.txt    |   3 -
 mlir/lib/Dialect/OpenACC/IR/CMakeLists.txt    |   8 -
 .../Dialect/OpenACC/Transforms/CMakeLists.txt |   9 -
 mlir/lib/Dialect/OpenACC/Utils/CMakeLists.txt |   9 -
 .../OpenACCMPCommon/Interfaces/CMakeLists.txt |   4 -
 mlir/lib/Dialect/OpenMP/IR/CMakeLists.txt     |   3 -
 .../Dialect/OpenMP/Transforms/CMakeLists.txt  |   4 -
 mlir/lib/Dialect/PDL/IR/CMakeLists.txt        |   3 -
 mlir/lib/Dialect/PDLInterp/IR/CMakeLists.txt  |   3 -
 mlir/lib/Dialect/Ptr/IR/CMakeLists.txt        |  12 +-
 mlir/lib/Dialect/Quant/IR/CMakeLists.txt      |   6 +-
 .../Dialect/Quant/Transforms/CMakeLists.txt   |   3 -
 mlir/lib/Dialect/SCF/IR/CMakeLists.txt        |   3 -
 .../Dialect/SCF/TransformOps/CMakeLists.txt   |   3 -
 .../lib/Dialect/SCF/Transforms/CMakeLists.txt |   3 -
 mlir/lib/Dialect/SMT/IR/CMakeLists.txt        |   9 -
 mlir/lib/Dialect/SPIRV/IR/CMakeLists.txt      |  16 +-
 .../Dialect/SPIRV/Interfaces/CMakeLists.txt   |   3 -
 .../Dialect/SPIRV/Transforms/CMakeLists.txt   |   3 -
 mlir/lib/Dialect/Shape/IR/CMakeLists.txt      |   3 -
 .../Dialect/Shape/Transforms/CMakeLists.txt   |  12 +-
 mlir/lib/Dialect/Shard/IR/CMakeLists.txt      |   5 +-
 .../Dialect/Shard/Interfaces/CMakeLists.txt   |   3 -
 .../Dialect/Shard/Transforms/CMakeLists.txt   |   4 +-
 .../Dialect/SparseTensor/IR/CMakeLists.txt    |   7 +-
 .../SparseTensor/TransformOps/CMakeLists.txt  |   3 -
 .../SparseTensor/Transforms/CMakeLists.txt    |   3 -
 mlir/lib/Dialect/Tensor/IR/CMakeLists.txt     |   3 -
 .../Tensor/TransformOps/CMakeLists.txt        |   3 -
 .../Dialect/Tensor/Transforms/CMakeLists.txt  |   3 -
 mlir/lib/Dialect/Tosa/CMakeLists.txt          |   8 -
 .../Dialect/Tosa/Transforms/CMakeLists.txt    |   3 -
 .../Transform/DebugExtension/CMakeLists.txt   |   3 -
 .../Transform/IRDLExtension/CMakeLists.txt    |   3 -
 .../Transform/Interfaces/CMakeLists.txt       |   4 -
 .../Transform/LoopExtension/CMakeLists.txt    |   3 -
 .../Transform/PDLExtension/CMakeLists.txt     |   3 -
 .../Transform/SMTExtension/CMakeLists.txt     |   3 -
 .../Transform/Transforms/CMakeLists.txt       |   3 -
 .../Transform/TuneExtension/CMakeLists.txt    |   3 -
 mlir/lib/Dialect/UB/IR/CMakeLists.txt         |   6 +-
 mlir/lib/Dialect/Utils/CMakeLists.txt         |   4 +-
 mlir/lib/Dialect/Vector/IR/CMakeLists.txt     |   6 -
 .../Dialect/Vector/Interfaces/CMakeLists.txt  |   3 -
 .../Vector/TransformOps/CMakeLists.txt        |   3 -
 .../Dialect/Vector/Transforms/CMakeLists.txt  |   3 -
 mlir/lib/Dialect/WasmSSA/IR/CMakeLists.txt    |   4 -
 mlir/lib/Dialect/X86/IR/CMakeLists.txt        |   3 -
 .../Dialect/X86/TransformOps/CMakeLists.txt   |   3 -
 mlir/lib/Dialect/XeGPU/IR/CMakeLists.txt      |   6 -
 .../Dialect/XeGPU/TransformOps/CMakeLists.txt |   3 -
 .../Dialect/XeGPU/Transforms/CMakeLists.txt   |   3 -
 mlir/lib/IR/CMakeLists.txt                    |  22 -
 mlir/lib/Interfaces/CMakeLists.txt            |  26 +-
 mlir/lib/Interfaces/Utils/CMakeLists.txt      |   3 -
 mlir/lib/Reducer/CMakeLists.txt               |   3 -
 mlir/lib/Rewrite/CMakeLists.txt               |   8 +-
 mlir/lib/Target/LLVMIR/CMakeLists.txt         |   3 -
 .../LLVMIR/Dialect/ArmNeon/CMakeLists.txt     |   3 -
 .../LLVMIR/Dialect/ArmSME/CMakeLists.txt      |   3 -
 .../LLVMIR/Dialect/ArmSVE/CMakeLists.txt      |   3 -
 .../Target/LLVMIR/Dialect/NVVM/CMakeLists.txt |   3 -
 .../LLVMIR/Dialect/ROCDL/CMakeLists.txt       |   3 -
 .../Target/LLVMIR/Dialect/VCIX/CMakeLists.txt |   3 -
 .../Target/LLVMIR/Dialect/XeVM/CMakeLists.txt |   3 -
 .../Target/LLVMIR/Transforms/CMakeLists.txt   |   3 -
 mlir/lib/Target/SPIRV/CMakeLists.txt          |   4 +
 .../SPIRV/Deserialization/CMakeLists.txt      |   3 -
 .../Target/SPIRV/Serialization/CMakeLists.txt |   3 -
 mlir/lib/Transforms/CMakeLists.txt            |   4 -
 mlir/test/lib/Dialect/Test/CMakeLists.txt     |  24 +-
 mlir/test/lib/Dialect/Tosa/CMakeLists.txt     |   5 +-
 .../test/lib/Dialect/Transform/CMakeLists.txt |   5 +-
 .../Interfaces/TilingInterface/CMakeLists.txt |   6 +-
 mlir/test/lib/Tools/PDLL/CMakeLists.txt       |   3 -
 mlir/test/lib/Transforms/CMakeLists.txt       |  10 +-
 mlir/test/python/CMakeLists.txt               |   2 +-
 mlir/test/python/lib/CMakeLists.txt           |   6 -
 mlir/unittests/CMakeLists.txt                 |   6 +-
 mlir/unittests/IR/CMakeLists.txt              |   5 +-
 mlir/unittests/Interfaces/CMakeLists.txt      |   5 +-
 mlir/unittests/Parser/CMakeLists.txt          |   5 +-
 243 files changed, 1588 insertions(+), 949 deletions(-)
 create mode 100644 mlir/docs/CMakeInfrastructure.md

diff --git a/clang/lib/CIR/Dialect/IR/CMakeLists.txt b/clang/lib/CIR/Dialect/IR/CMakeLists.txt
index c8205ebeabf6c..0274005a28858 100644
--- a/clang/lib/CIR/Dialect/IR/CMakeLists.txt
+++ b/clang/lib/CIR/Dialect/IR/CMakeLists.txt
@@ -20,6 +20,6 @@ add_clang_library(MLIRCIR
   MLIRDataLayoutInterfaces
   MLIRFuncDialect
   MLIRLoopLikeInterface
-  MLIRCIRInterfaces
+  MLIRPtrMemorySpaceInterfaces
   clangAST
   )
diff --git a/clang/lib/CIR/Interfaces/CMakeLists.txt b/clang/lib/CIR/Interfaces/CMakeLists.txt
index 8eec8b05aa951..07ac666ccbac0 100644
--- a/clang/lib/CIR/Interfaces/CMakeLists.txt
+++ b/clang/lib/CIR/Interfaces/CMakeLists.txt
@@ -13,8 +13,10 @@ add_clang_library(MLIRCIRInterfaces
   MLIRCIRTypeInterfacesIncGen
   MLIRCIRLoopOpInterfaceIncGen
   MLIRCIROpInterfacesIncGen
+  MLIRCIRTypeConstraintsIncGen
 
   LINK_LIBS
   MLIRIR
+  MLIRPtrMemorySpaceInterfaces
   MLIRSupport
  )
diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake
index a267166eb6c2d..205109ef3736b 100644
--- a/llvm/cmake/modules/AddLLVM.cmake
+++ b/llvm/cmake/modules/AddLLVM.cmake
@@ -594,6 +594,159 @@ endfunction(set_windows_version_resource_properties)
 #      LLVM which means that the source resides in llvm/lib/ and it is a
 #      candidate for inclusion into libLLVM.so.
 #   )
+# Extract literal target names from a link item. CMake does not expose a
+# general generator-expression evaluator at configure time, so conservatively
+# ordering every target named by a conditional expression is the safe choice.
+function(_llvm_extract_link_dependency_targets output dependency)
+  if(NOT dependency MATCHES "\\$<")
+    set(${output} ${dependency} PARENT_SCOPE)
+    return()
+  endif()
+
+  string(REGEX MATCHALL "[A-Za-z_][A-Za-z0-9_.:+-]*" candidates
+    "${dependency}")
+  set(result)
+  foreach(candidate ${candidates})
+    if(TARGET "${candidate}")
+      list(APPEND result ${candidate})
+    endif()
+  endforeach()
+  list(REMOVE_DUPLICATES result)
+  set(${output} ${result} PARENT_SCOPE)
+endfunction()
+
+# Follow a logical library's public link interface and collect only ordering
+# targets: MLIR generated-header carriers and explicit custom prerequisites.
+# This lets non-MLIR object libraries consume generated public headers without
+# depending on every linked library's compiled objects.
+function(_llvm_collect_transitive_header_dependencies output)
+  set(queue ${ARGN})
+  set(visited)
+  set(result)
+  while(queue)
+    list(POP_FRONT queue candidate)
+    if(NOT TARGET "${candidate}")
+      continue()
+    endif()
+    get_target_property(aliased_target "${candidate}" ALIASED_TARGET)
+    if(aliased_target)
+      set(candidate ${aliased_target})
+    endif()
+    if(candidate IN_LIST visited)
+      continue()
+    endif()
+    list(APPEND visited ${candidate})
+
+    get_target_property(header_target ${candidate} MLIR_HEADER_DEP_TARGET)
+    if(header_target)
+      list(APPEND result ${header_target})
+    endif()
+
+    get_target_property(explicit_dependencies ${candidate}
+      LLVM_EXPLICIT_DEPENDENCIES)
+    foreach(dependency ${explicit_dependencies})
+      if(TARGET "${dependency}")
+        get_target_property(dependency_type ${dependency} TYPE)
+        if(dependency_type STREQUAL "UTILITY")
+          list(APPEND result ${dependency})
+        endif()
+      endif()
+    endforeach()
+
+    get_target_property(interface_links ${candidate}
+      INTERFACE_LINK_LIBRARIES)
+    foreach(link_item ${interface_links})
+      _llvm_extract_link_dependency_targets(link_targets "${link_item}")
+      list(APPEND queue ${link_targets})
+    endforeach()
+  endwhile()
+  list(REMOVE_DUPLICATES result)
+  set(${output} ${result} PARENT_SCOPE)
+endfunction()
+
+# Resolve object-library ordering after the complete target graph is known.
+# Public LINK_LIBS may contain forward references, generator expressions,
+# system libraries, or link flags, so it is not safe to call add_dependencies
+# while parsing llvm_add_library. Deferring the operation lets us select only
+# real targets without imposing whole-target ordering for private link edges.
+function(_llvm_resolve_object_link_dependencies)
+  get_property(object_libraries GLOBAL
+    PROPERTY LLVM_OBJECT_LIBRARIES_WITH_LINK_DEPENDENCIES)
+  list(REMOVE_DUPLICATES object_libraries)
+  foreach(object_library ${object_libraries})
+    get_target_property(link_dependencies ${object_library}
+      LLVM_OBJECT_LINK_DEPENDENCIES)
+    foreach(link_item ${link_dependencies})
+      _llvm_extract_link_dependency_targets(link_dependency_targets
+        "${link_item}")
+      foreach(link_dependency ${link_dependency_targets})
+        if(NOT TARGET "${link_dependency}")
+          continue()
+        endif()
+
+        get_target_property(aliased_target "${link_dependency}" ALIASED_TARGET)
+        if(aliased_target)
+          set(link_dependency ${aliased_target})
+        endif()
+
+        add_dependencies(${object_library} ${link_dependency})
+      endforeach()
+    endforeach()
+
+    # Private and legacy-unqualified link dependencies must not impose a
+    # whole-library ordering edge. When an MLIR provider publishes a precise
+    # generated-header carrier, depend on that carrier alone.
+    get_target_property(header_dependencies ${object_library}
+      LLVM_OBJECT_HEADER_LINK_DEPENDENCIES)
+    foreach(link_item ${header_dependencies})
+      _llvm_extract_link_dependency_targets(link_dependency_targets
+        "${link_item}")
+      foreach(link_dependency ${link_dependency_targets})
+        if(NOT TARGET "${link_dependency}")
+          continue()
+        endif()
+        get_target_property(aliased_target "${link_dependency}" ALIASED_TARGET)
+        if(aliased_target)
+          set(link_dependency ${aliased_target})
+        endif()
+        _llvm_collect_transitive_header_dependencies(ordering_targets
+          ${link_dependency})
+        foreach(ordering_target ${ordering_targets})
+          get_target_property(ordering_type ${ordering_target} TYPE)
+          if(ordering_type STREQUAL "INTERFACE_LIBRARY")
+            target_link_libraries(${object_library} PRIVATE
+              "$<BUILD_LOCAL_INTERFACE:${ordering_target}>")
+          else()
+            add_dependencies(${object_library} ${ordering_target})
+          endif()
+        endforeach()
+      endforeach()
+    endforeach()
+  endforeach()
+endfunction()
+
+function(_llvm_defer_object_link_dependencies object_library)
+  cmake_parse_arguments(ARG "" "" "TARGETS;HEADER_TARGETS" ${ARGN})
+  set_property(GLOBAL APPEND PROPERTY
+    LLVM_OBJECT_LIBRARIES_WITH_LINK_DEPENDENCIES ${object_library})
+  set_property(TARGET ${object_library} APPEND PROPERTY
+    LLVM_OBJECT_LINK_DEPENDENCIES ${ARG_TARGETS})
+  set_property(TARGET ${object_library} APPEND PROPERTY
+    LLVM_OBJECT_HEADER_LINK_DEPENDENCIES ${ARG_HEADER_TARGETS})
+
+  get_property(resolution_scheduled GLOBAL
+    PROPERTY LLVM_OBJECT_LINK_DEPENDENCY_RESOLUTION_SCHEDULED)
+  if(NOT resolution_scheduled)
+    # CMake 3.20, LLVM's minimum supported version, supports deferred calls.
+    # Schedule at the source root so sibling projects and forward-referenced
+    # targets have all been declared when dependencies are resolved.
+    cmake_language(DEFER DIRECTORY "${CMAKE_SOURCE_DIR}"
+      CALL _llvm_resolve_object_link_dependencies)
+    set_property(GLOBAL PROPERTY
+      LLVM_OBJECT_LINK_DEPENDENCY_RESOLUTION_SCHEDULED TRUE)
+  endif()
+endfunction()
+
 function(llvm_add_library name)
   cmake_parse_arguments(ARG
     "MODULE;SHARED;STATIC;OBJECT;DISABLE_LLVM_LINK_LLVM_DYLIB;SONAME;NO_INSTALL_RPATH;COMPONENT_LIB;DISABLE_PCH_REUSE"
@@ -674,25 +827,24 @@ function(llvm_add_library name)
     if(ARG_DEPENDS)
       add_dependencies(${obj_name} ${ARG_DEPENDS})
     endif()
-    # Treat link libraries like PUBLIC dependencies.  LINK_LIBS might
-    # result in generating header files.  Add a dependendency so that
-    # the generated header is created before this object library.
+    # Preserve the historical PUBLIC-only whole-target ordering. For PRIVATE
+    # and legacy-unqualified links, deferred resolution adds only generated-
+    # header carriers and explicit custom prerequisites from the public link
+    # closure, avoiding an unnecessary dependency on compiled provider objects.
     if(ARG_LINK_LIBS)
       cmake_parse_arguments(LINK_LIBS_ARG
         ""
         ""
-        "PUBLIC;PRIVATE"
+        "PUBLIC;PRIVATE;INTERFACE"
         ${ARG_LINK_LIBS})
-      foreach(link_lib ${LINK_LIBS_ARG_PUBLIC})
-        if(LLVM_PTHREAD_LIB)
-          # Can't specify a dependence on -lpthread
-          if(NOT ${link_lib} STREQUAL ${LLVM_PTHREAD_LIB})
-            add_dependencies(${obj_name} ${link_lib})
-          endif()
-        else()
-          add_dependencies(${obj_name} ${link_lib})
-        endif()
-      endforeach()
+      if(LINK_LIBS_ARG_PUBLIC OR LINK_LIBS_ARG_PRIVATE OR
+          LINK_LIBS_ARG_UNPARSED_ARGUMENTS)
+        _llvm_defer_object_link_dependencies(${obj_name}
+          TARGETS ${LINK_LIBS_ARG_PUBLIC}
+          HEADER_TARGETS
+            ${LINK_LIBS_ARG_PRIVATE}
+            ${LINK_LIBS_ARG_UNPARSED_ARGUMENTS})
+      endif()
     endif()
 
     if(ARG_DISABLE_LLVM_LINK_LLVM_DYLIB)
@@ -732,6 +884,8 @@ function(llvm_add_library name)
     add_library(${name} STATIC ${ALL_FILES})
   endif()
   set_target_properties(${name} PROPERTIES FOLDER "${subproject_title}/Libraries")
+  set_property(TARGET ${name} PROPERTY LLVM_EXPLICIT_DEPENDENCIES
+    "${ARG_DEPENDS}")
 
   ## If were compiling with clang-cl use /Zc:dllexportInlines- to exclude inline
   ## class members from being dllexport'ed to reduce compile time.
diff --git a/mlir/cmake/modules/AddMLIR.cmake b/mlir/cmake/modules/AddMLIR.cmake
index d3f534a02f9de..e98f56676a715 100644
--- a/mlir/cmake/modules/AddMLIR.cmake
+++ b/mlir/cmake/modules/AddMLIR.cmake
@@ -4,7 +4,10 @@ include(LLVMDistributionSupport)
 
 function(mlir_tablegen ofn)
   tablegen(MLIR ${ARGV})
-  set(TABLEGEN_OUTPUT ${TABLEGEN_OUTPUT} ${CMAKE_CURRENT_BINARY_DIR}/${ofn}
+  set(output "${CMAKE_CURRENT_BINARY_DIR}/${ofn}")
+  set_property(DIRECTORY APPEND PROPERTY
+    MLIR_UNCLAIMED_TABLEGEN_OUTPUTS "${output}")
+  set(TABLEGEN_OUTPUT ${TABLEGEN_OUTPUT} ${output}
       PARENT_SCOPE)
 endfunction()
 
@@ -115,7 +118,10 @@ function(add_mlir_pdll_library target inputFile ofn)
   set(LLVM_TARGET_DEFINITIONS ${inputFile})
 
   _pdll_tablegen(MLIR_PDLL ${ofn} -x=cpp ${ARGN})
-  set(TABLEGEN_OUTPUT ${TABLEGEN_OUTPUT} ${CMAKE_CURRENT_BINARY_DIR}/${ofn}
+  set(output "${CMAKE_CURRENT_BINARY_DIR}/${ofn}")
+  set_property(DIRECTORY APPEND PROPERTY
+    MLIR_UNCLAIMED_TABLEGEN_OUTPUTS "${output}")
+  set(TABLEGEN_OUTPUT ${TABLEGEN_OUTPUT} ${output}
       PARENT_SCOPE)
 
   # Get the current set of include paths for this pdll file.
@@ -141,10 +147,23 @@ function(add_mlir_pdll_library target inputFile ofn)
   )
 
   add_public_tablegen_target(${target})
+  _mlir_register_tablegen_target(${target})
 endfunction()
 
-# Declare a dialect in the include directory
+# Declare a dialect in the include directory.  After removing a trailing
+# "Ops" from the TableGen stem, the generated files are associated with both
+# established library naming conventions: MLIR<Dialect>Dialect and
+# MLIR<Dialect>.  The matching target may be declared later.  OWNER handles a
+# library that follows neither convention.
 function(add_mlir_dialect dialect dialect_namespace)
+  cmake_parse_arguments(ARG "" "OWNER" "" ${ARGN})
+  if(ARG_OWNER)
+    set(owners ${ARG_OWNER})
+  else()
+    string(REGEX REPLACE "Ops$" "" owner_stem ${dialect})
+    set(owners MLIR${owner_stem}Dialect MLIR${owner_stem})
+  endif()
+
   set(LLVM_TARGET_DEFINITIONS ${dialect}.td)
   mlir_tablegen(${dialect}.h.inc -gen-op-decls)
   mlir_tablegen(${dialect}.cpp.inc -gen-op-defs)
@@ -153,6 +172,13 @@ function(add_mlir_dialect dialect dialect_namespace)
   mlir_tablegen(${dialect}Dialect.h.inc -gen-dialect-decls -dialect=${dialect_namespace})
   mlir_tablegen(${dialect}Dialect.cpp.inc -gen-dialect-defs -dialect=${dialect_namespace})
   add_mlir_dialect_tablegen_target(MLIR${dialect}IncGen)
+  foreach(owner ${owners})
+    if(ARG_OWNER)
+      _mlir_register_explicit_tablegen_owner(${owner} MLIR${dialect}IncGen)
+    else()
+      _mlir_register_tablegen_owner(${owner} MLIR${dialect}IncGen)
+    endif()
+  endforeach()
 endfunction()
 
 # Declare sharded dialect operation declarations and definitions
@@ -168,39 +194,217 @@ function(add_sharded_ops ops_target shard_count)
     set(TABLEGEN_OUTPUT ${TABLEGEN_OUTPUT} ${CMAKE_CURRENT_BINARY_DIR}/${SHARDED_SRC})
   endforeach()
   add_mlir_dialect_tablegen_target(MLIR${ops_target}ShardGen)
+  string(REGEX REPLACE "Ops$" "" owner_stem ${ops_target})
+  _mlir_register_tablegen_owner(MLIR${owner_stem}Dialect
+    MLIR${ops_target}ShardGen)
+  _mlir_register_tablegen_owner(MLIR${owner_stem}
+    MLIR${ops_target}ShardGen)
   set(SHARDED_SRCS ${SHARDED_SRCS} PARENT_SCOPE)
 endfunction()
 
-# Declare a dialect in the include directory
+# Declare an operation interface in the include directory.  OWNER may identify
+# its logical library when the include and implementation directories do not
+# mirror one another.
 function(add_mlir_interface interface)
+  cmake_parse_arguments(ARG "" "OWNER" "" ${ARGN})
+  if(ARG_OWNER)
+    set(owners ${ARG_OWNER})
+  else()
+    _mlir_infer_interface_owners(owners ${interface})
+  endif()
+
   set(LLVM_TARGET_DEFINITIONS ${interface}.td)
   mlir_tablegen(${interface}.h.inc -gen-op-interface-decls)
   mlir_tablegen(${interface}.cpp.inc -gen-op-interface-defs)
   add_mlir_generic_tablegen_target(MLIR${interface}IncGen)
+  foreach(owner ${owners})
+    if(ARG_OWNER)
+      _mlir_register_explicit_tablegen_owner(${owner}
+        MLIR${interface}IncGen)
+    else()
+      _mlir_register_tablegen_owner(${owner} MLIR${interface}IncGen)
+    endif()
+  endforeach()
+endfunction()
+
+# Associate a TableGen target with the logical library that owns its generated
+# files.  The standard helpers infer or accept this relationship at the
+# generation site, so library CMakeLists should not have to repeat a private
+# `*IncGen` target name.
+function(_mlir_register_tablegen_owner library)
+  foreach(tablegen_target ${ARGN})
+    set_property(TARGET ${tablegen_target} APPEND PROPERTY
+      MLIR_TABLEGEN_OWNERS ${library})
+  endforeach()
+  set_property(GLOBAL APPEND PROPERTY
+    MLIR_OWNED_TABLEGEN_TARGETS_${library} ${ARGN})
+endfunction()
+
+# Record a user-specified ownership assertion separately from inferred naming
+# candidates so a typo in OWNER is diagnosed instead of falling back to
+# directory inference.
+function(_mlir_register_explicit_tablegen_owner library)
+  _mlir_register_tablegen_owner(${library} ${ARGN})
+  foreach(tablegen_target ${ARGN})
+    set_property(TARGET ${tablegen_target} PROPERTY
+      MLIR_TABLEGEN_HAS_EXPLICIT_OWNER TRUE)
+  endforeach()
 endfunction()
 
+# Interfaces are commonly implemented either by a same-named library or by
+# their containing dialect. Register both conventions so most call sites need
+# no OWNER even when several logical libraries share an include directory.
+function(_mlir_infer_interface_owners output interface)
+  set(owners MLIR${interface})
+  file(RELATIVE_PATH relative_dialect_dir
+    "${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect" "${CMAKE_CURRENT_SOURCE_DIR}")
+  if(NOT relative_dialect_dir MATCHES "^\\.\\.")
+    string(REGEX MATCH "^[^/]+" dialect ${relative_dialect_dir})
+    list(APPEND owners
+      MLIR${dialect}DialectInterfaces
+      MLIR${dialect}Dialect
+      MLIR${dialect})
+  elseif(CMAKE_CURRENT_SOURCE_DIR STREQUAL "${MLIR_MAIN_INCLUDE_DIR}/mlir/IR")
+    list(APPEND owners MLIRIR)
+  endif()
+  list(REMOVE_DUPLICATES owners)
+  set(${output} ${owners} PARENT_SCOPE)
+endfunction()
+
+# Record both halves of a TableGen rule: the convenience target used by older
+# CMake versions and the files produced by its custom commands.  Libraries use
+# this metadata below to express generated-header dependencies without making
+# authors repeat implementation target names such as `*IncGen`.
+function(_mlir_register_tablegen_target target)
+  cmake_path(SET tablegen_source_dir NORMALIZE
+    "${CMAKE_CURRENT_SOURCE_DIR}")
+  string(SHA1 directory_id "${tablegen_source_dir}")
+  get_property(target_outputs DIRECTORY PROPERTY
+    MLIR_UNCLAIMED_TABLEGEN_OUTPUTS)
+  if(NOT target_outputs)
+    # Preserve compatibility for downstream code that calls tablegen()
+    # directly instead of mlir_tablegen(). Such code cannot provide precise
+    # per-target output metadata until it migrates to the MLIR wrapper.
+    set(target_outputs ${TABLEGEN_OUTPUT})
+  endif()
+  list(REMOVE_DUPLICATES target_outputs)
+  set_property(TARGET ${target} PROPERTY MLIR_TABLEGEN_OUTPUTS
+    "${target_outputs}")
+  set_property(TARGET ${target} PROPERTY MLIR_TABLEGEN_DIRECTORY_ID
+    ${directory_id})
+  set_property(GLOBAL APPEND PROPERTY MLIR_TABLEGEN_TARGETS ${target})
+  set_property(DIRECTORY PROPERTY MLIR_UNCLAIMED_TABLEGEN_OUTPUTS "")
+
+  # A generated file can only be attached reliably to its custom command from
+  # the directory in which that command was declared.  Create the CMake 3.28
+  # file-set carrier here, then let logical library targets compose it later.
+  # TODO: Remove the policy guard and always create the file-set carrier once
+  # LLVM requires CMake 3.28 or newer.
+  if(POLICY CMP0154)
+    # Policies that affect target generation are captured when the target is
+    # created, so set CMP0154 before add_library(), not just target_sources().
+    cmake_policy(PUSH)
+    cmake_policy(SET CMP0154 NEW)
+    set(generated_headers)
+    foreach(output ${target_outputs})
+      string(FIND "${output}" "${MLIR_BINARY_DIR}/include/" include_prefix)
+      if(include_prefix EQUAL 0 AND NOT output MATCHES "\\.cpp\\.inc$")
+        list(APPEND generated_headers "${output}")
+      endif()
+    endforeach()
+    set(header_target "headers.${target}")
+    add_library(${header_target} INTERFACE)
+    if(generated_headers)
+      target_sources(${header_target} INTERFACE
+        FILE_SET mlir_generated_headers TYPE HEADERS
+        BASE_DIRS "${MLIR_BINARY_DIR}/include"
+        FILES ${generated_headers})
+    endif()
+    cmake_policy(POP)
+    # Keep the public TableGen target as an explicit ordering anchor.  CMake's
+    # file set describes which generated files are public, while this edge is
+    # needed because the custom commands are owned by a custom target rather
+    # than by a compilable library target.
+    add_dependencies(${header_target} ${target})
+    set_target_properties(${header_target} PROPERTIES FOLDER
+      "MLIR/Tablegenning/Header Dependencies")
+    set_property(TARGET ${target} PROPERTY MLIR_TABLEGEN_HEADER_TARGET
+      ${header_target})
+  endif()
+
+  set_property(GLOBAL APPEND PROPERTY
+    MLIR_TABLEGEN_TARGETS_${directory_id} ${target})
+
+  # A target named MLIR<Foo>IncGen conventionally publishes headers from
+  # MLIR<Foo>. Register it as a candidate, but retain directory fallback when
+  # no such library exists.
+  if(target MATCHES "^(MLIR.+)IncGen$")
+    _mlir_register_tablegen_owner(${CMAKE_MATCH_1} ${target})
+  endif()
+endfunction()
+
+# Register a generated-file target that belongs to one logical MLIR library
+# but is not part of the global dialect or generic-header aggregates.  Keeping
+# ownership at the generation site lets the library and all of its consumers
+# use the logical target name instead of repeating this private target name.
+macro(add_mlir_library_tablegen_target target owner)
+  add_public_tablegen_target(${target})
+  _mlir_register_tablegen_target(${target})
+  _mlir_register_explicit_tablegen_owner(${owner} ${target})
+endmacro()
+
 # Add a dialect-specific tablegen target that generates headers in the include directory.
 # In most cases, this is what should be used after invoking `mlir_tablegen`.
+# OWNER may name the logical library that provides the generated files when
+# directory-based ownership inference is insufficient.
 macro(add_mlir_dialect_tablegen_target target)
+  cmake_parse_arguments(TABLEGEN_TARGET "" "OWNER" "" ${ARGN})
   add_public_tablegen_target(${target})
+  _mlir_register_tablegen_target(${target})
+  if(TABLEGEN_TARGET_OWNER)
+    _mlir_register_explicit_tablegen_owner(
+      ${TABLEGEN_TARGET_OWNER} ${target})
+  endif()
   add_dependencies(mlir-headers ${target})
 endmacro()
 
 # Add a dialect-independent tablegen target that generates headers in the include directory.
 # Generally this is used for files outside of the Dialects/ folder, and also for interfaces
 # that do not depend on dialect-specific headers.
+# OWNER has the same meaning as for add_mlir_dialect_tablegen_target().
 macro(add_mlir_generic_tablegen_target target)
+  cmake_parse_arguments(TABLEGEN_TARGET "" "OWNER" "" ${ARGN})
   add_public_tablegen_target(${target})
+  _mlir_register_tablegen_target(${target})
+  if(TABLEGEN_TARGET_OWNER)
+    _mlir_register_explicit_tablegen_owner(
+      ${TABLEGEN_TARGET_OWNER} ${target})
+  endif()
   add_dependencies(mlir-generic-headers ${target})
 endmacro()
 
-# Declare a dialect in the include directory
+# Declare a type interface in the include directory.  OWNER has the same
+# meaning as for add_mlir_interface().
 function(add_mlir_type_interface interface)
+  cmake_parse_arguments(ARG "" "OWNER" "" ${ARGN})
+  if(ARG_OWNER)
+    set(owners ${ARG_OWNER})
+  else()
+    _mlir_infer_interface_owners(owners ${interface})
+  endif()
+
   set(LLVM_TARGET_DEFINITIONS ${interface}.td)
   mlir_tablegen(${interface}.h.inc -gen-type-interface-decls)
   mlir_tablegen(${interface}.cpp.inc -gen-type-interface-defs)
-  add_public_tablegen_target(MLIR${interface}IncGen)
-  add_dependencies(mlir-generic-headers MLIR${interface}IncGen)
+  add_mlir_generic_tablegen_target(MLIR${interface}IncGen)
+  foreach(owner ${owners})
+    if(ARG_OWNER)
+      _mlir_register_explicit_tablegen_owner(${owner}
+        MLIR${interface}IncGen)
+    else()
+      _mlir_register_tablegen_owner(${owner} MLIR${interface}IncGen)
+    endif()
+  endforeach()
 endfunction()
 
 # Generate Documentation
@@ -273,13 +477,510 @@ function(_check_llvm_components_usage name)
   endforeach()
 endfunction()
 
+# Split a CMake-style dependency list while preserving its PUBLIC, PRIVATE, and
+# INTERFACE semantics.  The unqualified target_link_libraries signature is
+# transitive, so mirror that behavior here by treating unqualified entries as
+# PUBLIC.
+function(_mlir_partition_header_libraries prefix)
+  cmake_parse_arguments(PARTITION "" "" "PUBLIC;PRIVATE;INTERFACE" ${ARGN})
+  set(${prefix}_PUBLIC
+    ${PARTITION_PUBLIC}
+    ${PARTITION_UNPARSED_ARGUMENTS}
+    PARENT_SCOPE)
+  set(${prefix}_PRIVATE ${PARTITION_PRIVATE} PARENT_SCOPE)
+  set(${prefix}_INTERFACE ${PARTITION_INTERFACE} PARENT_SCOPE)
+endfunction()
+
+# LINK_LIBS may hide target names inside generator expressions. CMake does not
+# expose a general expression evaluator at configure time, so conservatively
+# collect every literal token that names an existing target. Ordering all arms
+# of a conditional expression is safe and avoids silently losing a generated-
+# header edge when a condition changes.
+function(_mlir_expand_header_provider_candidates output provider)
+  if(NOT provider MATCHES "\\$<")
+    set(${output} ${provider} PARENT_SCOPE)
+    return()
+  endif()
+
+  string(REGEX MATCHALL "[A-Za-z_][A-Za-z0-9_.:+-]*" candidates
+    "${provider}")
+  set(result)
+  foreach(candidate ${candidates})
+    if(TARGET "${candidate}")
+      list(APPEND result ${candidate})
+    endif()
+  endforeach()
+  list(REMOVE_DUPLICATES result)
+  set(${output} ${result} PARENT_SCOPE)
+endfunction()
+
+# Record the current library directory and its conventional mirrored include
+# directory as possible ownership locations. Directory inference is used only
+# when exactly one logical library maps to a location; mixed directories must
+# use conventional target names or OWNER to avoid publishing unrelated files.
+function(_mlir_register_library_tablegen_directories library)
+  string(SHA1 current_directory_id "${CMAKE_CURRENT_SOURCE_DIR}")
+  set(directory_ids ${current_directory_id})
+  file(RELATIVE_PATH relative_lib_dir
+    "${MLIR_MAIN_SRC_DIR}/lib" "${CMAKE_CURRENT_SOURCE_DIR}")
+  if(NOT relative_lib_dir MATCHES "^\\.\\.")
+    set(include_dir "${MLIR_MAIN_INCLUDE_DIR}/mlir")
+    if(NOT relative_lib_dir STREQUAL ".")
+      string(APPEND include_dir "/${relative_lib_dir}")
+    endif()
+    cmake_path(SET include_dir NORMALIZE "${include_dir}")
+    string(SHA1 include_directory_id "${include_dir}")
+    list(APPEND directory_ids ${include_directory_id})
+  endif()
+  list(REMOVE_DUPLICATES directory_ids)
+  set_property(TARGET ${library} PROPERTY
+    MLIR_TABLEGEN_INFERENCE_DIRECTORY_IDS "${directory_ids}")
+  foreach(directory_id ${directory_ids})
+    set_property(GLOBAL APPEND PROPERTY
+      MLIR_TABLEGEN_LIBRARY_CANDIDATES_${directory_id} ${library})
+  endforeach()
+endfunction()
+
+# Collect precisely owned targets. An explicit or conventionally inferred
+# owner is exclusive. An unowned target is inferred from its directory only
+# when that directory maps to a single logical library.
+function(_mlir_collect_library_tablegen output_targets library)
+  get_property(owned_targets GLOBAL
+    PROPERTY MLIR_OWNED_TABLEGEN_TARGETS_${library})
+  set(result ${owned_targets})
+  get_target_property(directory_ids ${library}
+    MLIR_TABLEGEN_INFERENCE_DIRECTORY_IDS)
+  foreach(directory_id ${directory_ids})
+    get_property(directory_targets GLOBAL
+      PROPERTY MLIR_TABLEGEN_TARGETS_${directory_id})
+    get_property(candidate_libraries GLOBAL
+      PROPERTY MLIR_TABLEGEN_LIBRARY_CANDIDATES_${directory_id})
+    list(REMOVE_DUPLICATES candidate_libraries)
+    list(LENGTH candidate_libraries candidate_count)
+    foreach(tablegen_target ${directory_targets})
+      get_target_property(owners ${tablegen_target} MLIR_TABLEGEN_OWNERS)
+      set(existing_owner)
+      foreach(owner ${owners})
+        if(TARGET ${owner})
+          set(existing_owner ${owner})
+          break()
+        endif()
+      endforeach()
+      if(existing_owner)
+        if(library STREQUAL existing_owner)
+          list(APPEND result ${tablegen_target})
+        endif()
+      elseif(candidate_count EQUAL 1)
+        list(APPEND result ${tablegen_target})
+      endif()
+    endforeach()
+  endforeach()
+  list(REMOVE_DUPLICATES result)
+  set(${output_targets} ${result} PARENT_SCOPE)
+endfunction()
+
+# Collect the generated files owned by a library and split its logical header
+# dependencies by visibility.  Both add_mlir_library() and
+# add_mlir_example_library() use this path so examples exercise the same model
+# as production libraries instead of teaching explicit `*IncGen` dependencies.
+function(_mlir_collect_library_header_dependencies name)
+  cmake_parse_arguments(ARG "" "" "DEPENDS;HEADER_LIBS;LINK_LIBS" ${ARGN})
+
+  _mlir_partition_header_libraries(link_headers ${ARG_LINK_LIBS})
+  _mlir_partition_header_libraries(explicit_headers ${ARG_HEADER_LIBS})
+  set(public_header_libraries
+    ${link_headers_PUBLIC} ${explicit_headers_PUBLIC})
+  set(private_header_libraries
+    ${link_headers_PRIVATE} ${explicit_headers_PRIVATE})
+  set(interface_header_libraries
+    ${link_headers_INTERFACE} ${explicit_headers_INTERFACE})
+  set(explicit_header_libraries
+    ${explicit_headers_PUBLIC}
+    ${explicit_headers_PRIVATE}
+    ${explicit_headers_INTERFACE})
+
+  # Preserve explicitly listed TableGen dependencies whose output metadata is
+  # available. Directory and named ownership is resolved after the complete
+  # graph exists, so generator and library declaration order are equivalent.
+  set(tablegen_targets)
+  foreach(dependency ${ARG_DEPENDS})
+    if(TARGET ${dependency})
+      get_target_property(dependency_outputs ${dependency}
+        MLIR_TABLEGEN_OUTPUTS)
+      if(dependency_outputs)
+        list(APPEND tablegen_targets ${dependency})
+      endif()
+    endif()
+  endforeach()
+  list(REMOVE_DUPLICATES tablegen_targets)
+
+  set(tablegen_targets ${tablegen_targets} PARENT_SCOPE)
+  set(public_header_libraries ${public_header_libraries} PARENT_SCOPE)
+  set(private_header_libraries ${private_header_libraries} PARENT_SCOPE)
+  set(interface_header_libraries ${interface_header_libraries} PARENT_SCOPE)
+  set(explicit_header_libraries ${explicit_header_libraries} PARENT_SCOPE)
+endfunction()
+
+# Materialize generated-file ownership after the complete CMake target graph
+# exists. This is deliberately separate from library creation: a dialect or
+# interface generator may be declared after its implementation library, and
+# an ownership convention or OWNER annotation must behave identically in
+# either declaration order.
+function(_mlir_update_library_tablegen_dependencies)
+  # TODO: Remove uses_file_sets and the custom-target dependency branch once
+  # LLVM requires CMake 3.28 or newer.
+  get_property(header_libraries GLOBAL PROPERTY MLIR_HEADER_LIBRARIES)
+  foreach(library ${header_libraries})
+    get_target_property(explicit_targets ${library}
+      MLIR_EXPLICIT_TABLEGEN_TARGETS)
+    _mlir_collect_library_tablegen(inferred_targets ${library})
+    set(tablegen_targets ${explicit_targets} ${inferred_targets})
+    list(REMOVE_DUPLICATES tablegen_targets)
+
+    get_target_property(resolved_targets ${library}
+      MLIR_RESOLVED_TABLEGEN_TARGETS)
+    get_target_property(header_target ${library} MLIR_HEADER_DEP_TARGET)
+    get_target_property(compile_target ${library} MLIR_HEADER_COMPILE_TARGET)
+    get_target_property(uses_file_sets ${library}
+      MLIR_HEADER_DEP_USES_FILE_SETS)
+    foreach(tablegen_target ${tablegen_targets})
+      if(NOT TARGET ${tablegen_target} OR
+          tablegen_target IN_LIST resolved_targets)
+        continue()
+      endif()
+
+      if(uses_file_sets)
+        get_target_property(tablegen_headers ${tablegen_target}
+          MLIR_TABLEGEN_HEADER_TARGET)
+        if(NOT tablegen_headers)
+          continue()
+        endif()
+        target_link_libraries(${header_target} INTERFACE ${tablegen_headers})
+        target_link_libraries(${compile_target} PRIVATE
+          "$<BUILD_LOCAL_INTERFACE:${tablegen_headers}>")
+      else()
+        add_dependencies(${header_target} ${tablegen_target})
+        add_dependencies(${compile_target} ${tablegen_target})
+      endif()
+      set_property(TARGET ${library} APPEND PROPERTY
+        MLIR_RESOLVED_TABLEGEN_TARGETS ${tablegen_target})
+    endforeach()
+  endforeach()
+endfunction()
+
+# Wire every pair for which both MLIR libraries have been declared.  Re-running
+# this function after each declaration handles forward references naturally;
+# unresolved names are ordinary system libraries, generator expressions, or
+# installed MLIR targets and need no in-tree generated-header edge.
+function(_mlir_update_header_library_dependencies)
+  # TODO: Remove uses_file_sets and the custom-target dependency branches once
+  # LLVM requires CMake 3.28 or newer.
+  get_property(header_libraries GLOBAL PROPERTY MLIR_HEADER_LIBRARIES)
+  foreach(consumer ${header_libraries})
+    get_target_property(consumer_headers ${consumer} MLIR_HEADER_DEP_TARGET)
+    get_target_property(compile_target ${consumer} MLIR_HEADER_COMPILE_TARGET)
+    get_target_property(uses_file_sets ${consumer}
+      MLIR_HEADER_DEP_USES_FILE_SETS)
+
+    foreach(visibility PUBLIC PRIVATE INTERFACE)
+      get_target_property(providers ${consumer}
+        MLIR_${visibility}_HEADER_LIBRARIES)
+      get_target_property(resolved ${consumer}
+        MLIR_RESOLVED_${visibility}_HEADER_LIBRARIES)
+      foreach(provider_expression ${providers})
+        _mlir_expand_header_provider_candidates(provider_candidates
+          "${provider_expression}")
+        foreach(provider ${provider_candidates})
+          if(NOT TARGET "${provider}" OR provider IN_LIST resolved)
+            continue()
+          endif()
+          get_target_property(provider_imported "${provider}" IMPORTED)
+          if(provider_imported)
+            # Imported packages contain their generated headers already, so
+            # there is no in-tree generation target to order.
+            set_property(TARGET ${consumer} APPEND PROPERTY
+              MLIR_RESOLVED_${visibility}_HEADER_LIBRARIES ${provider})
+            continue()
+          endif()
+          get_target_property(provider_headers "${provider}"
+            MLIR_HEADER_DEP_TARGET)
+          if(NOT provider_headers)
+            continue()
+          endif()
+
+          if(NOT visibility STREQUAL "PRIVATE")
+            if(uses_file_sets)
+              target_link_libraries(${consumer_headers} INTERFACE
+                ${provider_headers})
+            else()
+              add_dependencies(${consumer_headers} ${provider_headers})
+            endif()
+          endif()
+          if(NOT visibility STREQUAL "INTERFACE")
+            if(uses_file_sets)
+              target_link_libraries(${compile_target} PRIVATE
+                "$<BUILD_LOCAL_INTERFACE:${provider_headers}>")
+            else()
+              add_dependencies(${compile_target} ${provider_headers})
+            endif()
+          endif()
+          set_property(TARGET ${consumer} APPEND PROPERTY
+            MLIR_RESOLVED_${visibility}_HEADER_LIBRARIES ${provider})
+        endforeach()
+      endforeach()
+    endforeach()
+  endforeach()
+
+  get_property(header_consumers GLOBAL PROPERTY MLIR_HEADER_TARGET_CONSUMERS)
+  foreach(consumer ${header_consumers})
+    get_target_property(providers ${consumer} MLIR_TARGET_HEADER_LIBRARIES)
+    get_target_property(resolved ${consumer}
+      MLIR_RESOLVED_TARGET_HEADER_LIBRARIES)
+    foreach(provider_expression ${providers})
+      _mlir_expand_header_provider_candidates(provider_candidates
+        "${provider_expression}")
+      foreach(provider ${provider_candidates})
+        if(NOT TARGET "${provider}" OR provider IN_LIST resolved)
+          continue()
+        endif()
+        get_target_property(provider_imported "${provider}" IMPORTED)
+        if(provider_imported)
+          set_property(TARGET ${consumer} APPEND PROPERTY
+            MLIR_RESOLVED_TARGET_HEADER_LIBRARIES ${provider})
+          continue()
+        endif()
+        get_target_property(provider_headers "${provider}"
+          MLIR_HEADER_DEP_TARGET)
+        get_target_property(provider_uses_file_sets "${provider}"
+          MLIR_HEADER_DEP_USES_FILE_SETS)
+        if(NOT provider_headers)
+          continue()
+        endif()
+
+        if(provider_uses_file_sets)
+          target_link_libraries(${consumer} PRIVATE
+            "$<BUILD_LOCAL_INTERFACE:${provider_headers}>")
+        else()
+          add_dependencies(${consumer} ${provider_headers})
+        endif()
+        set_property(TARGET ${consumer} APPEND PROPERTY
+          MLIR_RESOLVED_TARGET_HEADER_LIBRARIES ${provider})
+      endforeach()
+    endforeach()
+  endforeach()
+endfunction()
+
+function(_mlir_validate_header_libraries)
+  # Run resolution once more after the complete target graph is available.
+  _mlir_update_library_tablegen_dependencies()
+  _mlir_update_header_library_dependencies()
+
+  # An unowned generator can be inferred only when its directory corresponds
+  # to one logical library. Diagnose mixed directories so adding a second
+  # library cannot silently make an existing generated-header edge disappear.
+  get_property(tablegen_targets GLOBAL PROPERTY MLIR_TABLEGEN_TARGETS)
+  list(REMOVE_DUPLICATES tablegen_targets)
+  foreach(tablegen_target ${tablegen_targets})
+    get_target_property(owners ${tablegen_target} MLIR_TABLEGEN_OWNERS)
+    set(existing_owner)
+    foreach(owner ${owners})
+      if(TARGET ${owner})
+        set(existing_owner ${owner})
+        break()
+      endif()
+    endforeach()
+    if(existing_owner)
+      continue()
+    endif()
+    get_target_property(has_explicit_owner ${tablegen_target}
+      MLIR_TABLEGEN_HAS_EXPLICIT_OWNER)
+    if(has_explicit_owner)
+        message(SEND_ERROR
+          "${tablegen_target} names generated-header owners '${owners}', "
+          "but none of those library targets exists")
+      continue()
+    endif()
+
+    get_target_property(directory_id ${tablegen_target}
+      MLIR_TABLEGEN_DIRECTORY_ID)
+    get_property(candidate_libraries GLOBAL PROPERTY
+      MLIR_TABLEGEN_LIBRARY_CANDIDATES_${directory_id})
+    list(REMOVE_DUPLICATES candidate_libraries)
+    list(LENGTH candidate_libraries candidate_count)
+    if(candidate_count GREATER 1)
+      message(SEND_ERROR
+        "${tablegen_target} is in a directory shared by MLIR libraries "
+        "'${candidate_libraries}'; pass OWNER to its TableGen target helper")
+    endif()
+  endforeach()
+
+  get_property(header_libraries GLOBAL PROPERTY MLIR_HEADER_LIBRARIES)
+  foreach(consumer ${header_libraries})
+    get_target_property(providers ${consumer}
+      MLIR_EXPLICIT_HEADER_LIBRARIES)
+    foreach(provider_expression ${providers})
+      _mlir_expand_header_provider_candidates(provider_candidates
+        "${provider_expression}")
+      if(NOT provider_expression MATCHES "\\$<" AND
+          NOT TARGET "${provider_expression}")
+        message(SEND_ERROR
+          "${consumer} has a header dependency on unknown target "
+          "${provider_expression}")
+        continue()
+      endif()
+      foreach(provider ${provider_candidates})
+        get_target_property(provider_imported "${provider}" IMPORTED)
+        if(provider_imported)
+          continue()
+        endif()
+        get_target_property(provider_headers "${provider}"
+          MLIR_HEADER_DEP_TARGET)
+        if(NOT provider_headers)
+          message(SEND_ERROR
+            "${consumer} has a header dependency on ${provider}, which does "
+            "not provide MLIR generated-header metadata")
+        endif()
+      endforeach()
+    endforeach()
+  endforeach()
+
+  get_property(header_consumers GLOBAL PROPERTY MLIR_HEADER_TARGET_CONSUMERS)
+  foreach(consumer ${header_consumers})
+    get_target_property(providers ${consumer} MLIR_TARGET_HEADER_LIBRARIES)
+    get_target_property(resolved ${consumer}
+      MLIR_RESOLVED_TARGET_HEADER_LIBRARIES)
+    foreach(provider_expression ${providers})
+      _mlir_expand_header_provider_candidates(provider_candidates
+        "${provider_expression}")
+      foreach(provider ${provider_candidates})
+        if(NOT provider IN_LIST resolved)
+          message(SEND_ERROR
+            "${consumer} has an unresolved MLIR header dependency on "
+            "${provider}")
+        endif()
+      endforeach()
+    endforeach()
+  endforeach()
+endfunction()
+
+function(_mlir_schedule_header_library_validation)
+  get_property(validation_scheduled GLOBAL
+    PROPERTY MLIR_HEADER_LIBRARY_VALIDATION_SCHEDULED)
+  if(NOT validation_scheduled)
+    cmake_language(DEFER DIRECTORY "${CMAKE_SOURCE_DIR}"
+      CALL _mlir_validate_header_libraries)
+    set_property(GLOBAL PROPERTY
+      MLIR_HEADER_LIBRARY_VALIDATION_SCHEDULED TRUE)
+  endif()
+endfunction()
+
+# Create the internal header-usage target for an MLIR library.
+#
+# With CMake 3.28 and CMP0154, an INTERFACE header file set identifies the
+# generated files that a consumer may include.  Ninja can then order those
+# files precisely instead of conservatively waiting for every custom command
+# on the linked library.  On older supported CMake versions, dependencies on
+# the corresponding TableGen targets provide the same correctness with less
+# precise target-level ordering.  This is deliberately hidden behind
+# add_mlir_library so call sites have one version-independent API.
+function(_mlir_configure_library_header_dependencies name)
+  set(options)
+  set(one_value_args COMPILE_TARGET)
+  set(multi_value_args
+    TABLEGEN_TARGETS
+    EXPLICIT_LIBRARIES
+    PUBLIC_LIBRARIES
+    PRIVATE_LIBRARIES
+    INTERFACE_LIBRARIES)
+  cmake_parse_arguments(HEADER
+    "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN})
+
+  set(header_target "headers.${name}")
+
+  if(POLICY CMP0154)
+    add_library(${header_target} INTERFACE)
+    set_target_properties(${header_target} PROPERTIES FOLDER
+      "MLIR/Tablegenning/Header Dependencies")
+    set(uses_file_sets ON)
+  else()
+    # TODO: Remove this custom-target fallback once LLVM requires CMake 3.28 or
+    # newer.
+    add_custom_target(${header_target})
+    set_target_properties(${header_target} PROPERTIES FOLDER
+      "MLIR/Tablegenning/Header Dependencies")
+    set(uses_file_sets OFF)
+  endif()
+
+  # Compiling the library itself needs its local generated headers and the
+  # public-header closure.  PRIVATE logical dependencies are added directly to
+  # this compile target by _mlir_update_header_library_dependencies().
+  set_target_properties(${name} PROPERTIES
+    MLIR_HEADER_DEP_TARGET ${header_target}
+    MLIR_HEADER_COMPILE_TARGET ${HEADER_COMPILE_TARGET}
+    MLIR_HEADER_DEP_USES_FILE_SETS ${uses_file_sets}
+    MLIR_EXPLICIT_TABLEGEN_TARGETS "${HEADER_TABLEGEN_TARGETS}"
+    MLIR_EXPLICIT_HEADER_LIBRARIES "${HEADER_EXPLICIT_LIBRARIES}"
+    MLIR_PUBLIC_HEADER_LIBRARIES "${HEADER_PUBLIC_LIBRARIES}"
+    MLIR_PRIVATE_HEADER_LIBRARIES "${HEADER_PRIVATE_LIBRARIES}"
+    MLIR_INTERFACE_HEADER_LIBRARIES "${HEADER_INTERFACE_LIBRARIES}")
+  _mlir_register_library_tablegen_directories(${name})
+  set_property(GLOBAL APPEND PROPERTY MLIR_HEADER_LIBRARIES ${name})
+  _mlir_update_library_tablegen_dependencies()
+  _mlir_update_header_library_dependencies()
+  _mlir_schedule_header_library_validation()
+endfunction()
+
+# Add logical header dependencies after a library has been declared.  This is
+# the counterpart of LINK_LIBS in add_mlir_library() for callers that use
+# mlir_target_link_libraries() separately, and keeps those two spelling styles
+# equivalent for generated-header ordering.
+function(_mlir_append_header_libraries target)
+  if(NOT TARGET ${target})
+    return()
+  endif()
+  get_target_property(header_target ${target} MLIR_HEADER_DEP_TARGET)
+  if(NOT header_target)
+    return()
+  endif()
+
+  _mlir_partition_header_libraries(new_headers ${ARGN})
+  foreach(visibility PUBLIC PRIVATE INTERFACE)
+    get_target_property(existing ${target}
+      MLIR_${visibility}_HEADER_LIBRARIES)
+    if(NOT existing)
+      set(existing)
+    endif()
+    list(APPEND existing ${new_headers_${visibility}})
+    list(REMOVE_DUPLICATES existing)
+    set_property(TARGET ${target} PROPERTY
+      MLIR_${visibility}_HEADER_LIBRARIES "${existing}")
+  endforeach()
+  _mlir_update_header_library_dependencies()
+endfunction()
+
+# Add generated headers from logical MLIR libraries to a non-library target.
+# Library targets should use LINK_LIBS or HEADER_LIBS instead; this helper is
+# for executables such as unit tests that include a library's generated public
+# headers while keeping their ordinary link setup separate.
+function(mlir_target_link_header_libraries target)
+  set_property(GLOBAL APPEND PROPERTY MLIR_HEADER_TARGET_CONSUMERS ${target})
+  set_property(TARGET ${target} APPEND PROPERTY
+    MLIR_TARGET_HEADER_LIBRARIES ${ARGN})
+  _mlir_update_header_library_dependencies()
+  _mlir_schedule_header_library_validation()
+endfunction()
+
 function(add_mlir_example_library name)
   cmake_parse_arguments(ARG
     "SHARED;DISABLE_INSTALL"
     ""
-    "ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS"
+    "ADDITIONAL_HEADERS;DEPENDS;HEADER_LIBS;LINK_COMPONENTS;LINK_LIBS"
     ${ARGN})
   _set_mlir_additional_headers_as_srcs(${ARG_ADDITIONAL_HEADERS})
+  _mlir_collect_library_header_dependencies(${name}
+    DEPENDS ${ARG_DEPENDS}
+    HEADER_LIBS ${ARG_HEADER_LIBS}
+    LINK_LIBS ${ARG_LINK_LIBS})
   if (ARG_SHARED)
     set(LIBTYPE SHARED)
   else()
@@ -297,6 +998,19 @@ function(add_mlir_example_library name)
   list(APPEND ARG_DEPENDS mlir-generic-headers)
 
   llvm_add_library(${name} ${LIBTYPE} ${ARG_UNPARSED_ARGUMENTS} ${srcs} DEPENDS ${ARG_DEPENDS} LINK_COMPONENTS ${ARG_LINK_COMPONENTS} LINK_LIBS ${ARG_LINK_LIBS})
+  if(TARGET obj.${name})
+    set(header_compile_target obj.${name})
+  else()
+    set(header_compile_target ${name})
+  endif()
+  _mlir_configure_library_header_dependencies(${name}
+    COMPILE_TARGET ${header_compile_target}
+    TABLEGEN_TARGETS ${tablegen_targets}
+    EXPLICIT_LIBRARIES ${explicit_header_libraries}
+    PUBLIC_LIBRARIES ${public_header_libraries}
+    PRIVATE_LIBRARIES ${private_header_libraries}
+    INTERFACE_LIBRARIES ${interface_header_libraries})
+
   set_target_properties(${name} PROPERTIES FOLDER "MLIR/Examples")
   if (LLVM_BUILD_EXAMPLES AND NOT ${ARG_DISABLE_INSTALL})
     add_mlir_library_install(${name})
@@ -325,13 +1039,55 @@ endfunction()
 #   are compatible with building an object library.
 # STANDALONE
 #   Don't link against LLVMSupport.
+# Generated headers
+#   TableGen targets registered with add_mlir_dialect_tablegen_target() or
+#   add_mlir_generic_tablegen_target() are associated automatically when they
+#   are declared in the library's directory or in the mirrored `lib/<path>`
+#   and `include/mlir/<path>` directories.  An explicit DEPENDS entry is still
+#   honored, including when the generator lives elsewhere.  Neither case has
+#   to be repeated by consumers.
+#
+#   LINK_LIBS also supplies generated-header ordering.  PUBLIC dependencies
+#   are part of this library's public header closure, PRIVATE dependencies are
+#   needed only while compiling its implementation, and INTERFACE dependencies
+#   are needed only by consumers.  These meanings are independent of link
+#   order: both PUBLIC and PRIVATE dependencies must be ready before this
+#   library's sources compile.
+# HEADER_LIBS
+#   Logical MLIR library dependencies whose generated headers are included by
+#   this target even though their implementations are not linked.  The list
+#   uses the same PUBLIC, PRIVATE, and INTERFACE keywords as LINK_LIBS:
+#
+#   * PRIVATE headers are needed only to compile this library.
+#   * PUBLIC headers are needed to compile this library and its consumers.
+#   * INTERFACE headers are needed only by consumers.
+#
+#   Unqualified entries are PUBLIC, matching target_link_libraries().  Prefer
+#   LINK_LIBS whenever there is also a link dependency; the macro derives the
+#   corresponding header edge automatically.  HEADER_LIBS is only for the
+#   header-only relationship, and names the providing library rather than its
+#   private TableGen `*IncGen` targets.
+#
+#   Every HEADER_LIBS use must have an adjacent comment naming the source or
+#   public header include that requires the edge.  This records why the
+#   header-only relationship exists and makes stale dependencies reviewable.
+#
+#   CMake cannot infer this relationship from C++ includes.  A misspelled
+#   provider is diagnosed after all targets have been declared, but an omitted
+#   HEADER_LIBS entry can only be observed after compilation has populated
+#   dependency files.  After a clean Ninja build, use `ninja -t missingdeps`
+#   to verify that every generated include has a path through this graph.
 function(add_mlir_library name)
   cmake_parse_arguments(ARG
     "SHARED;INSTALL_WITH_TOOLCHAIN;EXCLUDE_FROM_LIBMLIR;DISABLE_INSTALL;ENABLE_AGGREGATION;OBJECT;STANDALONE"
     ""
-    "ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS"
+    "ADDITIONAL_HEADERS;DEPENDS;HEADER_LIBS;LINK_COMPONENTS;LINK_LIBS"
     ${ARGN})
   _set_mlir_additional_headers_as_srcs(${ARG_ADDITIONAL_HEADERS})
+  _mlir_collect_library_header_dependencies(${name}
+    DEPENDS ${ARG_DEPENDS}
+    HEADER_LIBS ${ARG_HEADER_LIBS}
+    LINK_LIBS ${ARG_LINK_LIBS})
 
   # Determine type of library.
   if(ARG_SHARED)
@@ -389,6 +1145,19 @@ function(add_mlir_library name)
   list(APPEND ARG_DEPENDS mlir-generic-headers)
   llvm_add_library(${name} ${LIBTYPE} ${ARG_UNPARSED_ARGUMENTS} ${srcs} DEPENDS ${ARG_DEPENDS} LINK_COMPONENTS ${ARG_LINK_COMPONENTS} LINK_LIBS ${ARG_LINK_LIBS})
 
+  if(TARGET obj.${name})
+    set(header_compile_target obj.${name})
+  else()
+    set(header_compile_target ${name})
+  endif()
+  _mlir_configure_library_header_dependencies(${name}
+    COMPILE_TARGET ${header_compile_target}
+    TABLEGEN_TARGETS ${tablegen_targets}
+    EXPLICIT_LIBRARIES ${explicit_header_libraries}
+    PUBLIC_LIBRARIES ${public_header_libraries}
+    PRIVATE_LIBRARIES ${private_header_libraries}
+    INTERFACE_LIBRARIES ${interface_header_libraries})
+
   if(TARGET ${name})
     target_link_libraries(${name} INTERFACE ${LLVM_COMMON_LIBS})
     if(ARG_INSTALL_WITH_TOOLCHAIN)
@@ -677,25 +1446,25 @@ endfunction()
 # Declare the library associated with a dialect.
 function(add_mlir_dialect_library name)
   set_property(GLOBAL APPEND PROPERTY MLIR_DIALECT_LIBS ${name})
-  add_mlir_library(${ARGV} DEPENDS mlir-headers)
+  add_mlir_library(${ARGV})
 endfunction(add_mlir_dialect_library)
 
 # Declare the library associated with a conversion.
 function(add_mlir_conversion_library name)
   set_property(GLOBAL APPEND PROPERTY MLIR_CONVERSION_LIBS ${name})
-  add_mlir_library(${ARGV} DEPENDS mlir-headers)
+  add_mlir_library(${ARGV})
 endfunction(add_mlir_conversion_library)
 
 # Declare the library associated with an extension.
 function(add_mlir_extension_library name)
   set_property(GLOBAL APPEND PROPERTY MLIR_EXTENSION_LIBS ${name})
-  add_mlir_library(${ARGV} DEPENDS mlir-headers)
+  add_mlir_library(${ARGV})
 endfunction(add_mlir_extension_library)
 
 # Declare the library associated with a translation.
 function(add_mlir_translation_library name)
   set_property(GLOBAL APPEND PROPERTY MLIR_TRANSLATION_LIBS ${name})
-  add_mlir_library(${ARGV} DEPENDS mlir-headers)
+  add_mlir_library(${ARGV})
 endfunction(add_mlir_translation_library)
 
 # Verification tools to aid debugging.
@@ -755,4 +1524,5 @@ function(mlir_target_link_libraries target type)
   else()
     target_link_libraries(${target} ${type} ${ARGN})
   endif()
+  _mlir_append_header_libraries(${target} ${type} ${ARGN})
 endfunction()
diff --git a/mlir/docs/CMakeInfrastructure.md b/mlir/docs/CMakeInfrastructure.md
new file mode 100644
index 0000000000000..5c06e697e91dc
--- /dev/null
+++ b/mlir/docs/CMakeInfrastructure.md
@@ -0,0 +1,391 @@
+# CMake Infrastructure
+
+[TOC]
+
+MLIR extends LLVM's CMake infrastructure with helpers for TableGen, libraries,
+dialects, interfaces, tools, and aggregate libraries. This document describes
+the MLIR-specific conventions implemented by
+[`AddMLIR.cmake`](../cmake/modules/AddMLIR.cmake). The LLVM CMake documentation
+still applies to the underlying LLVM helpers.
+
+## Loading the MLIR CMake modules
+
+In the LLVM monorepo, the top-level build loads the required modules. An
+out-of-tree project using an installed MLIR package normally starts with:
+
+~~~cmake
+find_package(MLIR REQUIRED CONFIG)
+
+list(APPEND CMAKE_MODULE_PATH "${MLIR_CMAKE_DIR}")
+list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}")
+include(TableGen)
+include(AddLLVM)
+include(AddMLIR)
+include(HandleLLVMOptions)
+~~~
+
+The standalone example under `mlir/examples/standalone` is the canonical
+out-of-tree template.
+
+## Source and generated-header layout
+
+Public declarations normally live below `mlir/include/mlir`, with
+implementations in the corresponding directory below `mlir/lib`. For example,
+a dialect declared in `include/mlir/Dialect/Foo/IR` is normally implemented by
+a library in `lib/Dialect/Foo/IR`.
+
+This mirrored layout is significant. The CMake helpers use it, together with
+the current directory, to associate TableGen outputs with a library when only
+one logical library maps to that location. In a directory containing multiple
+libraries, use a conventional helper or pass `OWNER` to state ownership
+unambiguously.
+
+Generated target names such as `MLIRFooOpsIncGen` are implementation details.
+Consumers should depend on the logical library that publishes the generated
+header, not directly on its private generation target.
+
+## TableGen
+
+Set `LLVM_TARGET_DEFINITIONS` to the input file, call `mlir_tablegen` once for
+each output, and finish with one of the MLIR target helpers:
+
+| Helper | Intended output |
+| --- | --- |
+| `add_mlir_dialect_tablegen_target` | Dialect-specific generated headers |
+| `add_mlir_generic_tablegen_target` | Dialect-independent generated headers |
+| `add_mlir_library_tablegen_target` | Headers owned by one named library |
+
+For example, a library-specific rewrite header can be declared as:
+
+~~~cmake
+set(LLVM_TARGET_DEFINITIONS FooTransforms.td)
+mlir_tablegen(FooTransforms.h.inc -gen-rewriters)
+add_mlir_library_tablegen_target(
+  MLIRFooTransformsIncGen
+  MLIRFooTransforms)
+~~~
+
+The second argument records `MLIRFooTransforms` as the logical owner. A target
+that links that library then acquires the required generated-header ordering
+without naming `MLIRFooTransformsIncGen`.
+
+Use `add_mlir_generic_tablegen_target` only for genuinely dialect-independent
+headers. Such headers contribute to `mlir-generic-headers`, a deliberately
+broad convenience target; placing dialect headers there can conceal missing
+logical dependencies.
+
+### Dialects
+
+The common declaration is:
+
+~~~cmake
+add_mlir_dialect(FooOps foo)
+~~~
+
+This generates operation, type, and dialect declaration and definition
+fragments. It also creates the private `MLIRFooOpsIncGen` generation target.
+After stripping a trailing `Ops`, the helper associates those generated files
+with both established library names, `MLIRFooDialect` and `MLIRFoo`. The
+library may be declared later, and whichever conventional target is declared
+uses the association.
+
+Consequently, both conventional layouts need no ownership annotation:
+
+~~~cmake
+add_mlir_dialect(FooOps foo)
+add_mlir_dialect_library(MLIRFooDialect ...)
+
+add_mlir_dialect(StandaloneOps standalone)
+add_mlir_dialect_library(MLIRStandalone ...)
+~~~
+
+Use `OWNER` only when the library follows neither convention:
+
+~~~cmake
+add_mlir_dialect(FooOps foo OWNER ProjectDialectRuntime)
+~~~
+
+This escape hatch should be rare. Prefer a conventional name when introducing
+a new dialect.
+
+### Operation and type interfaces
+
+Declare interface TableGen files with the corresponding helper:
+
+~~~cmake
+add_mlir_interface(ShapeInferenceOpInterface)
+add_mlir_type_interface(PtrLikeTypeInterface)
+~~~
+
+These generate declaration and definition fragments and register their
+TableGen targets. By default, an interface named `FooInterface` considers
+`MLIRFooInterface` and the conventional containing-dialect libraries as
+owners. Pass `OWNER` when the implementation library follows neither
+convention.
+
+### Sharded operations
+
+`add_sharded_ops` generates source shards that are compiled as sources. Its
+generation target is a real source-generation prerequisite and should remain
+in `DEPENDS`. It is different from a generated public header published through
+a logical library dependency.
+
+### PDLL and generated documentation
+
+Use `add_mlir_pdll_library` for PDLL sources and `add_mlir_doc` for generated
+dialect, operation, interface, or pass documentation. The latter places
+documentation targets under the MLIR documentation aggregate.
+
+## Libraries
+
+`add_mlir_library` is the base helper for MLIR libraries:
+
+~~~cmake
+add_mlir_library(MLIRFooTransforms
+  FooTransforms.cpp
+
+  ADDITIONAL_HEADER_DIRS
+  ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Foo
+
+  LINK_COMPONENTS
+  Support
+
+  LINK_LIBS PUBLIC
+  MLIRFooDialect
+  MLIRPass
+  )
+~~~
+
+`LINK_COMPONENTS` names LLVM components. `LINK_LIBS` names CMake or MLIR
+library targets. Keeping the two separate lets LLVM and MLIR select monolithic
+shared libraries correctly.
+
+Frequently used options include:
+
+| Option | Purpose |
+| --- | --- |
+| `SHARED` or `OBJECT` | Select a non-default library form |
+| `INSTALL_WITH_TOOLCHAIN` | Install with the toolchain distribution |
+| `EXCLUDE_FROM_LIBMLIR` | Do not include the library in monolithic MLIR |
+| `DISABLE_INSTALL` | Do not create installation rules |
+| `ENABLE_AGGREGATION` | Make object files available to MLIR aggregates |
+| `STANDALONE` | Do not add the implicit `LLVMSupport` dependency |
+| `ADDITIONAL_HEADERS` | Associate additional source headers with the target |
+| `ADDITIONAL_HEADER_DIRS` | Associate source headers with IDE source groups |
+| `HEADER_LIBS` | Add generated-header dependencies without linking |
+| `DEPENDS` | Add non-library build-order prerequisites |
+
+Prefer a specialized wrapper where one describes the library's role:
+
+| Helper | Additional behavior |
+| --- | --- |
+| `add_mlir_dialect_library` | Records the target in `MLIR_DIALECT_LIBS` |
+| `add_mlir_conversion_library` | Records it in `MLIR_CONVERSION_LIBS` |
+| `add_mlir_extension_library` | Records it in `MLIR_EXTENSION_LIBS` |
+| `add_mlir_translation_library` | Records it in `MLIR_TRANSLATION_LIBS` |
+| `add_mlir_example_library` | Applies the model to example libraries |
+| `add_mlir_public_c_api_library` | Creates an aggregatable C API library |
+
+The global properties support tools and aggregate libraries that intentionally
+collect an entire category. Ordinary libraries should name only their actual
+dependencies.
+
+## Link and header dependency visibility
+
+MLIR uses one visibility declaration for both linking and generated-header
+ordering:
+
+| Declaration | Link relationship | Generated headers needed by |
+| --- | --- | --- |
+| `LINK_LIBS PUBLIC A` | `A` is linked and exported | Target and consumers |
+| `LINK_LIBS PRIVATE A` | `A` is linked but not exported | Target only |
+| `LINK_LIBS INTERFACE A` | `A` is exported but not linked | Consumers only |
+
+Choose visibility from the C++ interface:
+
+* Use `PUBLIC` when a public header includes a header from the dependency.
+* Use `PRIVATE` when only implementation files include it.
+* Use `INTERFACE` for a header-only requirement not used by this target's
+  implementation.
+
+Unqualified `LINK_LIBS` retains CMake's legacy signature behavior and should
+be avoided in new code when visibility matters.
+
+The same modeling applies when links are added after target creation:
+
+~~~cmake
+mlir_target_link_libraries(MyTarget PRIVATE MLIRFooDialect)
+~~~
+
+For a library that participates in `libMLIR`, use this helper: it updates
+generated-header ordering and implements `MLIR_LINK_MLIR_DYLIB` substitution.
+A non-dylib library or test may require raw `target_link_libraries` to preserve
+its intended static links. In that case, model any generated-header
+relationship separately with `HEADER_LIBS` at declaration time.
+
+### Header-only relationships
+
+Use `HEADER_LIBS` when a target includes generated headers from a logical MLIR
+library but must not link that library. Always document the source-level reason
+next to the declaration so that the edge can be reviewed and maintained:
+
+~~~cmake
+# FooAnalysis.cpp includes mlir/Dialect/Foo/IR/FooOps.h.
+HEADER_LIBS PRIVATE
+MLIRFooDialect
+~~~
+
+`HEADER_LIBS` accepts `PUBLIC`, `PRIVATE`, and `INTERFACE` with the same
+consumer meanings as `LINK_LIBS`, but it creates no link relationship. An
+explicit local provider must exist and publish MLIR header metadata;
+configuration fails after the directory graph has been processed otherwise.
+Imported targets are accepted as a no-op because installed packages already
+contain their generated headers.
+
+For executables or other targets not created by `add_mlir_library`, use:
+
+~~~cmake
+# MyTool.cpp includes mlir/Dialect/Foo/IR/FooOps.h.
+mlir_target_link_header_libraries(MyTool MLIRFooDialect)
+~~~
+
+This helper adds compile-time ordering only; its dependencies are inherently
+private to the non-library target and therefore take no visibility keyword.
+
+### When `DEPENDS` is appropriate
+
+`DEPENDS` is for prerequisites that are not represented by a logical library:
+
+* generated source shards that are compiled by the target;
+* LLVM generation targets such as `intrinsics_gen` when their generated LLVM
+  headers are included directly;
+* a deliberate build-order relationship with no CMake link or header
+  interface.
+
+Do not put an `*IncGen`, `*EnumsGen`, or `*AttrUtilsGen` header-generation
+target in a consumer's `DEPENDS`. State the logical provider through
+`LINK_LIBS` or `HEADER_LIBS` instead.
+
+## How generated-header ordering works
+
+The MLIR helpers model generated files in four stages:
+
+1. Every MLIR TableGen target records only the outputs accumulated for that
+   target.
+2. The output target is associated with an exclusive logical owner through
+   dialect or interface naming, an explicit `OWNER`, or directory inference
+   when exactly one library maps to that directory.
+3. Each owner publishes those outputs through a private internal carrier.
+4. `LINK_LIBS` and `HEADER_LIBS` visibility propagates the carrier through the
+   logical library graph.
+
+Both providers and consumers may be declared later in the CMake traversal.
+MLIR resolves the graph with deferred calls after all directories have been
+processed. This makes forward references work without imposing declaration
+order on the source tree.
+
+A `LINK_LIBS` entry may use a generator expression. At deferred resolution,
+MLIR conservatively orders every literal in-tree target named by that
+expression; ordering both branches of a conditional is safe. Imported targets
+need no build-tree ordering because their headers already exist.
+
+With CMake 3.28 or newer, generated headers are attached to an `INTERFACE`
+header file set under policy `CMP0154`. This gives Ninja precise knowledge of
+which target produces each private generated file. With older CMake, MLIR uses
+a custom-target carrier because those CMake versions cannot express the same
+file-set relationship. The fallback is marked with TODOs and can be removed
+when LLVM's minimum CMake version reaches 3.28.
+
+Carrier names begin with `headers.` and are private implementation details.
+They are not exported in `MLIRTargets.cmake` and must never appear in project
+CMake files.
+
+The convenience targets have deliberately different scopes:
+
+* `mlir-generic-headers` contains dialect-independent generated headers.
+* `mlir-headers` also includes generated headers that may be dialect-specific.
+
+These targets are useful aggregates, not substitutes for precise logical
+dependencies.
+
+## Tools, aggregates, and installation
+
+Use `add_mlir_tool` for installed MLIR tools. Use `add_mlir_aggregate` to build
+a shared or static library that embeds object-enabled MLIR libraries;
+`PUBLIC_LIBS` are linked normally and `EMBED_LIBS` contribute their objects.
+`add_mlir_library_install` creates the standard export and installation rules
+when a library needs them outside the normal helper path.
+
+`mlir_check_link_libraries` and `mlir_check_all_link_libraries` diagnose
+inconsistent link interfaces. They complement, but do not replace, the
+generated-header checks below.
+
+## Validating dependency changes
+
+Generated-header correctness must be tested from an empty or clean Ninja
+graph. An incremental build can leave generated files behind, and a broad
+aggregate can generate a missing header incidentally before its consumer is
+compiled.
+
+Prefer a new Ninja build directory. If reusing one, clean it before
+reconfiguring:
+
+~~~shell
+ninja -C <build> -t clean
+cmake -S llvm -B <build> -G Ninja <configuration options>
+~~~
+
+Then build representative leaf libraries first, with normal parallelism and
+before any broad aggregate target:
+
+~~~shell
+cmake --build <build> --target MLIRArmNeonDialect MLIRLinalgDialect \
+  --parallel 32
+~~~
+
+Choose leaves that exercise the ownership or visibility changed by the patch.
+A successful first build demonstrates that their generated prerequisites are
+present in Ninja's initial graph rather than supplied by earlier work.
+
+Next build the broad test graph. Besides testing MLIR, this populates compiler
+dependency files for Ninja's analysis:
+
+~~~shell
+cmake --build <build> --target check-mlir MLIRUnitTests --parallel 32
+~~~
+
+Only after that compilation succeeds, run:
+
+~~~shell
+ninja -C <build> -t missingdeps
+~~~
+
+`missingdeps` compares generated-file producers with include relationships
+recorded in compiler depfiles. Running it before compilation cannot discover
+those includes. Running only a broad build is also insufficient: aggregate
+scheduling may happen to generate a header early and hide a first-build race.
+The leaf-first build and the populated-depfile audit test different failure
+modes.
+
+After changing dependency modeling, repeat the full sequence: create or clean
+the build, reconfigure, build representative leaves, build the broad tests,
+and finally run `missingdeps`. When compatibility paths change, repeat it with
+a CMake version older than 3.28. When installed-package behavior changes, also
+configure and build `mlir/examples/standalone` in an empty out-of-tree build.
+
+If `missingdeps` reports a generated header, find the logical library that
+publishes it and add the narrow `LINK_LIBS` or `HEADER_LIBS` relationship with
+the correct visibility. Do not fix the warning with a private IncGen target or
+a global header aggregate.
+
+## Common mistakes
+
+* Depending directly on `MLIRFooOpsIncGen`: depend on `MLIRFooDialect` or
+  `MLIRFoo` through `LINK_LIBS` or `HEADER_LIBS`.
+* Making every dependency `PUBLIC`: use the visibility implied by public
+  headers and implementation includes.
+* Using `DEPENDS` for a link dependency: put the library in `LINK_LIBS`.
+* Using `mlir-headers` to repair a leaf race: add the missing logical edge.
+* Running `missingdeps` on an uncompiled graph: build first so depfiles exist.
+* Validating only an incremental or aggregate build: clean and build
+  representative leaf targets first.
diff --git a/mlir/docs/DefiningDialects/AttributesAndTypes.md b/mlir/docs/DefiningDialects/AttributesAndTypes.md
index a339a763bd607..cc89e13a6d351 100644
--- a/mlir/docs/DefiningDialects/AttributesAndTypes.md
+++ b/mlir/docs/DefiningDialects/AttributesAndTypes.md
@@ -192,11 +192,14 @@ mlir_tablegen(<Your Dialect>AttrDefs.h.inc -gen-attrdef-decls
               -attrdefs-dialect=<Your Dialect>)
 mlir_tablegen(<Your Dialect>AttrDefs.cpp.inc -gen-attrdef-defs 
               -attrdefs-dialect=<Your Dialect>)
-add_public_tablegen_target(<Your Dialect>AttrDefsIncGen)
+add_mlir_dialect_tablegen_target(<Your Dialect>AttrDefsIncGen)
 ```
 
 The generated `<Your Dialect>AttrDefs.h.inc` will need to be included whereever
-you are referencing the custom attribute types.
+you are referencing the custom attribute types. The generation target is
+associated with the dialect library automatically; consumers depend on that
+logical library rather than the private IncGen target. See
+[CMake Infrastructure](../CMakeInfrastructure.md) for details.
 
 ### Documentation
 
diff --git a/mlir/docs/Tutorials/CreatingADialect.md b/mlir/docs/Tutorials/CreatingADialect.md
index e30b80bc5207c..fa27bb1d46a5f 100644
--- a/mlir/docs/Tutorials/CreatingADialect.md
+++ b/mlir/docs/Tutorials/CreatingADialect.md
@@ -31,6 +31,10 @@ FooOps.cpp) might be.
 
 ## CMake best practices
 
+See [CMake Infrastructure](../CMakeInfrastructure.md) for the authoritative
+reference for MLIR's library, TableGen, generated-header, and dependency
+helpers.
+
 ### TableGen Targets
 
 Operations in dialects are typically declared using the ODS format in
@@ -42,35 +46,34 @@ add_mlir_dialect(FooOps foo)
 add_mlir_doc(FooOps FooDialect Dialects/ -gen-dialect-doc)
 ```
 
-This generates the correct rules to run mlir-tblgen, along with a
-'MLIRFooOpsIncGen' target which can be used to declare dependencies.
+This generates the correct rules to run `mlir-tblgen`. The private
+`MLIRFooOpsIncGen` target is associated automatically with the conventional
+`MLIRFooDialect` and `MLIRFoo` library names. Consumers name the logical
+library rather than this generation target.
 
 Dialect transformations are typically declared in a file FooTransforms.td.
-Targets for TableGen are described in typical llvm fashion.
+Associate their generated headers with the library that publishes them.
 
 ```cmake
 set(LLVM_TARGET_DEFINITIONS FooTransforms.td)
 mlir_tablegen(FooTransforms.h.inc -gen-rewriters)
-add_public_tablegen_target(MLIRFooTransformIncGen)
+add_mlir_library_tablegen_target(
+  MLIRFooTransformIncGen
+  MLIRFooDialect)
 ```
 
-The result is another 'IncGen' target, which runs mlir-tblgen.
+The generated target remains an implementation detail of `MLIRFooDialect`.
 
 ### Library Targets
 
-Dialects may have multiple libraries.  Each library is typically
-declared with add_mlir_dialect_library().  Dialect libraries often
-depend on the generation of header files from TableGen (specified
-using the DEPENDS keyword).  Dialect libraries may also depend on
-other dialect libraries.  Typically this dependence is declared using
-target_link_libraries() and the PUBLIC keyword.  For instance:
+Dialects may have multiple libraries. Each library is typically declared with
+`add_mlir_dialect_library()`. TableGen outputs owned by the library are
+included automatically. Dependencies on generated headers from other
+libraries are derived from `LINK_LIBS`, or stated with `HEADER_LIBS` when no
+link dependency exists. For instance:
 
 ```cmake
-add_mlir_dialect_library(MLIRFoo
-  DEPENDS
-  MLIRFooOpsIncGen
-  MLIRFooTransformsIncGen
-
+add_mlir_dialect_library(MLIRFooDialect
   LINK_COMPONENTS
   Core
 
@@ -80,7 +83,7 @@ add_mlir_dialect_library(MLIRFoo
   )
 ```
 
-add_mlir_dialect_library() is a thin wrapper around add_llvm_library()
+`add_mlir_dialect_library()` is a wrapper around `add_mlir_library()`
 which collects a list of all the dialect libraries.  This list is
 often useful for linking tools (e.g. mlir-opt) which should have
 access to all dialects.  This list is also linked into libMLIR.so.
@@ -90,15 +93,11 @@ The list can be retrieved from the MLIR_DIALECT_LIBS global property:
 get_property(dialect_libs GLOBAL PROPERTY MLIR_DIALECT_LIBS)
 ```
 
-Note that although the Bar dialect also uses TableGen to declare its
-operations, it is not necessary to explicitly depend on the
-corresponding IncGen targets.  The PUBLIC link dependency is
-sufficient.  Also note that we avoid using add_dependencies
-explicitly, since the dependencies need to be available to the
-underlying add_llvm_library() call, allowing it to correctly create
-new targets with the same sources.  However, dialects that depend on
-LLVM IR may need to depend on the LLVM 'intrinsics_gen' target to
-ensure that tablegen'd LLVM header files have been generated.
+The `PUBLIC` link dependency on `MLIRBar` also makes Bar's generated headers
+available before Foo and its consumers compile. Do not name Bar's private
+IncGen target or use `add_dependencies` for that relationship. Dialects that
+include generated LLVM IR headers may still need the LLVM `intrinsics_gen`
+target in `DEPENDS`, because that prerequisite is not an MLIR library.
 
 In addition, linkage to MLIR libraries is specified using the
 LINK_LIBS descriptor and linkage to LLVM libraries is specified using
@@ -127,11 +126,14 @@ mlir/lib/Conversion/GPUCommon.
 
 ## CMake best practices
 
+See [CMake Infrastructure](../CMakeInfrastructure.md) for the full dependency
+and visibility model.
+
 Each conversion typically exists in a separate library, declared with
 add_mlir_conversion_library().  Conversion libraries typically depend
 on their source and target dialects, but may also depend on other
 dialects (e.g. MLIRFunc).  Typically this dependence is specified
-using target_link_libraries() and the PUBLIC keyword.  For instance:
+using `LINK_LIBS` and the appropriate visibility. For instance:
 
 ```cmake
 add_mlir_conversion_library(MLIRBarToFoo
@@ -146,8 +148,8 @@ add_mlir_conversion_library(MLIRBarToFoo
   )
 ```
 
-add_mlir_conversion_library() is a thin wrapper around
-add_llvm_library() which collects a list of all the conversion
+`add_mlir_conversion_library()` is a wrapper around
+`add_mlir_library()` which collects a list of all the conversion
 libraries.  This list is often useful for linking tools
 (e.g. mlir-opt) which should have access to all dialects.  This list
 is also linked in libMLIR.so.  The list can be retrieved from the
@@ -157,9 +159,11 @@ MLIR_CONVERSION_LIBS global property:
 get_property(dialect_libs GLOBAL PROPERTY MLIR_CONVERSION_LIBS)
 ```
 
-Note that it is only necessary to specify a PUBLIC dependence against
-dialects to generate compile-time and link-time dependencies, and it
-is not necessary to explicitly depend on the dialects' IncGen targets.
+Specify the visibility implied by the C++ interface when depending on a
+dialect: `PUBLIC` for a public-header dependency and `PRIVATE` when only
+implementation files include it. The logical dialect library supplies both
+the link relationship and generated-header ordering, so do not also depend on
+its IncGen target.
 However, conversions that directly include LLVM IR header files may
 need to depend on the LLVM 'intrinsics_gen' target to ensure that
 tablegen'd LLVM header files have been generated.
diff --git a/mlir/docs/Tutorials/QuickstartRewrites.md b/mlir/docs/Tutorials/QuickstartRewrites.md
index 0aa1711414b9a..10c732ea919d5 100644
--- a/mlir/docs/Tutorials/QuickstartRewrites.md
+++ b/mlir/docs/Tutorials/QuickstartRewrites.md
@@ -149,12 +149,15 @@ configuration in CMake:
 ```cmake
 set(LLVM_TARGET_DEFINITIONS <name-of-the-td-file>)
 mlir_tablegen(<name-of-the-generated-inc-file> -gen-rewriters)
-add_public_tablegen_target(<name-of-the-cmake-target>)
+add_mlir_library_tablegen_target(
+  <name-of-the-cmake-target>
+  <name-of-the-owning-library>)
 ```
 
 Then you can `#include` the generated file in any C++ implementation file you
-like. (You will also need to make sure the library depends on the CMake target
-defined in the above.) The generated file will have a `populateWithGenerated(
+like. The owning library acquires the generation dependency automatically, and
+consumers depend on its logical library target. The generated file will have a
+`populateWithGenerated(
 RewritePatternSet &patterns)` function that you can
 use to collect all the generated patterns inside `patterns` and then use
 `patterns` in any pass you would like.
diff --git a/mlir/docs/Tutorials/transform/Ch2.md b/mlir/docs/Tutorials/transform/Ch2.md
index 08c4e0f9d859c..f2d83399d85ac 100644
--- a/mlir/docs/Tutorials/transform/Ch2.md
+++ b/mlir/docs/Tutorials/transform/Ch2.md
@@ -89,8 +89,8 @@ set(LLVM_TARGET_DEFINITIONS MyExtension.td)
 mlir_tablegen(MyExtension.h.inc -gen-op-decls)
 mlir_tablegen(MyExtension.cpp.inc -gen-op-defs)
 
-# Add a CMakeTarget we can depend on to ensure the generation happens before the compilation.
-add_public_tablegen_target(MyExtensionIncGen)
+# Associate the generated files with their logical library.
+add_mlir_library_tablegen_target(MyExtensionIncGen MyExtension)
 
 # Don't forget to generate the documentation, this will produce a MyExtension.md under
 # Dialects.
@@ -106,11 +106,6 @@ add_mlir_library(
   # Built from the following source files.
   MyExtension.cpp
 
-  # Make sure ODS declaration and definitions are generated before compiling
-  # this.
-  DEPENDS
-  MyExtensionIncGen
-
   # Link in the transform dialect, and all generated dialects.
   LINK_LIBS PUBLIC
   MLIRTransformDialect
diff --git a/mlir/examples/standalone/include/Standalone/CMakeLists.txt b/mlir/examples/standalone/include/Standalone/CMakeLists.txt
index 975a4ffaa2aa0..f02cae1a6bb50 100644
--- a/mlir/examples/standalone/include/Standalone/CMakeLists.txt
+++ b/mlir/examples/standalone/include/Standalone/CMakeLists.txt
@@ -4,4 +4,4 @@ add_mlir_doc(StandaloneOps StandaloneOps Standalone/ -gen-op-doc)
 
 set(LLVM_TARGET_DEFINITIONS StandalonePasses.td)
 mlir_tablegen(StandalonePasses.h.inc --gen-pass-decls)
-add_public_tablegen_target(MLIRStandalonePassesIncGen)
+add_mlir_library_tablegen_target(MLIRStandalonePassesIncGen MLIRStandalone)
diff --git a/mlir/examples/standalone/lib/Standalone/CMakeLists.txt b/mlir/examples/standalone/lib/Standalone/CMakeLists.txt
index 0f1705a25c8c8..53d0c951a43ab 100644
--- a/mlir/examples/standalone/lib/Standalone/CMakeLists.txt
+++ b/mlir/examples/standalone/lib/Standalone/CMakeLists.txt
@@ -7,10 +7,6 @@ add_mlir_dialect_library(MLIRStandalone
         ADDITIONAL_HEADER_DIRS
         ${PROJECT_SOURCE_DIR}/include/Standalone
 
-        DEPENDS
-        MLIRStandaloneOpsIncGen
-        MLIRStandalonePassesIncGen
-
         LINK_LIBS PUBLIC
         MLIRIR
         MLIRInferTypeOpInterface
diff --git a/mlir/examples/transform/Ch2/include/CMakeLists.txt b/mlir/examples/transform/Ch2/include/CMakeLists.txt
index bb8935153e768..ded50d283c34c 100644
--- a/mlir/examples/transform/Ch2/include/CMakeLists.txt
+++ b/mlir/examples/transform/Ch2/include/CMakeLists.txt
@@ -6,7 +6,7 @@ mlir_tablegen(MyExtension.h.inc -gen-op-decls)
 mlir_tablegen(MyExtension.cpp.inc -gen-op-defs)
 
 # Add a CMakeTarget we can depend on to ensure the generation happens before the compilation.
-add_public_tablegen_target(MyExtensionCh2IncGen)
+add_mlir_library_tablegen_target(MyExtensionCh2IncGen MyExtensionCh2)
 
 # Don't forget to generate the documentation, this will produce a
 # MyExtensionCh2.md under Tutorials/transform
diff --git a/mlir/examples/transform/Ch2/lib/CMakeLists.txt b/mlir/examples/transform/Ch2/lib/CMakeLists.txt
index 9c2327284292e..7f8f8ddd62346 100644
--- a/mlir/examples/transform/Ch2/lib/CMakeLists.txt
+++ b/mlir/examples/transform/Ch2/lib/CMakeLists.txt
@@ -10,10 +10,6 @@ add_mlir_example_library(
   ADDITIONAL_HEADER_DIRS
   ${PROJECT_SOURCE_DIR}/examples/transform/Ch2/include
 
-  # Make sure ODS declaration and definitions are generated before compiling this.
-  DEPENDS
-  MyExtensionCh2IncGen
-
   # Link in the transform dialect, an all generated dialects.
   LINK_LIBS PRIVATE
   MLIRTransformDialect
diff --git a/mlir/examples/transform/Ch3/include/CMakeLists.txt b/mlir/examples/transform/Ch3/include/CMakeLists.txt
index 59bd3be30538b..55b0272b3b3f2 100644
--- a/mlir/examples/transform/Ch3/include/CMakeLists.txt
+++ b/mlir/examples/transform/Ch3/include/CMakeLists.txt
@@ -13,7 +13,7 @@ mlir_tablegen(MyExtensionTypes.h.inc -gen-typedef-decls)
 mlir_tablegen(MyExtensionTypes.cpp.inc -gen-typedef-defs)
 
 # Add a CMakeTarget we can depend on to ensure the generation happens before the compilation.
-add_public_tablegen_target(MyExtensionCh3IncGen)
+add_mlir_library_tablegen_target(MyExtensionCh3IncGen MyExtensionCh3)
 
 # Don't forget to generate the documentation, this will produce a
 # MyExtensionCh3.md under Tutorials/transform
diff --git a/mlir/examples/transform/Ch3/lib/CMakeLists.txt b/mlir/examples/transform/Ch3/lib/CMakeLists.txt
index 2c04a8bab85a2..f6311614880bd 100644
--- a/mlir/examples/transform/Ch3/lib/CMakeLists.txt
+++ b/mlir/examples/transform/Ch3/lib/CMakeLists.txt
@@ -10,10 +10,6 @@ add_mlir_example_library(
   ADDITIONAL_HEADER_DIRS
   ${PROJECT_SOURCE_DIR}/examples/transform/Ch3/include
 
-  # Make sure ODS declaration and definitions are generated before compiling this.
-  DEPENDS
-  MyExtensionCh3IncGen
-
   # Link in the transform dialect, an all generated dialects.
   LINK_LIBS PRIVATE
   MLIRTransformDialect
diff --git a/mlir/examples/transform/Ch4/include/CMakeLists.txt b/mlir/examples/transform/Ch4/include/CMakeLists.txt
index 1f960e590529b..d144b4a0ace31 100644
--- a/mlir/examples/transform/Ch4/include/CMakeLists.txt
+++ b/mlir/examples/transform/Ch4/include/CMakeLists.txt
@@ -7,7 +7,7 @@ mlir_tablegen(MyExtension.cpp.inc -gen-op-defs)
 
 # Add a CMakeTarget we can depend on to ensure the generation happens before the
 # compilation.
-add_public_tablegen_target(MyExtensionCh4IncGen)
+add_mlir_library_tablegen_target(MyExtensionCh4IncGen MyExtensionCh4)
 
 # Don't forget to generate the documentation, this will produce a
 # MyExtensionCh4.md under Tutorials/transform
diff --git a/mlir/examples/transform/Ch4/lib/CMakeLists.txt b/mlir/examples/transform/Ch4/lib/CMakeLists.txt
index 33338a679af3c..40ba66b52adad 100644
--- a/mlir/examples/transform/Ch4/lib/CMakeLists.txt
+++ b/mlir/examples/transform/Ch4/lib/CMakeLists.txt
@@ -10,10 +10,6 @@ add_mlir_example_library(
   ADDITIONAL_HEADER_DIRS
   ${PROJECT_SOURCE_DIR}/examples/transform/Ch4/include
 
-  # Make sure ODS declaration and definitions are generated before compiling this.
-  DEPENDS
-  MyExtensionCh4IncGen
-
   # Link in the transform dialect, an all generated dialects.
   LINK_LIBS PRIVATE
   MLIRTransformDialect
diff --git a/mlir/include/mlir/Dialect/GPU/IR/CMakeLists.txt b/mlir/include/mlir/Dialect/GPU/IR/CMakeLists.txt
index 32323ab62332a..8b0f39de7f741 100644
--- a/mlir/include/mlir/Dialect/GPU/IR/CMakeLists.txt
+++ b/mlir/include/mlir/Dialect/GPU/IR/CMakeLists.txt
@@ -4,29 +4,35 @@ add_mlir_doc(GPUOps GPUOps Dialects/ -gen-op-doc -dialect=gpu)
 set(LLVM_TARGET_DEFINITIONS GPUBase.td)
 mlir_tablegen(GPUOpInterfaces.h.inc -gen-op-interface-decls)
 mlir_tablegen(GPUOpInterfaces.cpp.inc -gen-op-interface-defs)
-add_mlir_dialect_tablegen_target(MLIRGPUOpInterfacesIncGen)
+add_mlir_dialect_tablegen_target(MLIRGPUOpInterfacesIncGen
+  OWNER MLIRGPUDialect)
 
 set(LLVM_TARGET_DEFINITIONS ParallelLoopMapperAttr.td)
 mlir_tablegen(ParallelLoopMapperEnums.h.inc -gen-enum-decls)
 mlir_tablegen(ParallelLoopMapperEnums.cpp.inc -gen-enum-defs)
-add_mlir_dialect_tablegen_target(MLIRParallelLoopMapperEnumsGen)
+add_mlir_dialect_tablegen_target(MLIRParallelLoopMapperEnumsGen
+  OWNER MLIRGPUDialect)
 
 set(LLVM_TARGET_DEFINITIONS GPUOps.td)
 mlir_tablegen(GPUOpsEnums.h.inc -gen-enum-decls)
 mlir_tablegen(GPUOpsEnums.cpp.inc -gen-enum-defs)
-add_mlir_dialect_tablegen_target(MLIRGPUOpsEnumsGen)
+add_mlir_dialect_tablegen_target(MLIRGPUOpsEnumsGen
+  OWNER MLIRGPUDialect)
 
 set(LLVM_TARGET_DEFINITIONS CompilationAttrInterfaces.td)
 mlir_tablegen(CompilationAttrInterfaces.h.inc -gen-attr-interface-decls)
 mlir_tablegen(CompilationAttrInterfaces.cpp.inc -gen-attr-interface-defs)
-add_mlir_dialect_tablegen_target(MLIRGPUCompilationAttrInterfacesIncGen)
+add_mlir_dialect_tablegen_target(MLIRGPUCompilationAttrInterfacesIncGen
+  OWNER MLIRGPUDialect)
 
 set(LLVM_TARGET_DEFINITIONS GPUDeviceMappingAttr.td)
 mlir_tablegen(GPUDeviceMapperEnums.h.inc -gen-enum-decls)
 mlir_tablegen(GPUDeviceMapperEnums.cpp.inc -gen-enum-defs)
-add_mlir_dialect_tablegen_target(MLIRGPUDeviceMapperEnumsGen)
+add_mlir_dialect_tablegen_target(MLIRGPUDeviceMapperEnumsGen
+  OWNER MLIRGPUDialect)
 
 set(LLVM_TARGET_DEFINITIONS GPUOps.td)
 mlir_tablegen(GPUOpsAttributes.h.inc -gen-attrdef-decls -attrdefs-dialect=gpu)
 mlir_tablegen(GPUOpsAttributes.cpp.inc -gen-attrdef-defs -attrdefs-dialect=gpu)
-add_mlir_dialect_tablegen_target(MLIRGPUOpsAttributesIncGen)
+add_mlir_dialect_tablegen_target(MLIRGPUOpsAttributesIncGen
+  OWNER MLIRGPUDialect)
diff --git a/mlir/include/mlir/Dialect/LLVMIR/CMakeLists.txt b/mlir/include/mlir/Dialect/LLVMIR/CMakeLists.txt
index a81288495f625..828ff22c61050 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/CMakeLists.txt
+++ b/mlir/include/mlir/Dialect/LLVMIR/CMakeLists.txt
@@ -11,22 +11,23 @@ mlir_tablegen(LLVMOpsAttrDefs.h.inc -gen-attrdef-decls
               -attrdefs-dialect=llvm)
 mlir_tablegen(LLVMOpsAttrDefs.cpp.inc -gen-attrdef-defs
               -attrdefs-dialect=llvm)
-add_mlir_dialect_tablegen_target(MLIRLLVMOpsIncGen)
+add_mlir_dialect_tablegen_target(MLIRLLVMOpsIncGen OWNER MLIRLLVMDialect)
 
 set(LLVM_TARGET_DEFINITIONS LLVMTypes.td)
 mlir_tablegen(LLVMTypes.h.inc -gen-typedef-decls -typedefs-dialect=llvm)
 mlir_tablegen(LLVMTypes.cpp.inc -gen-typedef-defs -typedefs-dialect=llvm)
-add_mlir_dialect_tablegen_target(MLIRLLVMTypesIncGen)
+add_mlir_dialect_tablegen_target(MLIRLLVMTypesIncGen OWNER MLIRLLVMDialect)
 
 set(LLVM_TARGET_DEFINITIONS LLVMIntrinsicOps.td)
 mlir_tablegen(LLVMIntrinsicOps.h.inc -gen-op-decls)
 mlir_tablegen(LLVMIntrinsicOps.cpp.inc -gen-op-defs)
-add_mlir_dialect_tablegen_target(MLIRLLVMIntrinsicOpsIncGen)
+add_mlir_dialect_tablegen_target(MLIRLLVMIntrinsicOpsIncGen
+  OWNER MLIRLLVMDialect)
 
 set(LLVM_TARGET_DEFINITIONS LLVMAllOps.td)
 mlir_tablegen(LLVMAllOps.h.inc -gen-op-decls -op-shard-count=8)
 mlir_tablegen(LLVMAllOps.cpp.inc -gen-op-defs -op-shard-count=8)
-add_mlir_dialect_tablegen_target(MLIRLLVMAllOpsIncGen)
+add_mlir_dialect_tablegen_target(MLIRLLVMAllOpsIncGen OWNER MLIRLLVMDialect)
 
 add_mlir_doc(LLVMOps LLVMOps Dialects/ -gen-op-doc -dialect=llvm)
 add_mlir_doc(LLVMIntrinsicOps LLVMIntrinsicOps Dialects/ -gen-op-doc -dialect=llvm)
@@ -38,34 +39,40 @@ mlir_tablegen(LLVMAttrInterfaces.h.inc -gen-attr-interface-decls)
 mlir_tablegen(LLVMAttrInterfaces.cpp.inc -gen-attr-interface-defs)
 mlir_tablegen(LLVMTypeInterfaces.h.inc -gen-type-interface-decls)
 mlir_tablegen(LLVMTypeInterfaces.cpp.inc -gen-type-interface-defs)
-add_mlir_dialect_tablegen_target(MLIRLLVMInterfacesIncGen)
+add_mlir_dialect_tablegen_target(MLIRLLVMInterfacesIncGen
+  OWNER MLIRLLVMDialect)
 
 set(LLVM_TARGET_DEFINITIONS LLVMOps.td)
 mlir_tablegen(LLVMConversions.inc -gen-llvmir-conversions)
 mlir_tablegen(LLVMConversionEnumsToLLVM.inc -gen-enum-to-llvmir-conversions)
 mlir_tablegen(LLVMConversionEnumsFromLLVM.inc -gen-enum-from-llvmir-conversions)
 mlir_tablegen(LLVMOpFromLLVMIRConversions.inc -gen-op-from-llvmir-conversions)
-add_mlir_dialect_tablegen_target(MLIRLLVMConversionsIncGen)
+add_mlir_dialect_tablegen_target(MLIRLLVMConversionsIncGen
+  OWNER MLIRLLVMDialect)
 
 set(LLVM_TARGET_DEFINITIONS LLVMIntrinsicOps.td)
 mlir_tablegen(LLVMIntrinsicConversions.inc -gen-llvmir-conversions)
 mlir_tablegen(LLVMIntrinsicFromLLVMIRConversions.inc -gen-intr-from-llvmir-conversions)
 mlir_tablegen(LLVMConvertibleLLVMIRIntrinsics.inc -gen-convertible-llvmir-intrinsics)
-add_mlir_dialect_tablegen_target(MLIRLLVMIntrinsicConversionsIncGen)
+add_mlir_dialect_tablegen_target(MLIRLLVMIntrinsicConversionsIncGen
+  OWNER MLIRLLVMDialect)
 
 set(LLVM_TARGET_DEFINITIONS LLVMDialectBytecode.td)
 mlir_tablegen(LLVMDialectBytecode.cpp.inc -gen-bytecode -bytecode-dialect="LLVM")
-add_public_tablegen_target(MLIRLLVMDialectBytecodeIncGen)
+add_mlir_library_tablegen_target(MLIRLLVMDialectBytecodeIncGen
+  MLIRLLVMDialect)
 
 set(LLVM_TARGET_DEFINITIONS BasicPtxBuilderInterface.td)
 mlir_tablegen(BasicPtxBuilderInterface.h.inc -gen-op-interface-decls)
 mlir_tablegen(BasicPtxBuilderInterface.cpp.inc -gen-op-interface-defs)
-add_mlir_dialect_tablegen_target(MLIRBasicPtxBuilderInterfaceIncGen)
+add_mlir_dialect_tablegen_target(MLIRBasicPtxBuilderInterfaceIncGen
+  OWNER MLIRNVVMDialect)
 
 set(LLVM_TARGET_DEFINITIONS NVVMRequiresSMTraits.td)
 mlir_tablegen(NVVMRequiresSMTraits.h.inc -gen-op-interface-decls)
 mlir_tablegen(NVVMRequiresSMTraits.cpp.inc -gen-op-interface-defs)
-add_mlir_dialect_tablegen_target(MLIRNVVMRequiresSMTraitsIncGen)
+add_mlir_dialect_tablegen_target(MLIRNVVMRequiresSMTraitsIncGen
+  OWNER MLIRNVVMDialect)
 
 add_mlir_dialect(NVVMOps nvvm)
 add_mlir_doc(NVVMOps NVVMOps Dialects/ -gen-op-doc -dialect=nvvm)
@@ -77,7 +84,8 @@ mlir_tablegen(NVVMOpsEnums.h.inc -gen-enum-decls)
 mlir_tablegen(NVVMOpsEnums.cpp.inc -gen-enum-defs)
 mlir_tablegen(NVVMOpsAttributes.h.inc -gen-attrdef-decls -attrdefs-dialect=nvvm)
 mlir_tablegen(NVVMOpsAttributes.cpp.inc -gen-attrdef-defs -attrdefs-dialect=nvvm)
-add_mlir_dialect_tablegen_target(MLIRNVVMConversionsIncGen)
+add_mlir_dialect_tablegen_target(MLIRNVVMConversionsIncGen
+  OWNER MLIRNVVMDialect)
 
 set(LLVM_TARGET_DEFINITIONS ROCDLOps.td)
 mlir_tablegen(ROCDLOps.h.inc -gen-op-decls -op-shard-count=8)
@@ -86,7 +94,7 @@ mlir_tablegen(ROCDLOpsTypes.h.inc -gen-typedef-decls -typedefs-dialect=rocdl)
 mlir_tablegen(ROCDLOpsTypes.cpp.inc -gen-typedef-defs -typedefs-dialect=rocdl)
 mlir_tablegen(ROCDLOpsDialect.h.inc -gen-dialect-decls -dialect=rocdl)
 mlir_tablegen(ROCDLOpsDialect.cpp.inc -gen-dialect-defs -dialect=rocdl)
-add_mlir_dialect_tablegen_target(MLIRROCDLOpsIncGen)
+add_mlir_dialect_tablegen_target(MLIRROCDLOpsIncGen OWNER MLIRROCDLDialect)
 add_mlir_doc(ROCDLOps ROCDLDialect Dialects/ -gen-dialect-doc -dialect=rocdl)
 set(LLVM_TARGET_DEFINITIONS ROCDLOps.td)
 mlir_tablegen(ROCDLConversions.inc -gen-llvmir-conversions)
@@ -94,7 +102,8 @@ mlir_tablegen(ROCDLOpsEnums.h.inc -gen-enum-decls)
 mlir_tablegen(ROCDLOpsEnums.cpp.inc -gen-enum-defs)
 mlir_tablegen(ROCDLOpsAttributes.h.inc -gen-attrdef-decls -attrdefs-dialect=rocdl)
 mlir_tablegen(ROCDLOpsAttributes.cpp.inc -gen-attrdef-defs -attrdefs-dialect=rocdl)
-add_mlir_dialect_tablegen_target(MLIRROCDLConversionsIncGen)
+add_mlir_dialect_tablegen_target(MLIRROCDLConversionsIncGen
+  OWNER MLIRROCDLDialect)
 
 add_mlir_dialect(VCIXOps vcix)
 add_mlir_doc(VCIXOps VCIXDialect Dialects/ -gen-dialect-doc -dialect=vcix)
@@ -102,7 +111,8 @@ set(LLVM_TARGET_DEFINITIONS VCIXOps.td)
 mlir_tablegen(VCIXConversions.inc -gen-llvmir-conversions)
 mlir_tablegen(VCIXOpsAttributes.h.inc -gen-attrdef-decls -attrdefs-dialect=vcix)
 mlir_tablegen(VCIXOpsAttributes.cpp.inc -gen-attrdef-defs -attrdefs-dialect=vcix)
-add_mlir_dialect_tablegen_target(MLIRVCIXConversionsIncGen)
+add_mlir_dialect_tablegen_target(MLIRVCIXConversionsIncGen
+  OWNER MLIRVCIXDialect)
 
 add_mlir_dialect(XeVMOps xevm)
 add_mlir_doc(XeVMOps XeVMDialect Dialects/ -gen-dialect-doc -dialect=xevm)
@@ -112,4 +122,5 @@ mlir_tablegen(XeVMOpsEnums.h.inc -gen-enum-decls)
 mlir_tablegen(XeVMOpsEnums.cpp.inc -gen-enum-defs)
 mlir_tablegen(XeVMOpsAttributes.h.inc -gen-attrdef-decls -attrdefs-dialect=xevm)
 mlir_tablegen(XeVMOpsAttributes.cpp.inc -gen-attrdef-defs -attrdefs-dialect=xevm)
-add_mlir_dialect_tablegen_target(MLIRXeVMConversionsIncGen)
+add_mlir_dialect_tablegen_target(MLIRXeVMConversionsIncGen
+  OWNER MLIRXeVMDialect)
diff --git a/mlir/include/mlir/Dialect/Ptr/IR/CMakeLists.txt b/mlir/include/mlir/Dialect/Ptr/IR/CMakeLists.txt
index 388d735843c4e..27d3373b8ca92 100644
--- a/mlir/include/mlir/Dialect/Ptr/IR/CMakeLists.txt
+++ b/mlir/include/mlir/Dialect/Ptr/IR/CMakeLists.txt
@@ -4,14 +4,16 @@ add_mlir_doc(PtrOps PtrOps Dialects/ -gen-dialect-doc -dialect=ptr)
 set(LLVM_TARGET_DEFINITIONS PtrOps.td)
 mlir_tablegen(PtrOpsAttrs.h.inc -gen-attrdef-decls -attrdefs-dialect=ptr)
 mlir_tablegen(PtrOpsAttrs.cpp.inc -gen-attrdef-defs -attrdefs-dialect=ptr)
-add_mlir_dialect_tablegen_target(MLIRPtrOpsAttributesIncGen)
+add_mlir_dialect_tablegen_target(MLIRPtrOpsAttributesIncGen
+  OWNER MLIRPtrDialect)
 
 set(LLVM_TARGET_DEFINITIONS MemorySpaceInterfaces.td)
 mlir_tablegen(MemorySpaceAttrInterfaces.h.inc -gen-attr-interface-decls)
 mlir_tablegen(MemorySpaceAttrInterfaces.cpp.inc -gen-attr-interface-defs)
-add_mlir_dialect_tablegen_target(MLIRPtrMemorySpaceInterfacesIncGen)
+add_mlir_dialect_tablegen_target(MLIRPtrMemorySpaceInterfacesIncGen
+  OWNER MLIRPtrMemorySpaceInterfaces)
 
 set(LLVM_TARGET_DEFINITIONS PtrOps.td)
 mlir_tablegen(PtrOpsEnums.h.inc -gen-enum-decls)
 mlir_tablegen(PtrOpsEnums.cpp.inc -gen-enum-defs)
-add_mlir_dialect_tablegen_target(MLIRPtrOpsEnumsGen)
+add_mlir_dialect_tablegen_target(MLIRPtrOpsEnumsGen OWNER MLIRPtrDialect)
diff --git a/mlir/include/mlir/Dialect/SPIRV/Transforms/CMakeLists.txt b/mlir/include/mlir/Dialect/SPIRV/Transforms/CMakeLists.txt
index a3eb69764a4cd..7e93131ee9df9 100644
--- a/mlir/include/mlir/Dialect/SPIRV/Transforms/CMakeLists.txt
+++ b/mlir/include/mlir/Dialect/SPIRV/Transforms/CMakeLists.txt
@@ -2,6 +2,7 @@ set(LLVM_TARGET_DEFINITIONS Passes.td)
 mlir_tablegen(Passes.h.inc -gen-pass-decls -name SPIRV)
 mlir_tablegen(Passes.capi.h.inc -gen-pass-capi-header --prefix SPIRV)
 mlir_tablegen(Passes.capi.cpp.inc -gen-pass-capi-impl --prefix SPIRV)
-add_mlir_dialect_tablegen_target(MLIRSPIRVPassIncGen)
+add_mlir_dialect_tablegen_target(MLIRSPIRVPassIncGen
+  OWNER MLIRSPIRVTransforms)
 
 add_mlir_doc(Passes SPIRVPasses ./ -gen-pass-doc)
diff --git a/mlir/include/mlir/Dialect/Transform/SMTExtension/CMakeLists.txt b/mlir/include/mlir/Dialect/Transform/SMTExtension/CMakeLists.txt
index 55e7c19fc3f14..092fdda0421e4 100644
--- a/mlir/include/mlir/Dialect/Transform/SMTExtension/CMakeLists.txt
+++ b/mlir/include/mlir/Dialect/Transform/SMTExtension/CMakeLists.txt
@@ -1,6 +1,7 @@
 set(LLVM_TARGET_DEFINITIONS SMTExtensionOps.td)
 mlir_tablegen(SMTExtensionOps.h.inc -gen-op-decls)
 mlir_tablegen(SMTExtensionOps.cpp.inc -gen-op-defs)
-add_public_tablegen_target(MLIRTransformDialectSMTExtensionOpsIncGen)
+add_mlir_library_tablegen_target(
+  MLIRTransformDialectSMTExtensionOpsIncGen MLIRTransformSMTExtension)
 
 add_mlir_doc(SMTExtensionOps SMTExtensionOps Dialects/ -gen-op-doc -dialect=transform)
diff --git a/mlir/include/mlir/Dialect/XeGPU/TransformOps/CMakeLists.txt b/mlir/include/mlir/Dialect/XeGPU/TransformOps/CMakeLists.txt
index 318d0d9c8c86a..49de59d313977 100644
--- a/mlir/include/mlir/Dialect/XeGPU/TransformOps/CMakeLists.txt
+++ b/mlir/include/mlir/Dialect/XeGPU/TransformOps/CMakeLists.txt
@@ -1,6 +1,7 @@
 set(LLVM_TARGET_DEFINITIONS XeGPUTransformOps.td)
 mlir_tablegen(XeGPUTransformOps.h.inc -gen-op-decls)
 mlir_tablegen(XeGPUTransformOps.cpp.inc -gen-op-defs)
-add_public_tablegen_target(MLIRXeGPUTransformOpsIncGen)
+add_mlir_library_tablegen_target(MLIRXeGPUTransformOpsIncGen
+  MLIRXeGPUTransformOps)
 
 add_mlir_doc(XeGPUTransformOps XeGPUTransformOps Dialects/ -gen-op-doc -dialect=transform)
diff --git a/mlir/include/mlir/IR/CMakeLists.txt b/mlir/include/mlir/IR/CMakeLists.txt
index 15518901b901a..d99e53892d987 100644
--- a/mlir/include/mlir/IR/CMakeLists.txt
+++ b/mlir/include/mlir/IR/CMakeLists.txt
@@ -47,7 +47,7 @@ add_mlir_generic_tablegen_target(MLIRBuiltinOpsIncGen)
 set(LLVM_TARGET_DEFINITIONS BuiltinTypes.td)
 mlir_tablegen(BuiltinTypes.h.inc -gen-typedef-decls)
 mlir_tablegen(BuiltinTypes.cpp.inc -gen-typedef-defs)
-add_public_tablegen_target(MLIRBuiltinTypesIncGen)
+add_mlir_library_tablegen_target(MLIRBuiltinTypesIncGen MLIRIR)
 mlir_tablegen(BuiltinTypeConstraints.h.inc -gen-type-constraint-decls)
 mlir_tablegen(BuiltinTypeConstraints.cpp.inc -gen-type-constraint-defs)
 add_mlir_generic_tablegen_target(MLIRBuiltinTypeConstraintsIncGen)
diff --git a/mlir/include/mlir/Interfaces/CMakeLists.txt b/mlir/include/mlir/Interfaces/CMakeLists.txt
index 6461c68423c73..bcf2253d70e5c 100644
--- a/mlir/include/mlir/Interfaces/CMakeLists.txt
+++ b/mlir/include/mlir/Interfaces/CMakeLists.txt
@@ -41,7 +41,7 @@ add_mlir_generic_tablegen_target(MLIRDataLayoutInterfacesIncGen)
 
 set(LLVM_TARGET_DEFINITIONS DialectFoldInterface.td)
 mlir_tablegen(DialectFoldInterface.h.inc -gen-dialect-interface-decls)
-add_mlir_generic_tablegen_target(MLIRDialectFoldInterfaceIncGen)
+add_mlir_generic_tablegen_target(MLIRDialectFoldInterfaceIncGen OWNER MLIRIR)
 
 
 add_mlir_doc(DataLayoutInterfaces
diff --git a/mlir/include/mlir/Target/LLVMIR/CMakeLists.txt b/mlir/include/mlir/Target/LLVMIR/CMakeLists.txt
index 8cf9a9cd864da..027cd3b466138 100644
--- a/mlir/include/mlir/Target/LLVMIR/CMakeLists.txt
+++ b/mlir/include/mlir/Target/LLVMIR/CMakeLists.txt
@@ -2,8 +2,10 @@ add_subdirectory(Transforms)
 
 set(LLVM_TARGET_DEFINITIONS LLVMTranslationDialectInterface.td)
 mlir_tablegen(LLVMTranslationDialectInterface.h.inc -gen-dialect-interface-decls)
-add_mlir_generic_tablegen_target(MLIRLLVMTranslationDialectInterfaceIncGen)
+add_mlir_generic_tablegen_target(MLIRLLVMTranslationDialectInterfaceIncGen
+  OWNER MLIRTargetLLVMIRExport)
 
 set(LLVM_TARGET_DEFINITIONS LLVMImportDialectInterface.td)
 mlir_tablegen(LLVMImportDialectInterface.h.inc -gen-dialect-interface-decls)
-add_mlir_generic_tablegen_target(MLIRLLVMImportDialectInterfaceIncGen)
+add_mlir_generic_tablegen_target(MLIRLLVMImportDialectInterfaceIncGen
+  OWNER MLIRTargetLLVMIRImport)
diff --git a/mlir/lib/CAPI/Conversion/CMakeLists.txt b/mlir/lib/CAPI/Conversion/CMakeLists.txt
index 8cafc09d363cd..166e79916be03 100644
--- a/mlir/lib/CAPI/Conversion/CMakeLists.txt
+++ b/mlir/lib/CAPI/Conversion/CMakeLists.txt
@@ -2,9 +2,6 @@ get_property(conversion_libs GLOBAL PROPERTY MLIR_CONVERSION_LIBS)
 add_mlir_upstream_c_api_library(MLIRCAPIConversion
   Passes.cpp
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   ${conversion_libs}
 )
diff --git a/mlir/lib/CAPI/Dialect/CMakeLists.txt b/mlir/lib/CAPI/Dialect/CMakeLists.txt
index 551f5a5a3df77..eaab77e95cf2b 100644
--- a/mlir/lib/CAPI/Dialect/CMakeLists.txt
+++ b/mlir/lib/CAPI/Dialect/CMakeLists.txt
@@ -3,8 +3,6 @@ add_mlir_upstream_c_api_library(MLIRCAPIAffine
   AffinePasses.cpp
 
   PARTIAL_SOURCES_INTENDED
-  DEPENDS
-  MLIRAffinePassIncGen
 
   LINK_LIBS PUBLIC
   MLIRCAPIIR
@@ -17,8 +15,6 @@ add_mlir_upstream_c_api_library(MLIRCAPIAMDGPU
   AMDGPUPasses.cpp
 
   PARTIAL_SOURCES_INTENDED
-  DEPENDS
-  MLIRNVGPUPassIncGen
 
   LINK_LIBS PUBLIC
   MLIRCAPIIR
@@ -63,8 +59,6 @@ add_mlir_upstream_c_api_library(MLIRCAPIArmSVE
   ArmSVEPasses.cpp
 
   PARTIAL_SOURCES_INTENDED
-  DEPENDS
-  MLIRArmSVEPassIncGen
 
   LINK_LIBS PUBLIC
   MLIRCAPIIR
@@ -77,8 +71,6 @@ add_mlir_upstream_c_api_library(MLIRCAPIAsync
   AsyncPasses.cpp
 
   PARTIAL_SOURCES_INTENDED
-  DEPENDS
-  MLIRAsyncPassIncGen
 
   LINK_LIBS PUBLIC
   MLIRCAPIIR
@@ -92,8 +84,6 @@ add_mlir_upstream_c_api_library(MLIRCAPIBufferization
   BufferizationPasses.cpp
 
   PARTIAL_SOURCES_INTENDED
-  DEPENDS
-  MLIRBufferizationPassIncGen
 
   LINK_LIBS PUBLIC
   MLIRCAPIIR
@@ -156,8 +146,6 @@ add_mlir_upstream_c_api_library(MLIRCAPIGPU
   GPUPasses.cpp
 
   PARTIAL_SOURCES_INTENDED
-  DEPENDS
-  MLIRGPUPassIncGen
 
   LINK_LIBS PUBLIC
   MLIRCAPIIR
@@ -188,8 +176,6 @@ add_mlir_upstream_c_api_library(MLIRCAPILinalg
   LinalgPasses.cpp
 
   PARTIAL_SOURCES_INTENDED
-  DEPENDS
-  MLIRLinalgPassIncGen
 
   LINK_LIBS PUBLIC
   MLIRCAPIIR
@@ -226,8 +212,6 @@ add_mlir_upstream_c_api_library(MLIRCAPIMemRef
 
   PARTIAL_SOURCES_INTENDED
   PARTIAL_SOURCES_INTENDED
-  DEPENDS
-  MLIRMemRefPassIncGen
 
   LINK_LIBS PUBLIC
   MLIRCAPIIR
@@ -240,8 +224,6 @@ add_mlir_upstream_c_api_library(MLIRCAPIMLProgram
   MLProgramPasses.cpp
 
   PARTIAL_SOURCES_INTENDED
-  DEPENDS
-  MLIRMLProgramPassIncGen
 
   LINK_LIBS PUBLIC
   MLIRCAPIIR
@@ -263,8 +245,6 @@ add_mlir_upstream_c_api_library(MLIRCAPINVGPU
   NVGPUPasses.cpp
 
   PARTIAL_SOURCES_INTENDED
-  DEPENDS
-  MLIRNVGPUPassIncGen
 
   LINK_LIBS PUBLIC
   MLIRCAPIIR
@@ -286,8 +266,6 @@ add_mlir_upstream_c_api_library(MLIRCAPIOpenACC
   OpenACCPasses.cpp
 
   PARTIAL_SOURCES_INTENDED
-  DEPENDS
-  MLIROpenACCPassIncGen
 
   LINK_LIBS PUBLIC
   MLIRCAPIIR
@@ -354,8 +332,6 @@ add_mlir_upstream_c_api_library(MLIRCAPISCF
   SCFPasses.cpp
 
   PARTIAL_SOURCES_INTENDED
-  DEPENDS
-  MLIRSCFPassIncGen
 
   LINK_LIBS PUBLIC
   MLIRCAPIIR
@@ -379,8 +355,6 @@ add_mlir_upstream_c_api_library(MLIRCAPIShard
   ShardPasses.cpp
 
   PARTIAL_SOURCES_INTENDED
-  DEPENDS
-  MLIRShardPassIncGen
 
   LINK_LIBS PUBLIC
   MLIRCAPIIR
@@ -402,8 +376,6 @@ add_mlir_upstream_c_api_library(MLIRCAPISparseTensor
   SparseTensorPasses.cpp
 
   PARTIAL_SOURCES_INTENDED
-  DEPENDS
-  MLIRSparseTensorPassIncGen
 
   LINK_LIBS PUBLIC
   MLIRCAPIIR
@@ -416,8 +388,6 @@ add_mlir_upstream_c_api_library(MLIRCAPISPIRV
   SPIRVPasses.cpp
 
   PARTIAL_SOURCES_INTENDED
-  DEPENDS
-  MLIRSPIRVPassIncGen
 
   LINK_LIBS PUBLIC
   MLIRCAPIIR
@@ -441,8 +411,6 @@ add_mlir_upstream_c_api_library(MLIRCAPITosa
   TosaPasses.cpp
 
   PARTIAL_SOURCES_INTENDED
-  DEPENDS
-  MLIRTosaPassIncGen
 
   LINK_LIBS PUBLIC
   MLIRCAPIIR
diff --git a/mlir/lib/Conversion/AMDGPUToROCDL/CMakeLists.txt b/mlir/lib/Conversion/AMDGPUToROCDL/CMakeLists.txt
index 25cceb9d1d37f..a65a23cb31598 100644
--- a/mlir/lib/Conversion/AMDGPUToROCDL/CMakeLists.txt
+++ b/mlir/lib/Conversion/AMDGPUToROCDL/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRAMDGPUToROCDL
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/AMDGPUToROCDL
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/AffineToStandard/CMakeLists.txt b/mlir/lib/Conversion/AffineToStandard/CMakeLists.txt
index cd8193aee8da3..87a72ed33bfc4 100644
--- a/mlir/lib/Conversion/AffineToStandard/CMakeLists.txt
+++ b/mlir/lib/Conversion/AffineToStandard/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRAffineToStandard
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/AffineToStandard
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineDialect
   MLIRAffineTransforms
diff --git a/mlir/lib/Conversion/ArithAndMathToAPFloat/CMakeLists.txt b/mlir/lib/Conversion/ArithAndMathToAPFloat/CMakeLists.txt
index a7a89a0a463fc..df7c1663a1539 100644
--- a/mlir/lib/Conversion/ArithAndMathToAPFloat/CMakeLists.txt
+++ b/mlir/lib/Conversion/ArithAndMathToAPFloat/CMakeLists.txt
@@ -14,9 +14,6 @@ add_mlir_conversion_library(MLIRArithToAPFloat
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ArithToLLVM
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
@@ -36,9 +33,6 @@ add_mlir_conversion_library(MLIRMathToAPFloat
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/MathToLLVM
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/ArithToAMDGPU/CMakeLists.txt b/mlir/lib/Conversion/ArithToAMDGPU/CMakeLists.txt
index 50be09ab5a7c5..3eed659c35655 100644
--- a/mlir/lib/Conversion/ArithToAMDGPU/CMakeLists.txt
+++ b/mlir/lib/Conversion/ArithToAMDGPU/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRArithToAMDGPU
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ArithToAMDGPU
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/ArithToArmSME/CMakeLists.txt b/mlir/lib/Conversion/ArithToArmSME/CMakeLists.txt
index c2a6fe5398e7c..7bb8627b380c1 100644
--- a/mlir/lib/Conversion/ArithToArmSME/CMakeLists.txt
+++ b/mlir/lib/Conversion/ArithToArmSME/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRArithToArmSME
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ArithToArmSME
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/ArithToEmitC/CMakeLists.txt b/mlir/lib/Conversion/ArithToEmitC/CMakeLists.txt
index 46f9aacbb14e1..c71e956deecc9 100644
--- a/mlir/lib/Conversion/ArithToEmitC/CMakeLists.txt
+++ b/mlir/lib/Conversion/ArithToEmitC/CMakeLists.txt
@@ -5,9 +5,6 @@ add_mlir_conversion_library(MLIRArithToEmitC
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ArithToEmitC
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIREmitCCommonConversion
diff --git a/mlir/lib/Conversion/ArithToLLVM/CMakeLists.txt b/mlir/lib/Conversion/ArithToLLVM/CMakeLists.txt
index 0a0e25e18b47a..e441f3fa6e21b 100644
--- a/mlir/lib/Conversion/ArithToLLVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/ArithToLLVM/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRArithToLLVM
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ArithToLLVM
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/ArithToSPIRV/CMakeLists.txt b/mlir/lib/Conversion/ArithToSPIRV/CMakeLists.txt
index a5385d9cee6af..5096adf6e247d 100644
--- a/mlir/lib/Conversion/ArithToSPIRV/CMakeLists.txt
+++ b/mlir/lib/Conversion/ArithToSPIRV/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRArithToSPIRV
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ArithToSPIRV
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/ArmNeon2dToIntr/CMakeLists.txt b/mlir/lib/Conversion/ArmNeon2dToIntr/CMakeLists.txt
index bab9d6e289418..7afead9b90df9 100644
--- a/mlir/lib/Conversion/ArmNeon2dToIntr/CMakeLists.txt
+++ b/mlir/lib/Conversion/ArmNeon2dToIntr/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRArmNeon2dToIntr
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ArmNeon2dToIntr
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/ArmSMEToLLVM/CMakeLists.txt b/mlir/lib/Conversion/ArmSMEToLLVM/CMakeLists.txt
index d0a921296668d..9975466611865 100644
--- a/mlir/lib/Conversion/ArmSMEToLLVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/ArmSMEToLLVM/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRArmSMEToLLVM
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ArmSMEToLLVM
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRArmSMETransforms
   MLIRArmSMEDialect
diff --git a/mlir/lib/Conversion/ArmSMEToSCF/CMakeLists.txt b/mlir/lib/Conversion/ArmSMEToSCF/CMakeLists.txt
index 467c3b942e754..c9842044f4298 100644
--- a/mlir/lib/Conversion/ArmSMEToSCF/CMakeLists.txt
+++ b/mlir/lib/Conversion/ArmSMEToSCF/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRArmSMEToSCF
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ArmSMEToSCF
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRArmSMEDialect
   MLIRTransforms
diff --git a/mlir/lib/Conversion/AsyncToLLVM/CMakeLists.txt b/mlir/lib/Conversion/AsyncToLLVM/CMakeLists.txt
index ca692bb2a1b6d..094f1f3c5ec28 100644
--- a/mlir/lib/Conversion/AsyncToLLVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/AsyncToLLVM/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRAsyncToLLVM
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/AsyncToLLVM
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/BufferizationToMemRef/CMakeLists.txt b/mlir/lib/Conversion/BufferizationToMemRef/CMakeLists.txt
index fc32d3dcf2cb6..e4b37dc3093ff 100644
--- a/mlir/lib/Conversion/BufferizationToMemRef/CMakeLists.txt
+++ b/mlir/lib/Conversion/BufferizationToMemRef/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRBufferizationToMemRef
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/BufferizationToMemRef
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRBufferizationDialect
   MLIRBufferizationTransforms
diff --git a/mlir/lib/Conversion/ComplexToLLVM/CMakeLists.txt b/mlir/lib/Conversion/ComplexToLLVM/CMakeLists.txt
index 074bc4bc3f0d7..ad674dd3f1f2a 100644
--- a/mlir/lib/Conversion/ComplexToLLVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/ComplexToLLVM/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRComplexToLLVM
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ComplexToLLVM
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/ComplexToLibm/CMakeLists.txt b/mlir/lib/Conversion/ComplexToLibm/CMakeLists.txt
index 5465e4b9fd969..4638f76506086 100644
--- a/mlir/lib/Conversion/ComplexToLibm/CMakeLists.txt
+++ b/mlir/lib/Conversion/ComplexToLibm/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRComplexToLibm
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ComplexToLibm
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/ComplexToROCDLLibraryCalls/CMakeLists.txt b/mlir/lib/Conversion/ComplexToROCDLLibraryCalls/CMakeLists.txt
index 695bb2dd0a82c..c67a029c49c2f 100644
--- a/mlir/lib/Conversion/ComplexToROCDLLibraryCalls/CMakeLists.txt
+++ b/mlir/lib/Conversion/ComplexToROCDLLibraryCalls/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRComplexToROCDLLibraryCalls
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ComplexToROCDLLibraryCalls
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/ComplexToSPIRV/CMakeLists.txt b/mlir/lib/Conversion/ComplexToSPIRV/CMakeLists.txt
index 59bc1a9538fd5..fb25be0e01ff6 100644
--- a/mlir/lib/Conversion/ComplexToSPIRV/CMakeLists.txt
+++ b/mlir/lib/Conversion/ComplexToSPIRV/CMakeLists.txt
@@ -6,9 +6,6 @@ add_mlir_conversion_library(MLIRComplexToSPIRV
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/SPIRV
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/IR
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRComplexDialect
   MLIRIR
diff --git a/mlir/lib/Conversion/ComplexToStandard/CMakeLists.txt b/mlir/lib/Conversion/ComplexToStandard/CMakeLists.txt
index c3cf92f57b48d..c0b84e245628f 100644
--- a/mlir/lib/Conversion/ComplexToStandard/CMakeLists.txt
+++ b/mlir/lib/Conversion/ComplexToStandard/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRComplexToStandard
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ComplexToStandard
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRComplexDivisionConversion
diff --git a/mlir/lib/Conversion/ControlFlowToLLVM/CMakeLists.txt b/mlir/lib/Conversion/ControlFlowToLLVM/CMakeLists.txt
index dcc78c8367a43..e17ce2bbe9601 100644
--- a/mlir/lib/Conversion/ControlFlowToLLVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/ControlFlowToLLVM/CMakeLists.txt
@@ -5,7 +5,6 @@ add_mlir_conversion_library(MLIRControlFlowToLLVM
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ControlFlowToLLVM
 
   DEPENDS
-  MLIRConversionPassIncGen
   intrinsics_gen
 
   LINK_COMPONENTS
diff --git a/mlir/lib/Conversion/ControlFlowToSCF/CMakeLists.txt b/mlir/lib/Conversion/ControlFlowToSCF/CMakeLists.txt
index e2f1677b1d069..bd52705c85ce6 100644
--- a/mlir/lib/Conversion/ControlFlowToSCF/CMakeLists.txt
+++ b/mlir/lib/Conversion/ControlFlowToSCF/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRControlFlowToSCF
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ControlFlowToSCF
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRAnalysis
   MLIRArithDialect
diff --git a/mlir/lib/Conversion/ControlFlowToSPIRV/CMakeLists.txt b/mlir/lib/Conversion/ControlFlowToSPIRV/CMakeLists.txt
index 5be89822c0b0d..73788f4304806 100644
--- a/mlir/lib/Conversion/ControlFlowToSPIRV/CMakeLists.txt
+++ b/mlir/lib/Conversion/ControlFlowToSPIRV/CMakeLists.txt
@@ -6,9 +6,6 @@ add_mlir_conversion_library(MLIRControlFlowToSPIRV
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/SPIRV
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/IR
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRControlFlowDialect
diff --git a/mlir/lib/Conversion/ConvertToEmitC/CMakeLists.txt b/mlir/lib/Conversion/ConvertToEmitC/CMakeLists.txt
index e893d5cd1d35e..7e2ac0a7a9831 100644
--- a/mlir/lib/Conversion/ConvertToEmitC/CMakeLists.txt
+++ b/mlir/lib/Conversion/ConvertToEmitC/CMakeLists.txt
@@ -4,10 +4,6 @@ add_mlir_conversion_library(MLIRConvertToEmitC
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ConvertToEmitC
 
-  DEPENDS
-  MLIRConversionPassIncGen
-  MLIRConvertToEmitCPatternInterfaceIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithToEmitC
   MLIREmitCCommonConversion
diff --git a/mlir/lib/Conversion/ConvertToLLVM/CMakeLists.txt b/mlir/lib/Conversion/ConvertToLLVM/CMakeLists.txt
index c71711ba2ebed..02e4207fbbe1a 100644
--- a/mlir/lib/Conversion/ConvertToLLVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/ConvertToLLVM/CMakeLists.txt
@@ -6,9 +6,6 @@ set(LLVM_OPTIONAL_SOURCES
 add_mlir_conversion_library(MLIRConvertToLLVMInterface
   ToLLVMInterface.cpp
 
-  DEPENDS
-  MLIRConvertToLLVMInterfaceIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRSupport
@@ -17,9 +14,6 @@ add_mlir_conversion_library(MLIRConvertToLLVMInterface
 add_mlir_conversion_library(MLIRConvertToLLVMPass
   ConvertToLLVMPass.cpp
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRConvertToLLVMInterface
diff --git a/mlir/lib/Conversion/FuncToEmitC/CMakeLists.txt b/mlir/lib/Conversion/FuncToEmitC/CMakeLists.txt
index c5d831f59379d..568657a4aa6e1 100644
--- a/mlir/lib/Conversion/FuncToEmitC/CMakeLists.txt
+++ b/mlir/lib/Conversion/FuncToEmitC/CMakeLists.txt
@@ -5,9 +5,6 @@ add_mlir_conversion_library(MLIRFuncToEmitC
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/FuncToEmitC
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIREmitCCommonConversion
   MLIREmitCDialect
diff --git a/mlir/lib/Conversion/FuncToLLVM/CMakeLists.txt b/mlir/lib/Conversion/FuncToLLVM/CMakeLists.txt
index 17d8dad335c55..64769919a0672 100644
--- a/mlir/lib/Conversion/FuncToLLVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/FuncToLLVM/CMakeLists.txt
@@ -5,7 +5,6 @@ add_mlir_conversion_library(MLIRFuncToLLVM
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/FuncToLLVM
 
   DEPENDS
-  MLIRConversionPassIncGen
   intrinsics_gen
 
   LINK_COMPONENTS
diff --git a/mlir/lib/Conversion/FuncToSPIRV/CMakeLists.txt b/mlir/lib/Conversion/FuncToSPIRV/CMakeLists.txt
index fca2c670915ad..ed83423494207 100644
--- a/mlir/lib/Conversion/FuncToSPIRV/CMakeLists.txt
+++ b/mlir/lib/Conversion/FuncToSPIRV/CMakeLists.txt
@@ -6,9 +6,6 @@ add_mlir_conversion_library(MLIRFuncToSPIRV
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/SPIRV
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/IR
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRFuncDialect
   MLIRIR
diff --git a/mlir/lib/Conversion/GPUCommon/CMakeLists.txt b/mlir/lib/Conversion/GPUCommon/CMakeLists.txt
index 8bcde866ee00d..c9288850c5620 100644
--- a/mlir/lib/Conversion/GPUCommon/CMakeLists.txt
+++ b/mlir/lib/Conversion/GPUCommon/CMakeLists.txt
@@ -21,7 +21,6 @@ add_mlir_conversion_library(MLIRGPUToGPURuntimeTransforms
   IndexIntrinsicsOpLowering.cpp
 
   DEPENDS
-  MLIRConversionPassIncGen
   intrinsics_gen
 
   LINK_COMPONENTS
diff --git a/mlir/lib/Conversion/GPUToLLVMSPV/CMakeLists.txt b/mlir/lib/Conversion/GPUToLLVMSPV/CMakeLists.txt
index f2381c623e201..f141b19749f68 100644
--- a/mlir/lib/Conversion/GPUToLLVMSPV/CMakeLists.txt
+++ b/mlir/lib/Conversion/GPUToLLVMSPV/CMakeLists.txt
@@ -1,9 +1,6 @@
 add_mlir_conversion_library(MLIRGPUToLLVMSPV
   GPUToLLVMSPV.cpp
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRGPUDialect
   MLIRGPUToGPURuntimeTransforms
diff --git a/mlir/lib/Conversion/GPUToNVVM/CMakeLists.txt b/mlir/lib/Conversion/GPUToNVVM/CMakeLists.txt
index 06137bdb41d71..a8b5c9923c725 100644
--- a/mlir/lib/Conversion/GPUToNVVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/GPUToNVVM/CMakeLists.txt
@@ -2,9 +2,6 @@ add_mlir_conversion_library(MLIRGPUToNVVMTransforms
   LowerGpuOpsToNVVMOps.cpp
   WmmaOpsToNvvm.cpp
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithToLLVM
   MLIRFuncToLLVM
diff --git a/mlir/lib/Conversion/GPUToROCDL/CMakeLists.txt b/mlir/lib/Conversion/GPUToROCDL/CMakeLists.txt
index 945e3ccdfa87b..05ea4b917f4b1 100644
--- a/mlir/lib/Conversion/GPUToROCDL/CMakeLists.txt
+++ b/mlir/lib/Conversion/GPUToROCDL/CMakeLists.txt
@@ -1,14 +1,11 @@
 set(LLVM_TARGET_DEFINITIONS GPUToROCDL.td)
 mlir_tablegen(GPUToROCDL.cpp.inc -gen-rewriters)
-add_public_tablegen_target(MLIRGPUToROCDLIncGen)
+add_mlir_library_tablegen_target(MLIRGPUToROCDLIncGen
+  MLIRGPUToROCDLTransforms)
 
 add_mlir_conversion_library(MLIRGPUToROCDLTransforms
   LowerGpuOpsToROCDLOps.cpp
 
-  DEPENDS
-  MLIRConversionPassIncGen
-  MLIRGPUToROCDLIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithToLLVM
   MLIRArithTransforms
diff --git a/mlir/lib/Conversion/GPUToSPIRV/CMakeLists.txt b/mlir/lib/Conversion/GPUToSPIRV/CMakeLists.txt
index 7e97eeb2e2496..5047c5fec0390 100644
--- a/mlir/lib/Conversion/GPUToSPIRV/CMakeLists.txt
+++ b/mlir/lib/Conversion/GPUToSPIRV/CMakeLists.txt
@@ -3,9 +3,6 @@ add_mlir_conversion_library(MLIRGPUToSPIRV
   GPUToSPIRVPass.cpp
   WmmaOpsToSPIRV.cpp
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithToSPIRV
   MLIRGPUDialect
diff --git a/mlir/lib/Conversion/IndexToLLVM/CMakeLists.txt b/mlir/lib/Conversion/IndexToLLVM/CMakeLists.txt
index a33a61852d748..2e4fce00cca24 100644
--- a/mlir/lib/Conversion/IndexToLLVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/IndexToLLVM/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRIndexToLLVM
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/IndexToLLVM
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/IndexToSPIRV/CMakeLists.txt b/mlir/lib/Conversion/IndexToSPIRV/CMakeLists.txt
index a02d2d40a9a2f..9b32910198b82 100644
--- a/mlir/lib/Conversion/IndexToSPIRV/CMakeLists.txt
+++ b/mlir/lib/Conversion/IndexToSPIRV/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRIndexToSPIRV
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/IndexToSPIRV
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/LinalgToStandard/CMakeLists.txt b/mlir/lib/Conversion/LinalgToStandard/CMakeLists.txt
index 7fc4af5403185..dfa06540544ac 100644
--- a/mlir/lib/Conversion/LinalgToStandard/CMakeLists.txt
+++ b/mlir/lib/Conversion/LinalgToStandard/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRLinalgToStandard
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/LinalgToStandard
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/MPIToLLVM/CMakeLists.txt b/mlir/lib/Conversion/MPIToLLVM/CMakeLists.txt
index 51ffbd1fa42ab..ca7473e7f9e1a 100644
--- a/mlir/lib/Conversion/MPIToLLVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/MPIToLLVM/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRMPIToLLVM
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/MPIToLLVM
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/MathToEmitC/CMakeLists.txt b/mlir/lib/Conversion/MathToEmitC/CMakeLists.txt
index 12a99c31e2ba5..1acc09702db5a 100644
--- a/mlir/lib/Conversion/MathToEmitC/CMakeLists.txt
+++ b/mlir/lib/Conversion/MathToEmitC/CMakeLists.txt
@@ -5,9 +5,6 @@ add_mlir_conversion_library(MLIRMathToEmitC
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/MathToEmitC
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/MathToFuncs/CMakeLists.txt b/mlir/lib/Conversion/MathToFuncs/CMakeLists.txt
index 2ac191cac22a0..1a28389adc281 100644
--- a/mlir/lib/Conversion/MathToFuncs/CMakeLists.txt
+++ b/mlir/lib/Conversion/MathToFuncs/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRMathToFuncs
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/MathToFuncs
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/MathToLLVM/CMakeLists.txt b/mlir/lib/Conversion/MathToLLVM/CMakeLists.txt
index 97393fc849691..165ba9c808f7d 100644
--- a/mlir/lib/Conversion/MathToLLVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/MathToLLVM/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRMathToLLVM
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/MathToLLVM
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/MathToLibm/CMakeLists.txt b/mlir/lib/Conversion/MathToLibm/CMakeLists.txt
index 0a4eb97474f3a..78cece30fa815 100644
--- a/mlir/lib/Conversion/MathToLibm/CMakeLists.txt
+++ b/mlir/lib/Conversion/MathToLibm/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRMathToLibm
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/MathToLibm
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/MathToNVVM/CMakeLists.txt b/mlir/lib/Conversion/MathToNVVM/CMakeLists.txt
index 589700d32646c..282a5f27573d9 100644
--- a/mlir/lib/Conversion/MathToNVVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/MathToNVVM/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRMathToNVVM
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/MathToNVVM
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/MathToROCDL/CMakeLists.txt b/mlir/lib/Conversion/MathToROCDL/CMakeLists.txt
index 8cc3fde827830..66cfd9ca33950 100644
--- a/mlir/lib/Conversion/MathToROCDL/CMakeLists.txt
+++ b/mlir/lib/Conversion/MathToROCDL/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRMathToROCDL
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/MathToROCDL
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/MathToSPIRV/CMakeLists.txt b/mlir/lib/Conversion/MathToSPIRV/CMakeLists.txt
index cbeb7a241b08d..2ddbeef8b275f 100644
--- a/mlir/lib/Conversion/MathToSPIRV/CMakeLists.txt
+++ b/mlir/lib/Conversion/MathToSPIRV/CMakeLists.txt
@@ -6,9 +6,6 @@ add_mlir_conversion_library(MLIRMathToSPIRV
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/SPIRV
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/IR
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRMathDialect
diff --git a/mlir/lib/Conversion/MathToXeVM/CMakeLists.txt b/mlir/lib/Conversion/MathToXeVM/CMakeLists.txt
index e8551d5ba70f2..ce20e7b9dfe51 100644
--- a/mlir/lib/Conversion/MathToXeVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/MathToXeVM/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRMathToXeVM
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/MathToXeVM
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/MemRefToEmitC/CMakeLists.txt b/mlir/lib/Conversion/MemRefToEmitC/CMakeLists.txt
index 23a40e7e48b8d..2806146911ad6 100644
--- a/mlir/lib/Conversion/MemRefToEmitC/CMakeLists.txt
+++ b/mlir/lib/Conversion/MemRefToEmitC/CMakeLists.txt
@@ -5,9 +5,6 @@ add_mlir_conversion_library(MLIRMemRefToEmitC
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/MemRefToEmitC
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/MemRefToLLVM/CMakeLists.txt b/mlir/lib/Conversion/MemRefToLLVM/CMakeLists.txt
index 9da4b23d42f41..5523b17e003d3 100644
--- a/mlir/lib/Conversion/MemRefToLLVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/MemRefToLLVM/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRMemRefToLLVM
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/MemRefToLLVM
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/MemRefToSPIRV/CMakeLists.txt b/mlir/lib/Conversion/MemRefToSPIRV/CMakeLists.txt
index ca49f93748ce7..0195086dd6079 100644
--- a/mlir/lib/Conversion/MemRefToSPIRV/CMakeLists.txt
+++ b/mlir/lib/Conversion/MemRefToSPIRV/CMakeLists.txt
@@ -7,9 +7,6 @@ add_mlir_conversion_library(MLIRMemRefToSPIRV
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/SPIRV
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/IR
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRFunctionInterfaces
   MLIRIR
diff --git a/mlir/lib/Conversion/NVGPUToNVVM/CMakeLists.txt b/mlir/lib/Conversion/NVGPUToNVVM/CMakeLists.txt
index 2e0a417bd823d..b6f5db788da76 100644
--- a/mlir/lib/Conversion/NVGPUToNVVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/NVGPUToNVVM/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRNVGPUToNVVM
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/NVGPUToNVVM
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/NVVMToLLVM/CMakeLists.txt b/mlir/lib/Conversion/NVVMToLLVM/CMakeLists.txt
index 23174d1128719..0a7786379cd27 100644
--- a/mlir/lib/Conversion/NVVMToLLVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/NVVMToLLVM/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRNVVMToLLVM
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/NVVMToLLVM
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/OpenACCToLLVM/CMakeLists.txt b/mlir/lib/Conversion/OpenACCToLLVM/CMakeLists.txt
index 1cd092181f7dc..a66e735d5243c 100644
--- a/mlir/lib/Conversion/OpenACCToLLVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/OpenACCToLLVM/CMakeLists.txt
@@ -7,9 +7,6 @@ add_mlir_conversion_library(MLIROpenACCToLLVM
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/OpenACCToLLVM
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithToLLVM
   MLIRComplexDialect
diff --git a/mlir/lib/Conversion/OpenACCToSCF/CMakeLists.txt b/mlir/lib/Conversion/OpenACCToSCF/CMakeLists.txt
index aa90db92c582f..7f5a3b5d084d3 100644
--- a/mlir/lib/Conversion/OpenACCToSCF/CMakeLists.txt
+++ b/mlir/lib/Conversion/OpenACCToSCF/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIROpenACCToSCF
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/OpenACCToSCF
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRIR
diff --git a/mlir/lib/Conversion/OpenMPToLLVM/CMakeLists.txt b/mlir/lib/Conversion/OpenMPToLLVM/CMakeLists.txt
index c5f84aa95e64f..9279874d02e8e 100644
--- a/mlir/lib/Conversion/OpenMPToLLVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/OpenMPToLLVM/CMakeLists.txt
@@ -5,7 +5,6 @@ add_mlir_conversion_library(MLIROpenMPToLLVM
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/OpenMPToLLVM
 
   DEPENDS
-  MLIRConversionPassIncGen
   intrinsics_gen
 
   LINK_COMPONENTS
diff --git a/mlir/lib/Conversion/PDLToPDLInterp/CMakeLists.txt b/mlir/lib/Conversion/PDLToPDLInterp/CMakeLists.txt
index fac84b14203bf..97a739303713f 100644
--- a/mlir/lib/Conversion/PDLToPDLInterp/CMakeLists.txt
+++ b/mlir/lib/Conversion/PDLToPDLInterp/CMakeLists.txt
@@ -7,9 +7,6 @@ add_mlir_conversion_library(MLIRPDLToPDLInterp
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/PDLToPDLInterp
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRInferTypeOpInterface
diff --git a/mlir/lib/Conversion/PtrToLLVM/CMakeLists.txt b/mlir/lib/Conversion/PtrToLLVM/CMakeLists.txt
index 2d416be13ee30..0b53f02a35e0e 100644
--- a/mlir/lib/Conversion/PtrToLLVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/PtrToLLVM/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRPtrToLLVM
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/PtrToLLVM
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/RaiseWasm/CMakeLists.txt b/mlir/lib/Conversion/RaiseWasm/CMakeLists.txt
index 43b5fd79e49df..537dae40d571d 100644
--- a/mlir/lib/Conversion/RaiseWasm/CMakeLists.txt
+++ b/mlir/lib/Conversion/RaiseWasm/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRWasmRaise
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/RaiseWasm
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRControlFlowDialect
diff --git a/mlir/lib/Conversion/ReconcileUnrealizedCasts/CMakeLists.txt b/mlir/lib/Conversion/ReconcileUnrealizedCasts/CMakeLists.txt
index 1bed0d6944c08..72a31fb73a0d8 100644
--- a/mlir/lib/Conversion/ReconcileUnrealizedCasts/CMakeLists.txt
+++ b/mlir/lib/Conversion/ReconcileUnrealizedCasts/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRReconcileUnrealizedCasts
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ReconcileUnrealizedCasts
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/SCFToAffine/CMakeLists.txt b/mlir/lib/Conversion/SCFToAffine/CMakeLists.txt
index f978d8309fc39..e6a3fa6e30fea 100644
--- a/mlir/lib/Conversion/SCFToAffine/CMakeLists.txt
+++ b/mlir/lib/Conversion/SCFToAffine/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRSCFToAffine
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/SCFToAffine
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineDialect
   MLIRArithDialect
diff --git a/mlir/lib/Conversion/SCFToControlFlow/CMakeLists.txt b/mlir/lib/Conversion/SCFToControlFlow/CMakeLists.txt
index 9c635ad7e664f..67eb7691f47fc 100644
--- a/mlir/lib/Conversion/SCFToControlFlow/CMakeLists.txt
+++ b/mlir/lib/Conversion/SCFToControlFlow/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRSCFToControlFlow
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/SCFToControlFlow
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRControlFlowDialect
diff --git a/mlir/lib/Conversion/SCFToEmitC/CMakeLists.txt b/mlir/lib/Conversion/SCFToEmitC/CMakeLists.txt
index 453aa6c44c467..5a0722c96bd59 100644
--- a/mlir/lib/Conversion/SCFToEmitC/CMakeLists.txt
+++ b/mlir/lib/Conversion/SCFToEmitC/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRSCFToEmitC
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/SCFToEmitC
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/SCFToGPU/CMakeLists.txt b/mlir/lib/Conversion/SCFToGPU/CMakeLists.txt
index b7853634bc44e..c910e7dee5336 100644
--- a/mlir/lib/Conversion/SCFToGPU/CMakeLists.txt
+++ b/mlir/lib/Conversion/SCFToGPU/CMakeLists.txt
@@ -5,9 +5,6 @@ add_mlir_conversion_library(MLIRSCFToGPU
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/SCFToGPU
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineDialect
   MLIRAffineToStandard
diff --git a/mlir/lib/Conversion/SCFToOpenMP/CMakeLists.txt b/mlir/lib/Conversion/SCFToOpenMP/CMakeLists.txt
index 1ad175dd7d3ff..7be6990055182 100644
--- a/mlir/lib/Conversion/SCFToOpenMP/CMakeLists.txt
+++ b/mlir/lib/Conversion/SCFToOpenMP/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRSCFToOpenMP
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/SCFToStandard
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/SCFToSPIRV/CMakeLists.txt b/mlir/lib/Conversion/SCFToSPIRV/CMakeLists.txt
index e509fb025ee19..b642d33d3f1c1 100644
--- a/mlir/lib/Conversion/SCFToSPIRV/CMakeLists.txt
+++ b/mlir/lib/Conversion/SCFToSPIRV/CMakeLists.txt
@@ -5,9 +5,6 @@ add_mlir_conversion_library(MLIRSCFToSPIRV
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/SCFToSPIRV
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithToSPIRV
   MLIRFuncToSPIRV
diff --git a/mlir/lib/Conversion/SPIRVCommon/CMakeLists.txt b/mlir/lib/Conversion/SPIRVCommon/CMakeLists.txt
index cd5a4c225efbf..993105920584c 100644
--- a/mlir/lib/Conversion/SPIRVCommon/CMakeLists.txt
+++ b/mlir/lib/Conversion/SPIRVCommon/CMakeLists.txt
@@ -1,6 +1,7 @@
 add_mlir_conversion_library(MLIRSPIRVAttrToLLVMConversion
   AttrToLLVMConverter.cpp
 
-  DEPENDS
-  MLIRSPIRVEnumsIncGen
+  # AttrToLLVMConverter.h includes the generated SPIRVEnums.h.
+  HEADER_LIBS PUBLIC
+  MLIRSPIRVDialect
 )
diff --git a/mlir/lib/Conversion/SPIRVToLLVM/CMakeLists.txt b/mlir/lib/Conversion/SPIRVToLLVM/CMakeLists.txt
index e563315d95c9c..31a0357f02e35 100644
--- a/mlir/lib/Conversion/SPIRVToLLVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/SPIRVToLLVM/CMakeLists.txt
@@ -7,7 +7,6 @@ add_mlir_conversion_library(MLIRSPIRVToLLVM
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/SPIRVToLLVM
 
   DEPENDS
-  MLIRConversionPassIncGen
   intrinsics_gen
 
   LINK_LIBS PUBLIC
diff --git a/mlir/lib/Conversion/ShapeToStandard/CMakeLists.txt b/mlir/lib/Conversion/ShapeToStandard/CMakeLists.txt
index 246f10b389911..59b996d1949ec 100644
--- a/mlir/lib/Conversion/ShapeToStandard/CMakeLists.txt
+++ b/mlir/lib/Conversion/ShapeToStandard/CMakeLists.txt
@@ -1,6 +1,6 @@
 set(LLVM_TARGET_DEFINITIONS ShapeToStandard.td)
 mlir_tablegen(ShapeToStandard.cpp.inc -gen-rewriters)
-add_public_tablegen_target(ShapeToStandardIncGen)
+add_mlir_library_tablegen_target(ShapeToStandardIncGen MLIRShapeToStandard)
 
 add_mlir_conversion_library(MLIRShapeToStandard
   ConvertShapeConstraints.cpp
@@ -9,10 +9,6 @@ add_mlir_conversion_library(MLIRShapeToStandard
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ShapeToStandard
 
-  DEPENDS
-  MLIRConversionPassIncGen
-  ShapeToStandardIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/ShardToMPI/CMakeLists.txt b/mlir/lib/Conversion/ShardToMPI/CMakeLists.txt
index dfa8e77bb13ef..6c970bc0baeb3 100644
--- a/mlir/lib/Conversion/ShardToMPI/CMakeLists.txt
+++ b/mlir/lib/Conversion/ShardToMPI/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRShardToMPI
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ShardToMPI
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/TensorToLinalg/CMakeLists.txt b/mlir/lib/Conversion/TensorToLinalg/CMakeLists.txt
index 0236dc6d397c4..89bf6edab37dc 100644
--- a/mlir/lib/Conversion/TensorToLinalg/CMakeLists.txt
+++ b/mlir/lib/Conversion/TensorToLinalg/CMakeLists.txt
@@ -6,9 +6,6 @@ add_mlir_conversion_library(MLIRTensorToLinalg
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Linalg
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/IR
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRPass
diff --git a/mlir/lib/Conversion/TensorToSPIRV/CMakeLists.txt b/mlir/lib/Conversion/TensorToSPIRV/CMakeLists.txt
index 31266221f5b26..cc34b0b443fe9 100644
--- a/mlir/lib/Conversion/TensorToSPIRV/CMakeLists.txt
+++ b/mlir/lib/Conversion/TensorToSPIRV/CMakeLists.txt
@@ -6,9 +6,6 @@ add_mlir_conversion_library(MLIRTensorToSPIRV
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/SPIRV
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/IR
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithToSPIRV
   MLIRFuncToSPIRV
diff --git a/mlir/lib/Conversion/TosaToArith/CMakeLists.txt b/mlir/lib/Conversion/TosaToArith/CMakeLists.txt
index 8f1640c321145..65ae1af81148a 100644
--- a/mlir/lib/Conversion/TosaToArith/CMakeLists.txt
+++ b/mlir/lib/Conversion/TosaToArith/CMakeLists.txt
@@ -6,9 +6,6 @@ add_mlir_conversion_library(MLIRTosaToArith
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Tosa
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/IR
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRIR
diff --git a/mlir/lib/Conversion/TosaToLinalg/CMakeLists.txt b/mlir/lib/Conversion/TosaToLinalg/CMakeLists.txt
index 5123c2a7cf916..d1140ea0d3658 100644
--- a/mlir/lib/Conversion/TosaToLinalg/CMakeLists.txt
+++ b/mlir/lib/Conversion/TosaToLinalg/CMakeLists.txt
@@ -8,9 +8,6 @@ add_mlir_conversion_library(MLIRTosaToLinalg
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Tosa
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/IR
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRDialectUtils
diff --git a/mlir/lib/Conversion/TosaToMLProgram/CMakeLists.txt b/mlir/lib/Conversion/TosaToMLProgram/CMakeLists.txt
index 82941424f1d10..5f651e52c7c83 100644
--- a/mlir/lib/Conversion/TosaToMLProgram/CMakeLists.txt
+++ b/mlir/lib/Conversion/TosaToMLProgram/CMakeLists.txt
@@ -6,9 +6,6 @@ add_mlir_conversion_library(MLIRTosaToMLProgram
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Tosa
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/IR
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRMLProgramDialect
diff --git a/mlir/lib/Conversion/TosaToSCF/CMakeLists.txt b/mlir/lib/Conversion/TosaToSCF/CMakeLists.txt
index 017a2e8c921f2..1d23c9f715f25 100644
--- a/mlir/lib/Conversion/TosaToSCF/CMakeLists.txt
+++ b/mlir/lib/Conversion/TosaToSCF/CMakeLists.txt
@@ -6,9 +6,6 @@ add_mlir_conversion_library(MLIRTosaToSCF
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Tosa
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/IR
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRSCFDialect
diff --git a/mlir/lib/Conversion/TosaToSPIRVTosa/CMakeLists.txt b/mlir/lib/Conversion/TosaToSPIRVTosa/CMakeLists.txt
index c4b71ed61f39b..52eac566c8159 100644
--- a/mlir/lib/Conversion/TosaToSPIRVTosa/CMakeLists.txt
+++ b/mlir/lib/Conversion/TosaToSPIRVTosa/CMakeLists.txt
@@ -9,9 +9,6 @@ add_mlir_conversion_library(MLIRTosaToSPIRVTosa
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Tosa
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/IR
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRFuncDialect
   MLIRIR
diff --git a/mlir/lib/Conversion/TosaToTensor/CMakeLists.txt b/mlir/lib/Conversion/TosaToTensor/CMakeLists.txt
index 2870baa20757b..bdbbbd85ef3ab 100644
--- a/mlir/lib/Conversion/TosaToTensor/CMakeLists.txt
+++ b/mlir/lib/Conversion/TosaToTensor/CMakeLists.txt
@@ -6,9 +6,6 @@ add_mlir_conversion_library(MLIRTosaToTensor
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Tosa
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/IR
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRTensorDialect
   MLIRTensorUtils
diff --git a/mlir/lib/Conversion/UBToLLVM/CMakeLists.txt b/mlir/lib/Conversion/UBToLLVM/CMakeLists.txt
index 645614614ce61..1a5183051926e 100644
--- a/mlir/lib/Conversion/UBToLLVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/UBToLLVM/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRUBToLLVM
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/UBToLLVM
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/UBToSPIRV/CMakeLists.txt b/mlir/lib/Conversion/UBToSPIRV/CMakeLists.txt
index a7a26b0a8c606..e2631c528248c 100644
--- a/mlir/lib/Conversion/UBToSPIRV/CMakeLists.txt
+++ b/mlir/lib/Conversion/UBToSPIRV/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRUBToSPIRV
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/UBToSPIRV
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/VectorToAMX/CMakeLists.txt b/mlir/lib/Conversion/VectorToAMX/CMakeLists.txt
index 2ed864c519cb6..e39c9f9a3ef33 100644
--- a/mlir/lib/Conversion/VectorToAMX/CMakeLists.txt
+++ b/mlir/lib/Conversion/VectorToAMX/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRVectorToAMX
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/VectorToAMX
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineUtils
   MLIRArithDialect
diff --git a/mlir/lib/Conversion/VectorToArmSME/CMakeLists.txt b/mlir/lib/Conversion/VectorToArmSME/CMakeLists.txt
index 6a81a09776d37..d50d9fdccd913 100644
--- a/mlir/lib/Conversion/VectorToArmSME/CMakeLists.txt
+++ b/mlir/lib/Conversion/VectorToArmSME/CMakeLists.txt
@@ -5,9 +5,6 @@ add_mlir_conversion_library(MLIRVectorToArmSME
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/VectorToArmSME
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRArmSMEDialect
   MLIRArmSVEDialect
diff --git a/mlir/lib/Conversion/VectorToLLVM/CMakeLists.txt b/mlir/lib/Conversion/VectorToLLVM/CMakeLists.txt
index 0d700ea65eb4e..06fad235d23b6 100644
--- a/mlir/lib/Conversion/VectorToLLVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/VectorToLLVM/CMakeLists.txt
@@ -6,7 +6,6 @@ add_mlir_conversion_library(MLIRVectorToLLVM
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/VectorToLLVM
 
   DEPENDS
-  MLIRConversionPassIncGen
   intrinsics_gen
 
   LINK_COMPONENTS
diff --git a/mlir/lib/Conversion/VectorToSPIRV/CMakeLists.txt b/mlir/lib/Conversion/VectorToSPIRV/CMakeLists.txt
index f4cdb2cf95a30..7a307a8f52247 100644
--- a/mlir/lib/Conversion/VectorToSPIRV/CMakeLists.txt
+++ b/mlir/lib/Conversion/VectorToSPIRV/CMakeLists.txt
@@ -6,7 +6,6 @@ add_mlir_conversion_library(MLIRVectorToSPIRV
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/VectorToSPIRV
 
   DEPENDS
-  MLIRConversionPassIncGen
   intrinsics_gen
 
   LINK_LIBS PUBLIC
diff --git a/mlir/lib/Conversion/VectorToXeGPU/CMakeLists.txt b/mlir/lib/Conversion/VectorToXeGPU/CMakeLists.txt
index dd699f5b1880e..4a21b29a5c172 100644
--- a/mlir/lib/Conversion/VectorToXeGPU/CMakeLists.txt
+++ b/mlir/lib/Conversion/VectorToXeGPU/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRVectorToXeGPU
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/VectorToXeGPU
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRMemRefDialect
diff --git a/mlir/lib/Conversion/XeGPUToXeVM/CMakeLists.txt b/mlir/lib/Conversion/XeGPUToXeVM/CMakeLists.txt
index dd9edc43a1657..15b09ead8bd6f 100644
--- a/mlir/lib/Conversion/XeGPUToXeVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/XeGPUToXeVM/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRXeGPUToXeVM
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/XeGPUToXeVM
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Conversion/XeVMToLLVM/CMakeLists.txt b/mlir/lib/Conversion/XeVMToLLVM/CMakeLists.txt
index 4ac60d8d43472..6fbb3fb10e2ac 100644
--- a/mlir/lib/Conversion/XeVMToLLVM/CMakeLists.txt
+++ b/mlir/lib/Conversion/XeVMToLLVM/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_conversion_library(MLIRXeVMToLLVM
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/XeVMToLLVM
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Dialect/AMDGPU/IR/CMakeLists.txt b/mlir/lib/Dialect/AMDGPU/IR/CMakeLists.txt
index aef460904baaa..e8fc8bcc181d1 100644
--- a/mlir/lib/Dialect/AMDGPU/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/AMDGPU/IR/CMakeLists.txt
@@ -8,11 +8,6 @@ add_mlir_dialect_library(MLIRAMDGPUDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/AMDGPU
 
-  DEPENDS
-  MLIRAMDGPUEnumsGen
-  MLIRAMDGPUAttributesIncGen
-  MLIRAMDGPUIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRROCDLDialect
diff --git a/mlir/lib/Dialect/AMDGPU/Transforms/CMakeLists.txt b/mlir/lib/Dialect/AMDGPU/Transforms/CMakeLists.txt
index 29baef635ec80..2b09898158d86 100644
--- a/mlir/lib/Dialect/AMDGPU/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/AMDGPU/Transforms/CMakeLists.txt
@@ -7,9 +7,6 @@ add_mlir_dialect_library(MLIRAMDGPUTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/AMDGPU/Transforms
 
-  DEPENDS
-  MLIRAMDGPUTransformsIncGen
-
   LINK_LIBS PUBLIC
   MLIRAMDGPUDialect
   MLIRAMDGPUUtils
diff --git a/mlir/lib/Dialect/Affine/Analysis/CMakeLists.txt b/mlir/lib/Dialect/Affine/Analysis/CMakeLists.txt
index 3a1996349dbed..61e49b0da8b2d 100644
--- a/mlir/lib/Dialect/Affine/Analysis/CMakeLists.txt
+++ b/mlir/lib/Dialect/Affine/Analysis/CMakeLists.txt
@@ -8,9 +8,6 @@ add_mlir_dialect_library(MLIRAffineAnalysis
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Affine
 
-  DEPENDS
-  MLIRFuncOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineDialect
   MLIRAnalysis
diff --git a/mlir/lib/Dialect/Affine/IR/CMakeLists.txt b/mlir/lib/Dialect/Affine/IR/CMakeLists.txt
index e24cd4013bca3..2e2f0da93db3e 100644
--- a/mlir/lib/Dialect/Affine/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/Affine/IR/CMakeLists.txt
@@ -10,10 +10,6 @@ add_mlir_dialect_library(MLIRAffineDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Affine
 
-  DEPENDS
-  MLIRAffineMemoryOpInterfacesIncGen
-  MLIRAffineOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRDialectUtils
diff --git a/mlir/lib/Dialect/Affine/TransformOps/CMakeLists.txt b/mlir/lib/Dialect/Affine/TransformOps/CMakeLists.txt
index 4797cd973e8fb..da33af92fcaa5 100644
--- a/mlir/lib/Dialect/Affine/TransformOps/CMakeLists.txt
+++ b/mlir/lib/Dialect/Affine/TransformOps/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_dialect_library(MLIRAffineTransformOps
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Affine/TransformOps
 
-  DEPENDS
-  MLIRAffineTransformOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineAnalysis
   MLIRAffineDialect
diff --git a/mlir/lib/Dialect/Affine/Transforms/CMakeLists.txt b/mlir/lib/Dialect/Affine/Transforms/CMakeLists.txt
index 9d912139810b2..f2aec87161081 100644
--- a/mlir/lib/Dialect/Affine/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/Affine/Transforms/CMakeLists.txt
@@ -24,11 +24,6 @@ add_mlir_dialect_library(MLIRAffineTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Affine
 
-  DEPENDS
-  MLIRAffineOpsIncGen
-  MLIRAffinePassIncGen
-  MLIRLoopLikeInterfaceIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineDialect
   MLIRAffineAnalysis
diff --git a/mlir/lib/Dialect/Arith/IR/CMakeLists.txt b/mlir/lib/Dialect/Arith/IR/CMakeLists.txt
index 3423e11a7d0f0..92cf8893ea011 100644
--- a/mlir/lib/Dialect/Arith/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/Arith/IR/CMakeLists.txt
@@ -19,9 +19,11 @@ add_mlir_dialect_library(MLIRArithDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Arith
 
-  DEPENDS
-  MLIRArithOpsIncGen
-  MLIRArithOpsInterfacesIncGen
+  # ArithDialect.cpp includes generated Bufferization interfaces and
+  # mlir/Transforms/InliningUtils.h.
+  HEADER_LIBS PRIVATE
+  MLIRBufferizationDialect
+  MLIRTransforms
 
   LINK_LIBS PUBLIC
   MLIRCastInterfaces
diff --git a/mlir/lib/Dialect/Arith/Transforms/CMakeLists.txt b/mlir/lib/Dialect/Arith/Transforms/CMakeLists.txt
index 637e16a3963d6..d5d5c56e0c569 100644
--- a/mlir/lib/Dialect/Arith/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/Arith/Transforms/CMakeLists.txt
@@ -14,9 +14,6 @@ add_mlir_dialect_library(MLIRArithTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Arith/Transforms
 
-  DEPENDS
-  MLIRArithTransformsIncGen
-
   LINK_LIBS PUBLIC
   MLIRAnalysis
   MLIRArithDialect
diff --git a/mlir/lib/Dialect/ArmNeon/IR/CMakeLists.txt b/mlir/lib/Dialect/ArmNeon/IR/CMakeLists.txt
index b04919a3a3185..c14b3ac608c2f 100644
--- a/mlir/lib/Dialect/ArmNeon/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/ArmNeon/IR/CMakeLists.txt
@@ -4,8 +4,11 @@ add_mlir_dialect_library(MLIRArmNeonDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/ArmNeon
 
-  DEPENDS
-  MLIRArmNeonIncGen
+  # ArmNeonDialect.cpp includes VectorOps.h, whose generated declarations
+  # expose both Vector and Arith generated headers.
+  HEADER_LIBS PRIVATE
+  MLIRArithDialect
+  MLIRVectorDialect
 
   LINK_LIBS PUBLIC
   MLIRIR
diff --git a/mlir/lib/Dialect/ArmNeon/TransformOps/CMakeLists.txt b/mlir/lib/Dialect/ArmNeon/TransformOps/CMakeLists.txt
index 69d2143ad4e1f..90daf2db1f6ae 100644
--- a/mlir/lib/Dialect/ArmNeon/TransformOps/CMakeLists.txt
+++ b/mlir/lib/Dialect/ArmNeon/TransformOps/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_dialect_library(MLIRArmNeonVectorTransformOps
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/ArmNeon/TransformOps
 
-  DEPENDS
-  MLIRArmNeonVectorTransformOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRLLVMCommonConversion
diff --git a/mlir/lib/Dialect/ArmNeon/Transforms/CMakeLists.txt b/mlir/lib/Dialect/ArmNeon/Transforms/CMakeLists.txt
index 368dacac7b835..40dbf64bdef3a 100644
--- a/mlir/lib/Dialect/ArmNeon/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/ArmNeon/Transforms/CMakeLists.txt
@@ -1,9 +1,6 @@
 add_mlir_dialect_library(MLIRArmNeonTransforms
   LowerContractToNeonPatterns.cpp
 
-  DEPENDS
-  MLIRArmNeonIncGen
-
   LINK_LIBS PUBLIC
   MLIRArmNeonDialect
   MLIRFuncDialect
diff --git a/mlir/lib/Dialect/ArmSME/IR/CMakeLists.txt b/mlir/lib/Dialect/ArmSME/IR/CMakeLists.txt
index ce0c2f4986fc6..e22ef9c4d1561 100644
--- a/mlir/lib/Dialect/ArmSME/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/ArmSME/IR/CMakeLists.txt
@@ -5,10 +5,6 @@ add_mlir_dialect_library(MLIRArmSMEDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/ArmSME
 
-  DEPENDS
-  MLIRArmSMEOpsIncGen
-  MLIRArmSMEIntrinsicOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRLLVMDialect
diff --git a/mlir/lib/Dialect/ArmSME/Transforms/CMakeLists.txt b/mlir/lib/Dialect/ArmSME/Transforms/CMakeLists.txt
index a29624468ba2d..0845315253a73 100644
--- a/mlir/lib/Dialect/ArmSME/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/ArmSME/Transforms/CMakeLists.txt
@@ -7,9 +7,6 @@ add_mlir_dialect_library(MLIRArmSMETransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/ArmSME/Transforms
 
-  DEPENDS
-  MLIRArmSMETransformsIncGen
-
   LINK_LIBS PUBLIC
   MLIRPass
   MLIRArmSMEDialect
diff --git a/mlir/lib/Dialect/ArmSVE/IR/CMakeLists.txt b/mlir/lib/Dialect/ArmSVE/IR/CMakeLists.txt
index 9ef7384fc5492..45a7209a719df 100644
--- a/mlir/lib/Dialect/ArmSVE/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/ArmSVE/IR/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_dialect_library(MLIRArmSVEDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/ArmSVE
 
-  DEPENDS
-  MLIRArmSVEIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRLLVMDialect
diff --git a/mlir/lib/Dialect/ArmSVE/TransformOps/CMakeLists.txt b/mlir/lib/Dialect/ArmSVE/TransformOps/CMakeLists.txt
index 235fe8f5ca0ce..716a5a3dc03a1 100644
--- a/mlir/lib/Dialect/ArmSVE/TransformOps/CMakeLists.txt
+++ b/mlir/lib/Dialect/ArmSVE/TransformOps/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_dialect_library(MLIRArmSVEVectorTransformOps
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/ArmSVE/TransformOps
 
-  DEPENDS
-  MLIRArmSVEVectorTransformOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRLLVMCommonConversion
diff --git a/mlir/lib/Dialect/ArmSVE/Transforms/CMakeLists.txt b/mlir/lib/Dialect/ArmSVE/Transforms/CMakeLists.txt
index c29eaca244b4a..de1fb5db9ba3f 100644
--- a/mlir/lib/Dialect/ArmSVE/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/ArmSVE/Transforms/CMakeLists.txt
@@ -3,10 +3,6 @@ add_mlir_dialect_library(MLIRArmSVETransforms
   LegalizeVectorStorage.cpp
   LowerContractToSVEPatterns.cpp
 
-  DEPENDS
-  MLIRArmSVEConversionsIncGen
-  MLIRArmSVEPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRArmSVEDialect
   MLIRFuncDialect
diff --git a/mlir/lib/Dialect/Async/IR/CMakeLists.txt b/mlir/lib/Dialect/Async/IR/CMakeLists.txt
index e0e667500308a..72b5e744e2443 100644
--- a/mlir/lib/Dialect/Async/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/Async/IR/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_dialect_library(MLIRAsyncDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Async
 
-  DEPENDS
-  MLIRAsyncOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRCallInterfaces
   MLIRControlFlowInterfaces
diff --git a/mlir/lib/Dialect/Async/Transforms/CMakeLists.txt b/mlir/lib/Dialect/Async/Transforms/CMakeLists.txt
index 7b59bc0de30a6..a6e9614d4f7d2 100644
--- a/mlir/lib/Dialect/Async/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/Async/Transforms/CMakeLists.txt
@@ -8,9 +8,6 @@ add_mlir_dialect_library(MLIRAsyncTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Async
 
-  DEPENDS
-  MLIRAsyncPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRAsyncDialect
diff --git a/mlir/lib/Dialect/Bufferization/IR/CMakeLists.txt b/mlir/lib/Dialect/Bufferization/IR/CMakeLists.txt
index a6403a5298dab..18706ed3f1085 100644
--- a/mlir/lib/Dialect/Bufferization/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/Bufferization/IR/CMakeLists.txt
@@ -12,11 +12,6 @@ add_mlir_dialect_library(MLIRBufferizationDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Bufferization
 
-  DEPENDS
-  MLIRAllocationOpInterfaceIncGen
-  MLIRBufferizationOpsIncGen
-  MLIRBufferizationEnumsIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineDialect
   MLIRArithDialect
diff --git a/mlir/lib/Dialect/Bufferization/TransformOps/CMakeLists.txt b/mlir/lib/Dialect/Bufferization/TransformOps/CMakeLists.txt
index be5eb73b91229..976f1fc23122b 100644
--- a/mlir/lib/Dialect/Bufferization/TransformOps/CMakeLists.txt
+++ b/mlir/lib/Dialect/Bufferization/TransformOps/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_dialect_library(MLIRBufferizationTransformOps
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Bufferization/TransformOps
 
-  DEPENDS
-  MLIRBufferizationTransformOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRBufferizationDialect
diff --git a/mlir/lib/Dialect/Bufferization/Transforms/CMakeLists.txt b/mlir/lib/Dialect/Bufferization/Transforms/CMakeLists.txt
index 2e6bc4d9503b9..7fe084d620d90 100644
--- a/mlir/lib/Dialect/Bufferization/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/Bufferization/Transforms/CMakeLists.txt
@@ -22,10 +22,6 @@ add_mlir_dialect_library(MLIRBufferizationTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Bufferization
 
-  DEPENDS
-  MLIRBufferizationPassIncGen
-  MLIRBufferizationEnumsIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRBufferizationDialect
diff --git a/mlir/lib/Dialect/Complex/IR/CMakeLists.txt b/mlir/lib/Dialect/Complex/IR/CMakeLists.txt
index a90f34ec1684d..7e829fe1ae1c3 100644
--- a/mlir/lib/Dialect/Complex/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/Complex/IR/CMakeLists.txt
@@ -5,9 +5,9 @@ add_mlir_dialect_library(MLIRComplexDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Complex
 
-  DEPENDS
-  MLIRComplexOpsIncGen
-  MLIRComplexAttributesIncGen
+  # ComplexDialect.cpp includes mlir/Transforms/InliningUtils.h.
+  HEADER_LIBS PRIVATE
+  MLIRTransforms
 
   LINK_LIBS PUBLIC
   MLIRArithDialect
diff --git a/mlir/lib/Dialect/ControlFlow/IR/CMakeLists.txt b/mlir/lib/Dialect/ControlFlow/IR/CMakeLists.txt
index 05a787fa53ec3..d91f2ebc61112 100644
--- a/mlir/lib/Dialect/ControlFlow/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/ControlFlow/IR/CMakeLists.txt
@@ -4,8 +4,11 @@ add_mlir_dialect_library(MLIRControlFlowDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/ControlFlow/IR
 
-  DEPENDS
-  MLIRControlFlowOpsIncGen
+  # ControlFlowOps.cpp includes generated Bufferization interfaces and
+  # mlir/Transforms/InliningUtils.h.
+  HEADER_LIBS PRIVATE
+  MLIRBufferizationDialect
+  MLIRTransforms
 
   LINK_LIBS PUBLIC
   MLIRArithDialect
diff --git a/mlir/lib/Dialect/DLTI/CMakeLists.txt b/mlir/lib/Dialect/DLTI/CMakeLists.txt
index 7691a8a10a37a..d4dd514b80fec 100644
--- a/mlir/lib/Dialect/DLTI/CMakeLists.txt
+++ b/mlir/lib/Dialect/DLTI/CMakeLists.txt
@@ -3,9 +3,6 @@ add_mlir_dialect_library(MLIRDLTIDialect
   DLTI.cpp
   Traits.cpp
 
-  DEPENDS
-  MLIRDLTIIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRDataLayoutInterfaces
diff --git a/mlir/lib/Dialect/DLTI/TransformOps/CMakeLists.txt b/mlir/lib/Dialect/DLTI/TransformOps/CMakeLists.txt
index 05734353f9d11..10e5379ec3f18 100644
--- a/mlir/lib/Dialect/DLTI/TransformOps/CMakeLists.txt
+++ b/mlir/lib/Dialect/DLTI/TransformOps/CMakeLists.txt
@@ -4,10 +4,6 @@ add_mlir_dialect_library(MLIRDLTITransformOps
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/DLTI/TransformOps
 
-  DEPENDS
-  MLIRDLTITransformOpsIncGen
-  MLIRDLTIDialect
-
   LINK_LIBS PUBLIC
   MLIRDLTIDialect
   MLIRSideEffectInterfaces
diff --git a/mlir/lib/Dialect/EmitC/IR/CMakeLists.txt b/mlir/lib/Dialect/EmitC/IR/CMakeLists.txt
index 4cc54201d2745..f6fea0ff70011 100644
--- a/mlir/lib/Dialect/EmitC/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/EmitC/IR/CMakeLists.txt
@@ -4,10 +4,6 @@ add_mlir_dialect_library(MLIREmitCDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/EmitC
 
-  DEPENDS
-  MLIREmitCIncGen
-  MLIREmitCAttributesIncGen
-
   LINK_LIBS PUBLIC
   MLIRCallInterfaces
   MLIRCastInterfaces
diff --git a/mlir/lib/Dialect/EmitC/Transforms/CMakeLists.txt b/mlir/lib/Dialect/EmitC/Transforms/CMakeLists.txt
index ede2cb5e208f0..e7028bb2fdb94 100644
--- a/mlir/lib/Dialect/EmitC/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/EmitC/Transforms/CMakeLists.txt
@@ -8,9 +8,6 @@ add_mlir_dialect_library(MLIREmitCTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/EmitC/Transforms
 
-  DEPENDS
-  MLIREmitCTransformsIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRPass
diff --git a/mlir/lib/Dialect/Func/Extensions/CMakeLists.txt b/mlir/lib/Dialect/Func/Extensions/CMakeLists.txt
index 87ef51e63f1da..53567a3d0eab1 100644
--- a/mlir/lib/Dialect/Func/Extensions/CMakeLists.txt
+++ b/mlir/lib/Dialect/Func/Extensions/CMakeLists.txt
@@ -10,6 +10,10 @@ add_mlir_extension_library(MLIRFuncInlinerExtension
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Func/Extensions
 
+  # InlinerExtension.cpp includes mlir/Transforms/InliningUtils.h.
+  HEADER_LIBS PRIVATE
+  MLIRTransforms
+
   LINK_LIBS PUBLIC
   MLIRControlFlowDialect
   MLIRInferTypeOpInterface
diff --git a/mlir/lib/Dialect/Func/IR/CMakeLists.txt b/mlir/lib/Dialect/Func/IR/CMakeLists.txt
index 329301c6fbafd..799fa72a6db56 100644
--- a/mlir/lib/Dialect/Func/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/Func/IR/CMakeLists.txt
@@ -4,8 +4,10 @@ add_mlir_dialect_library(MLIRFuncDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Func
 
-  DEPENDS
-  MLIRFuncOpsIncGen
+  # FuncOps.cpp includes generated Bufferization interfaces and InliningUtils.
+  HEADER_LIBS PRIVATE
+  MLIRBufferizationDialect
+  MLIRTransforms
 
   LINK_LIBS PUBLIC
   MLIRCallInterfaces
diff --git a/mlir/lib/Dialect/Func/TransformOps/CMakeLists.txt b/mlir/lib/Dialect/Func/TransformOps/CMakeLists.txt
index 968395c5bcfce..daf6f9907333e 100644
--- a/mlir/lib/Dialect/Func/TransformOps/CMakeLists.txt
+++ b/mlir/lib/Dialect/Func/TransformOps/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_dialect_library(MLIRFuncTransformOps
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Func/TransformOps
 
-  DEPENDS
-  MLIRFuncTransformOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRFuncDialect
   MLIRFuncToLLVM
diff --git a/mlir/lib/Dialect/Func/Transforms/CMakeLists.txt b/mlir/lib/Dialect/Func/Transforms/CMakeLists.txt
index 0bed59e109503..25b48b1d35447 100644
--- a/mlir/lib/Dialect/Func/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/Func/Transforms/CMakeLists.txt
@@ -5,9 +5,6 @@ add_mlir_dialect_library(MLIRFuncTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Func/Transforms
 
-  DEPENDS
-  MLIRFuncTransformsIncGen
-
   LINK_LIBS PUBLIC
   MLIRFuncDialect
   MLIRIR
diff --git a/mlir/lib/Dialect/GPU/CMakeLists.txt b/mlir/lib/Dialect/GPU/CMakeLists.txt
index 547812da0ab97..f50407ba34fd9 100644
--- a/mlir/lib/Dialect/GPU/CMakeLists.txt
+++ b/mlir/lib/Dialect/GPU/CMakeLists.txt
@@ -6,13 +6,6 @@ add_mlir_dialect_library(MLIRGPUDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/GPU
 
-  DEPENDS
-  MLIRGPUOpsIncGen
-  MLIRGPUOpsAttributesIncGen
-  MLIRGPUOpsEnumsGen
-  MLIRGPUOpInterfacesIncGen
-  MLIRGPUCompilationAttrInterfacesIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRDLTIDialect
@@ -52,10 +45,6 @@ add_mlir_dialect_library(MLIRGPUTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/GPU
 
-  DEPENDS
-  MLIRGPUPassIncGen
-  MLIRParallelLoopMapperEnumsGen
-
   LINK_LIBS PUBLIC
   MLIRAMDGPUDialect
   MLIRAffineUtils
diff --git a/mlir/lib/Dialect/GPU/TransformOps/CMakeLists.txt b/mlir/lib/Dialect/GPU/TransformOps/CMakeLists.txt
index 2d3dfdbfc1136..dbda86235bd25 100644
--- a/mlir/lib/Dialect/GPU/TransformOps/CMakeLists.txt
+++ b/mlir/lib/Dialect/GPU/TransformOps/CMakeLists.txt
@@ -6,11 +6,6 @@ add_mlir_dialect_library(MLIRGPUTransformOps
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/GPU/TransformOps
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Interfaces
 
-  DEPENDS
-  MLIRGPUTransformOpsIncGen
-  MLIRDeviceMappingInterfacesIncGen
-  MLIRGPUDeviceMapperEnumsGen
-
   LINK_LIBS PUBLIC
   MLIRGPUDialect
   MLIRGPUTransforms
diff --git a/mlir/lib/Dialect/IRDL/CMakeLists.txt b/mlir/lib/Dialect/IRDL/CMakeLists.txt
index db4b98ef5308e..3b65ab1541487 100644
--- a/mlir/lib/Dialect/IRDL/CMakeLists.txt
+++ b/mlir/lib/Dialect/IRDL/CMakeLists.txt
@@ -5,11 +5,6 @@ add_mlir_dialect_library(MLIRIRDL
   IRDLSymbols.cpp
   IRDLVerifiers.cpp
 
-  DEPENDS
-  MLIRIRDLIncGen
-  MLIRIRDLOpsIncGen
-  MLIRIRDLTypesIncGen
-
   LINK_LIBS PUBLIC
   MLIRDialect
   MLIRIR
diff --git a/mlir/lib/Dialect/Index/IR/CMakeLists.txt b/mlir/lib/Dialect/Index/IR/CMakeLists.txt
index fce47d2ecc531..9a411c955f16d 100644
--- a/mlir/lib/Dialect/Index/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/Index/IR/CMakeLists.txt
@@ -4,8 +4,9 @@ add_mlir_dialect_library(MLIRIndexDialect
   IndexOps.cpp
   InferIntRangeInterfaceImpls.cpp
 
-  DEPENDS
-  MLIRIndexOpsIncGen
+  # IndexDialect.cpp includes mlir/Transforms/InliningUtils.h.
+  HEADER_LIBS PRIVATE
+  MLIRTransforms
 
   LINK_LIBS PUBLIC
   MLIRDialect
diff --git a/mlir/lib/Dialect/LLVMIR/CMakeLists.txt b/mlir/lib/Dialect/LLVMIR/CMakeLists.txt
index 18057048a509a..4b217df438ac0 100644
--- a/mlir/lib/Dialect/LLVMIR/CMakeLists.txt
+++ b/mlir/lib/Dialect/LLVMIR/CMakeLists.txt
@@ -29,21 +29,17 @@ add_mlir_dialect_library(MLIRLLVMDialect
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/LLVMIR
 
   DEPENDS
-  MLIRLLVMDialectBytecodeIncGen
-  MLIRLLVMInterfacesIncGen
-  MLIRLLVMIntrinsicOpsIncGen
-  MLIRLLVMAllOpsIncGen
-  MLIRLLVMOpsIncGen
   MLIRLLVMOpsShardGen
-  MLIRLLVMTranslationDialectInterfaceIncGen
-  MLIRLLVMTypesIncGen
-  MLIROpenMPOpsIncGen
   intrinsics_gen
 
   LINK_COMPONENTS
   BinaryFormat
   Core
 
+  # LLVMDialect.cpp includes mlir/Transforms/InliningUtils.h.
+  HEADER_LIBS PRIVATE
+  MLIRTransforms
+
   LINK_LIBS PUBLIC
   MLIRCallInterfaces
   MLIRControlFlowInterfaces
@@ -67,11 +63,6 @@ add_mlir_dialect_library(MLIRNVVMDialect
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/LLVMIR
 
   DEPENDS
-  MLIRGPUCompilationAttrInterfacesIncGen
-  MLIRNVVMOpsIncGen
-  MLIRNVVMConversionsIncGen
-  MLIRBasicPtxBuilderInterfaceIncGen
-  MLIRNVVMRequiresSMTraitsIncGen
   intrinsics_gen
 
   LINK_COMPONENTS
@@ -105,16 +96,18 @@ add_mlir_dialect_library(MLIRROCDLDialect
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/LLVMIR
 
   DEPENDS
-  MLIRGPUCompilationAttrInterfacesIncGen
-  MLIRROCDLOpsIncGen
   MLIRROCDLOpsShardGen
-  MLIRROCDLConversionsIncGen
   intrinsics_gen
 
   LINK_COMPONENTS
   AsmParser
   Core
 
+  # ROCDLDialect.cpp includes GPU CompilationInterfaces and InliningUtils.
+  HEADER_LIBS PRIVATE
+  MLIRGPUDialect
+  MLIRTransforms
+
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRLLVMDialect
@@ -128,15 +121,16 @@ add_mlir_dialect_library(MLIRVCIXDialect
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/LLVMIR
 
   DEPENDS
-  MLIRGPUCompilationAttrInterfacesIncGen
-  MLIRVCIXOpsIncGen
-  MLIRVCIXConversionsIncGen
   intrinsics_gen
 
   LINK_COMPONENTS
   AsmParser
   Core
 
+  # VCIXDialect.cpp includes the generated GPU CompilationInterfaces.
+  HEADER_LIBS PRIVATE
+  MLIRGPUDialect
+
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRLLVMDialect
@@ -150,9 +144,6 @@ add_mlir_dialect_library(MLIRXeVMDialect
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/LLVMIR
 
   DEPENDS
-  MLIRGPUCompilationAttrInterfacesIncGen
-  MLIRXeVMOpsIncGen
-  MLIRXeVMConversionsIncGen
   intrinsics_gen
 
   LINK_COMPONENTS
@@ -160,6 +151,10 @@ add_mlir_dialect_library(MLIRXeVMDialect
   Core
   TargetParser
 
+  # XeVMDialect.cpp includes the generated GPU CompilationInterfaces.
+  HEADER_LIBS PRIVATE
+  MLIRGPUDialect
+
   LINK_LIBS PUBLIC
   MLIRDialectUtils
   MLIRIR
diff --git a/mlir/lib/Dialect/LLVMIR/Transforms/CMakeLists.txt b/mlir/lib/Dialect/LLVMIR/Transforms/CMakeLists.txt
index fff166d39dad9..f3626e9c93fd5 100644
--- a/mlir/lib/Dialect/LLVMIR/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/LLVMIR/Transforms/CMakeLists.txt
@@ -8,9 +8,6 @@ add_mlir_dialect_library(MLIRLLVMIRTransforms
   RequestCWrappers.cpp
   UseDefaultVisibilityPass.cpp
 
-  DEPENDS
-  MLIRLLVMPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRFuncDialect
diff --git a/mlir/lib/Dialect/Linalg/IR/CMakeLists.txt b/mlir/lib/Dialect/Linalg/IR/CMakeLists.txt
index ec4fd82468dbb..9c029cded5937 100644
--- a/mlir/lib/Dialect/Linalg/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/Linalg/IR/CMakeLists.txt
@@ -7,15 +7,6 @@ add_mlir_dialect_library(MLIRLinalgDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Linalg
 
-  DEPENDS
-  MLIRLinalgInterfacesIncGen
-  MLIRLinalgOpsAttributesIncGen
-  MLIRLinalgOpsEnumsIncGen
-  MLIRLinalgOpsIncGen
-  MLIRLinalgStructuredOpsIncGen
-  MLIRLinalgRelayoutOpsIncGen
-  MLIRShardingInterfaceIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineDialect
   MLIRArithDialect
diff --git a/mlir/lib/Dialect/Linalg/TransformOps/CMakeLists.txt b/mlir/lib/Dialect/Linalg/TransformOps/CMakeLists.txt
index b15a4704f52a2..9d007e1202eea 100644
--- a/mlir/lib/Dialect/Linalg/TransformOps/CMakeLists.txt
+++ b/mlir/lib/Dialect/Linalg/TransformOps/CMakeLists.txt
@@ -8,11 +8,6 @@ add_mlir_dialect_library(MLIRLinalgTransformOps
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Linalg/TransformOps
 
-  DEPENDS
-  MLIRLinalgMatchOpsIncGen
-  MLIRLinalgTransformOpsIncGen
-  MLIRLinalgTransformEnumsIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineDialect
   MLIRArithDialect
diff --git a/mlir/lib/Dialect/Linalg/Transforms/CMakeLists.txt b/mlir/lib/Dialect/Linalg/Transforms/CMakeLists.txt
index 6dcc6e6d18429..eca8729764fc9 100644
--- a/mlir/lib/Dialect/Linalg/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/Linalg/Transforms/CMakeLists.txt
@@ -50,9 +50,6 @@ add_mlir_dialect_library(MLIRLinalgTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Linalg
 
-  DEPENDS
-  MLIRLinalgPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineDialect
   MLIRAffineUtils
diff --git a/mlir/lib/Dialect/MLProgram/IR/CMakeLists.txt b/mlir/lib/Dialect/MLProgram/IR/CMakeLists.txt
index 725bb5fd9da9e..96027a7ac2502 100644
--- a/mlir/lib/Dialect/MLProgram/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/MLProgram/IR/CMakeLists.txt
@@ -5,11 +5,6 @@ add_mlir_dialect_library(MLIRMLProgramDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/MLProgram
 
-  DEPENDS
-  MLIRMLProgramOpsIncGen
-  MLIRMLProgramAttributesIncGen
-  MLIRMLProgramTypesIncGen
-
   LINK_LIBS PUBLIC
   MLIRDialect
   MLIRControlFlowInterfaces
diff --git a/mlir/lib/Dialect/MLProgram/Transforms/CMakeLists.txt b/mlir/lib/Dialect/MLProgram/Transforms/CMakeLists.txt
index 988019f0b648a..b2de48cfc4c6b 100644
--- a/mlir/lib/Dialect/MLProgram/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/MLProgram/Transforms/CMakeLists.txt
@@ -5,9 +5,6 @@ add_mlir_dialect_library(MLIRMLProgramTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/MLProgram/Transforms
 
-  DEPENDS
-  MLIRMLProgramPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRBufferizationDialect
   MLIRBufferizationTransforms
diff --git a/mlir/lib/Dialect/MPI/IR/CMakeLists.txt b/mlir/lib/Dialect/MPI/IR/CMakeLists.txt
index 86c53495f01a3..897c2fe5bddde 100644
--- a/mlir/lib/Dialect/MPI/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/MPI/IR/CMakeLists.txt
@@ -5,12 +5,6 @@ add_mlir_dialect_library(MLIRMPIDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/MPI
 
-  DEPENDS
-  MLIRMPIIncGen
-  MLIRMPIOpsIncGen
-  MLIRMPITypesIncGen
-  MLIRMPIAttrsIncGen
-
   LINK_LIBS PUBLIC
   MLIRDialect
   MLIRDLTIDialect
diff --git a/mlir/lib/Dialect/Math/IR/CMakeLists.txt b/mlir/lib/Dialect/Math/IR/CMakeLists.txt
index ed95bf846cdea..bc710b96c425c 100644
--- a/mlir/lib/Dialect/Math/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/Math/IR/CMakeLists.txt
@@ -5,8 +5,9 @@ add_mlir_dialect_library(MLIRMathDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Math
 
-  DEPENDS
-  MLIRMathOpsIncGen
+  # MathDialect.cpp includes mlir/Transforms/InliningUtils.h.
+  HEADER_LIBS PRIVATE
+  MLIRTransforms
 
   LINK_LIBS PUBLIC
   MLIRArithDialect
diff --git a/mlir/lib/Dialect/Math/Transforms/CMakeLists.txt b/mlir/lib/Dialect/Math/Transforms/CMakeLists.txt
index 3cbfe03d784ab..c65ed8af50422 100644
--- a/mlir/lib/Dialect/Math/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/Math/Transforms/CMakeLists.txt
@@ -9,9 +9,6 @@ add_mlir_dialect_library(MLIRMathTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Math/Transforms
 
-  DEPENDS
-  MLIRMathTransformsIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRComplexDialect
diff --git a/mlir/lib/Dialect/MemRef/IR/CMakeLists.txt b/mlir/lib/Dialect/MemRef/IR/CMakeLists.txt
index 56d98dd431c8e..7c511befb2233 100644
--- a/mlir/lib/Dialect/MemRef/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/MemRef/IR/CMakeLists.txt
@@ -8,10 +8,6 @@ add_mlir_dialect_library(MLIRMemRefDialect
   ADDITIONAL_HEADER_DIRS
   ${PROJECT_SOURCE_DIR}/inlude/mlir/Dialect/MemRef/IR
 
-  DEPENDS
-  MLIRMemRefOpsIncGen
-  MLIRMemoryAccessOpInterfacesIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRArithUtils
diff --git a/mlir/lib/Dialect/MemRef/TransformOps/CMakeLists.txt b/mlir/lib/Dialect/MemRef/TransformOps/CMakeLists.txt
index 4c9e3d3c813f7..456bfaaf2ae96 100644
--- a/mlir/lib/Dialect/MemRef/TransformOps/CMakeLists.txt
+++ b/mlir/lib/Dialect/MemRef/TransformOps/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_dialect_library(MLIRMemRefTransformOps
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/MemRef/TransformOps
 
-  DEPENDS
-  MLIRMemRefTransformOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineDialect
   MLIRArithDialect
diff --git a/mlir/lib/Dialect/MemRef/Transforms/CMakeLists.txt b/mlir/lib/Dialect/MemRef/Transforms/CMakeLists.txt
index 1a8b03dabcfb7..2857b6b2ce23a 100644
--- a/mlir/lib/Dialect/MemRef/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/MemRef/Transforms/CMakeLists.txt
@@ -21,9 +21,6 @@ add_mlir_dialect_library(MLIRMemRefTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/MemRef
 
-  DEPENDS
-  MLIRMemRefPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineTransforms
   MLIRAffineUtils
diff --git a/mlir/lib/Dialect/NVGPU/IR/CMakeLists.txt b/mlir/lib/Dialect/NVGPU/IR/CMakeLists.txt
index 94776845c5321..a2024549c9678 100644
--- a/mlir/lib/Dialect/NVGPU/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/NVGPU/IR/CMakeLists.txt
@@ -4,12 +4,6 @@ add_mlir_dialect_library(MLIRNVGPUDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/NVGPU
 
-  DEPENDS
-  MLIRNVGPUOpsIncGen
-  MLIRNVGPUEnumsIncGen
-  MLIRNVGPUAttributesIncGen
-  MLIRNVGPUTypesIncGen
-
   LINK_LIBS PUBLIC
   MLIRGPUDialect
   MLIRNVVMDialect
diff --git a/mlir/lib/Dialect/NVGPU/TransformOps/CMakeLists.txt b/mlir/lib/Dialect/NVGPU/TransformOps/CMakeLists.txt
index 9a20f170b629b..b3f50ab8a02b7 100644
--- a/mlir/lib/Dialect/NVGPU/TransformOps/CMakeLists.txt
+++ b/mlir/lib/Dialect/NVGPU/TransformOps/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_dialect_library(MLIRNVGPUTransformOps
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/NVGPU/TransformOps
 
-  DEPENDS
-  MLIRNVGPUTransformOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineDialect
   MLIRArithDialect
diff --git a/mlir/lib/Dialect/NVGPU/Transforms/CMakeLists.txt b/mlir/lib/Dialect/NVGPU/Transforms/CMakeLists.txt
index 8852ed7fb30a8..6fa5ae75da3fe 100644
--- a/mlir/lib/Dialect/NVGPU/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/NVGPU/Transforms/CMakeLists.txt
@@ -8,9 +8,6 @@ add_mlir_dialect_library(MLIRNVGPUTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/NVGPU
 
-  DEPENDS
-  MLIRNVGPUPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRGPUDialect
diff --git a/mlir/lib/Dialect/NVVM/Transforms/CMakeLists.txt b/mlir/lib/Dialect/NVVM/Transforms/CMakeLists.txt
index 935fa5700c7e5..879cf3f761a52 100644
--- a/mlir/lib/Dialect/NVVM/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/NVVM/Transforms/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_dialect_library(MLIRNVVMTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/NVVM
 
-  DEPENDS
-  MLIRNVVMPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRLLVMDialect
diff --git a/mlir/lib/Dialect/OpenACC/IR/CMakeLists.txt b/mlir/lib/Dialect/OpenACC/IR/CMakeLists.txt
index 409155ec18fe6..d986206a03ff7 100644
--- a/mlir/lib/Dialect/OpenACC/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/OpenACC/IR/CMakeLists.txt
@@ -5,14 +5,6 @@ add_mlir_dialect_library(MLIROpenACCDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/OpenACC
 
-  DEPENDS
-  MLIROpenACCOpsIncGen
-  MLIROpenACCEnumsIncGen
-  MLIROpenACCAttributesIncGen
-  MLIROpenACCMPOpsInterfacesIncGen
-  MLIROpenACCOpsInterfacesIncGen
-  MLIROpenACCTypeInterfacesIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRDialectUtils
diff --git a/mlir/lib/Dialect/OpenACC/Transforms/CMakeLists.txt b/mlir/lib/Dialect/OpenACC/Transforms/CMakeLists.txt
index 3fd2672e82c50..a641bdb8ab051 100644
--- a/mlir/lib/Dialect/OpenACC/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/OpenACC/Transforms/CMakeLists.txt
@@ -25,15 +25,6 @@ add_mlir_dialect_library(MLIROpenACCTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/OpenACC
 
-  DEPENDS
-  MLIROpenACCPassIncGen
-  MLIROpenACCOpsIncGen
-  MLIROpenACCEnumsIncGen
-  MLIROpenACCAttributesIncGen
-  MLIROpenACCMPOpsInterfacesIncGen
-  MLIROpenACCOpsInterfacesIncGen
-  MLIROpenACCTypeInterfacesIncGen
-
   LINK_LIBS PUBLIC
   MLIRAnalysis
   MLIRArithDialect
diff --git a/mlir/lib/Dialect/OpenACC/Utils/CMakeLists.txt b/mlir/lib/Dialect/OpenACC/Utils/CMakeLists.txt
index 359cf23aa4abf..031d85c7925a5 100644
--- a/mlir/lib/Dialect/OpenACC/Utils/CMakeLists.txt
+++ b/mlir/lib/Dialect/OpenACC/Utils/CMakeLists.txt
@@ -11,15 +11,6 @@ add_mlir_dialect_library(MLIROpenACCUtils
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/OpenACC
 
-  DEPENDS
-  MLIROpenACCPassIncGen
-  MLIROpenACCOpsIncGen
-  MLIROpenACCEnumsIncGen
-  MLIROpenACCAttributesIncGen
-  MLIROpenACCMPOpsInterfacesIncGen
-  MLIROpenACCOpsInterfacesIncGen
-  MLIROpenACCTypeInterfacesIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRArithUtils
diff --git a/mlir/lib/Dialect/OpenACCMPCommon/Interfaces/CMakeLists.txt b/mlir/lib/Dialect/OpenACCMPCommon/Interfaces/CMakeLists.txt
index 2a82ff2150287..b1b9954f331ee 100644
--- a/mlir/lib/Dialect/OpenACCMPCommon/Interfaces/CMakeLists.txt
+++ b/mlir/lib/Dialect/OpenACCMPCommon/Interfaces/CMakeLists.txt
@@ -4,10 +4,6 @@ AtomicInterfaces.cpp
 ADDITIONAL_HEADER_DIRS
 ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/OpenACCMPCommon/Interfaces
 
-DEPENDS
-MLIRArithOpsIncGen
-MLIRAtomicInterfacesIncGen
-
 LINK_LIBS PUBLIC
 MLIRArithDialect
 MLIRIR
diff --git a/mlir/lib/Dialect/OpenMP/IR/CMakeLists.txt b/mlir/lib/Dialect/OpenMP/IR/CMakeLists.txt
index 1beea2098d3bb..8c6d28ee2c66d 100644
--- a/mlir/lib/Dialect/OpenMP/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/OpenMP/IR/CMakeLists.txt
@@ -6,9 +6,6 @@ add_mlir_dialect_library(MLIROpenMPDialect
 
   DEPENDS
   omp_gen
-  MLIROpenMPOpsIncGen
-  MLIROpenMPOpsInterfacesIncGen
-  MLIROpenMPTypeInterfacesIncGen
 
   LINK_COMPONENTS
   TargetParser
diff --git a/mlir/lib/Dialect/OpenMP/Transforms/CMakeLists.txt b/mlir/lib/Dialect/OpenMP/Transforms/CMakeLists.txt
index 04fba34ae625c..94af617314388 100644
--- a/mlir/lib/Dialect/OpenMP/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/OpenMP/Transforms/CMakeLists.txt
@@ -10,10 +10,6 @@ add_mlir_dialect_library(MLIROpenMPTransforms
 
   DEPENDS
   omp_gen
-  MLIROpenMPPassIncGen
-  MLIROpenMPOpsIncGen
-  MLIROpenMPOpsInterfacesIncGen
-  MLIROpenMPTypeInterfacesIncGen
 
   LINK_LIBS PUBLIC
   MLIRFunctionInterfaces
diff --git a/mlir/lib/Dialect/PDL/IR/CMakeLists.txt b/mlir/lib/Dialect/PDL/IR/CMakeLists.txt
index a0bec9f51a623..f62eb2a573e9d 100644
--- a/mlir/lib/Dialect/PDL/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/PDL/IR/CMakeLists.txt
@@ -5,9 +5,6 @@ add_mlir_dialect_library(MLIRPDLDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/PDL
 
-  DEPENDS
-  MLIRPDLOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRInferTypeOpInterface
diff --git a/mlir/lib/Dialect/PDLInterp/IR/CMakeLists.txt b/mlir/lib/Dialect/PDLInterp/IR/CMakeLists.txt
index a2395872dca64..a9a9f352f1aa1 100644
--- a/mlir/lib/Dialect/PDLInterp/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/PDLInterp/IR/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_dialect_library(MLIRPDLInterpDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/PDLInterp
 
-  DEPENDS
-  MLIRPDLInterpOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRFunctionInterfaces
   MLIRIR
diff --git a/mlir/lib/Dialect/Ptr/IR/CMakeLists.txt b/mlir/lib/Dialect/Ptr/IR/CMakeLists.txt
index a6b0d416a4165..7a86fee0828c1 100644
--- a/mlir/lib/Dialect/Ptr/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/Ptr/IR/CMakeLists.txt
@@ -9,9 +9,6 @@ add_mlir_dialect_library(
   MLIRPtrMemorySpaceInterfaces
   MemorySpaceInterfaces.cpp
 
-  DEPENDS
-  MLIRPtrOpsEnumsGen
-  MLIRPtrMemorySpaceInterfacesIncGen
   LINK_LIBS
   PUBLIC
   MLIRIR
@@ -23,11 +20,10 @@ add_mlir_dialect_library(
   PtrTypes.cpp
   PtrDialect.cpp
 
-  DEPENDS
-  MLIRPtrOpsAttributesIncGen
-  MLIRPtrOpsIncGen
-  MLIRPtrOpsEnumsGen
-  MLIRPtrMemorySpaceInterfacesIncGen
+  # PtrDialect.cpp includes mlir/Transforms/InliningUtils.h.
+  HEADER_LIBS PRIVATE
+  MLIRTransforms
+
   LINK_LIBS
   PUBLIC
   MLIRIR
diff --git a/mlir/lib/Dialect/Quant/IR/CMakeLists.txt b/mlir/lib/Dialect/Quant/IR/CMakeLists.txt
index c9e10ae52825e..31358fc14231b 100644
--- a/mlir/lib/Dialect/Quant/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/Quant/IR/CMakeLists.txt
@@ -9,9 +9,9 @@ add_mlir_dialect_library(MLIRQuantDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/QuantOps/IR
 
-  DEPENDS
-  MLIRQuantOpsIncGen
-  MLIRQuantDialectBytecodeIncGen
+  # QuantOps.cpp includes mlir/Transforms/InliningUtils.h.
+  HEADER_LIBS PRIVATE
+  MLIRTransforms
 
   LINK_LIBS PUBLIC
   MLIRIR
diff --git a/mlir/lib/Dialect/Quant/Transforms/CMakeLists.txt b/mlir/lib/Dialect/Quant/Transforms/CMakeLists.txt
index deb7109c904f4..7e4f16ad8ca82 100644
--- a/mlir/lib/Dialect/Quant/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/Quant/Transforms/CMakeLists.txt
@@ -6,9 +6,6 @@ add_mlir_dialect_library(MLIRQuantTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Quant/Transforms
 
-  DEPENDS
-  MLIRQuantTransformsIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRFuncDialect
diff --git a/mlir/lib/Dialect/SCF/IR/CMakeLists.txt b/mlir/lib/Dialect/SCF/IR/CMakeLists.txt
index 5e7d10e4a9d6a..e0da2e9a54852 100644
--- a/mlir/lib/Dialect/SCF/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/SCF/IR/CMakeLists.txt
@@ -7,9 +7,6 @@ add_mlir_dialect_library(MLIRSCFDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/SCF
 
-  DEPENDS
-  MLIRSCFOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRControlFlowDialect
diff --git a/mlir/lib/Dialect/SCF/TransformOps/CMakeLists.txt b/mlir/lib/Dialect/SCF/TransformOps/CMakeLists.txt
index 06bccab80e7d8..f346eba3826b7 100644
--- a/mlir/lib/Dialect/SCF/TransformOps/CMakeLists.txt
+++ b/mlir/lib/Dialect/SCF/TransformOps/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_dialect_library(MLIRSCFTransformOps
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/SCF/TransformOps
 
-  DEPENDS
-  MLIRSCFTransformOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineDialect
   MLIRFuncDialect
diff --git a/mlir/lib/Dialect/SCF/Transforms/CMakeLists.txt b/mlir/lib/Dialect/SCF/Transforms/CMakeLists.txt
index fb9aa4018d263..30e9e4eef5305 100644
--- a/mlir/lib/Dialect/SCF/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/SCF/Transforms/CMakeLists.txt
@@ -21,9 +21,6 @@ add_mlir_dialect_library(MLIRSCFTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/SCF
 
-  DEPENDS
-  MLIRSCFPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineDialect
   MLIRAffineAnalysis
diff --git a/mlir/lib/Dialect/SMT/IR/CMakeLists.txt b/mlir/lib/Dialect/SMT/IR/CMakeLists.txt
index e287613da9fd0..a94042531dd94 100644
--- a/mlir/lib/Dialect/SMT/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/SMT/IR/CMakeLists.txt
@@ -7,11 +7,6 @@ add_mlir_dialect_library(MLIRSMT
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/SMT
 
-  DEPENDS
-  MLIRSMTAttrIncGen
-  MLIRSMTEnumsIncGen
-  MLIRSMTIncGen
-
   LINK_COMPONENTS
   Support
 
@@ -21,7 +16,3 @@ add_mlir_dialect_library(MLIRSMT
   MLIRSideEffectInterfaces
   MLIRControlFlowInterfaces
 )
-
-add_dependencies(mlir-headers
-  MLIRSMTIncGen
-)
diff --git a/mlir/lib/Dialect/SPIRV/IR/CMakeLists.txt b/mlir/lib/Dialect/SPIRV/IR/CMakeLists.txt
index 742272163cd82..de3310fd5f1ba 100644
--- a/mlir/lib/Dialect/SPIRV/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/SPIRV/IR/CMakeLists.txt
@@ -1,6 +1,7 @@
 set(LLVM_TARGET_DEFINITIONS SPIRVCanonicalization.td)
 mlir_tablegen(SPIRVCanonicalization.inc -gen-rewriters)
-add_public_tablegen_target(MLIRSPIRVCanonicalizationIncGen)
+add_mlir_library_tablegen_target(MLIRSPIRVCanonicalizationIncGen
+  MLIRSPIRVDialect)
 
 set(LLVM_OPTIONAL_SOURCES
   SPIRVOpDefinitions.cpp
@@ -44,17 +45,12 @@ add_mlir_dialect_library(MLIRSPIRVDialect
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/SPIRV
 
   DEPENDS
-  MLIRGPUDialect
-  MLIRSPIRVAttributeIncGen
-  MLIRSPIRVAttrUtilsGen
-  MLIRSPIRVAvailabilityIncGen
-  MLIRSPIRVCanonicalizationIncGen
-  MLIRSPIRVEnumAvailabilityIncGen
-  MLIRSPIRVEnumsIncGen
-  MLIRSPIRVImageInterfacesIncGen
-  MLIRSPIRVOpsIncGen
   MLIRSPIRVOpsShardGen
 
+  # SPIRVDialect.cpp includes the generated GPU CompilationInterfaces.
+  HEADER_LIBS PRIVATE
+  MLIRGPUDialect
+
   LINK_LIBS PUBLIC
   MLIRControlFlowInterfaces
   MLIRFunctionInterfaces
diff --git a/mlir/lib/Dialect/SPIRV/Interfaces/CMakeLists.txt b/mlir/lib/Dialect/SPIRV/Interfaces/CMakeLists.txt
index 2868e3b641b91..b22db8a222b83 100644
--- a/mlir/lib/Dialect/SPIRV/Interfaces/CMakeLists.txt
+++ b/mlir/lib/Dialect/SPIRV/Interfaces/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_library(MLIRSPIRVImageInterfaces
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/SPIRV
 
-  DEPENDS
-  MLIRSPIRVImageInterfacesIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
 )
diff --git a/mlir/lib/Dialect/SPIRV/Transforms/CMakeLists.txt b/mlir/lib/Dialect/SPIRV/Transforms/CMakeLists.txt
index b947447dad46a..807e4cca952c7 100644
--- a/mlir/lib/Dialect/SPIRV/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/SPIRV/Transforms/CMakeLists.txt
@@ -42,9 +42,6 @@ add_mlir_dialect_library(MLIRSPIRVTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/SPIRV
 
-  DEPENDS
-  MLIRSPIRVPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRPass
   MLIRSPIRVConversion
diff --git a/mlir/lib/Dialect/Shape/IR/CMakeLists.txt b/mlir/lib/Dialect/Shape/IR/CMakeLists.txt
index 32a86b483a49b..2fbf0fdc1b464 100644
--- a/mlir/lib/Dialect/Shape/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/Shape/IR/CMakeLists.txt
@@ -8,9 +8,6 @@ add_mlir_dialect_library(MLIRShapeDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Shape
 
-  DEPENDS
-  MLIRShapeOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRCallInterfaces
diff --git a/mlir/lib/Dialect/Shape/Transforms/CMakeLists.txt b/mlir/lib/Dialect/Shape/Transforms/CMakeLists.txt
index a51c6780c2866..763582b20454a 100644
--- a/mlir/lib/Dialect/Shape/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/Shape/Transforms/CMakeLists.txt
@@ -7,12 +7,14 @@ add_mlir_dialect_library(MLIRShapeOpsTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/ShapeOps/Transforms
 
-  DEPENDS
-  MLIRShapeTransformsIncGen
-  )
+  # The implementations include FuncOps.h and Tensor.h; Tensor.h includes
+  # Dialect/Utils/ReshapeOpsUtils.h.
+  HEADER_LIBS PRIVATE
+  MLIRDialectUtils
+  MLIRFuncDialect
+  MLIRTensorDialect
 
-target_link_libraries(MLIRShapeOpsTransforms
-  PUBLIC
+  LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRBufferizationDialect
   MLIRBufferizationTransforms
diff --git a/mlir/lib/Dialect/Shard/IR/CMakeLists.txt b/mlir/lib/Dialect/Shard/IR/CMakeLists.txt
index 70c6049884e12..3a4ff872f3838 100644
--- a/mlir/lib/Dialect/Shard/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/Shard/IR/CMakeLists.txt
@@ -4,8 +4,9 @@ add_mlir_dialect_library(MLIRShardDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Shard
 
-  DEPENDS
-  MLIRShardIncGen
+  # ShardOps.cpp includes mlir/Transforms/InliningUtils.h.
+  HEADER_LIBS PRIVATE
+  MLIRTransforms
 
   LINK_LIBS PUBLIC
   MLIRArithDialect
diff --git a/mlir/lib/Dialect/Shard/Interfaces/CMakeLists.txt b/mlir/lib/Dialect/Shard/Interfaces/CMakeLists.txt
index 01e8e56dd391d..dd011866a610b 100644
--- a/mlir/lib/Dialect/Shard/Interfaces/CMakeLists.txt
+++ b/mlir/lib/Dialect/Shard/Interfaces/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_library(MLIRShardingInterface
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Shard
 
-  DEPENDS
-  MLIRShardingInterfaceIncGen
-
   LINK_LIBS PUBLIC
   MLIRDialectUtils
   MLIRIR
diff --git a/mlir/lib/Dialect/Shard/Transforms/CMakeLists.txt b/mlir/lib/Dialect/Shard/Transforms/CMakeLists.txt
index 4e3fb6db9966c..67b34f5a85152 100644
--- a/mlir/lib/Dialect/Shard/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/Shard/Transforms/CMakeLists.txt
@@ -7,8 +7,8 @@ add_mlir_dialect_library(MLIRShardTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Shard
 
-  DEPENDS
-  MLIRShardPassIncGen
+  # Partition.cpp and ShardingPropagation.cpp include ShardingInterface.h.
+  HEADER_LIBS PRIVATE
   MLIRShardingInterface
 
   LINK_LIBS PUBLIC
diff --git a/mlir/lib/Dialect/SparseTensor/IR/CMakeLists.txt b/mlir/lib/Dialect/SparseTensor/IR/CMakeLists.txt
index fe2cc90688d08..b89ca1f75edd0 100644
--- a/mlir/lib/Dialect/SparseTensor/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/SparseTensor/IR/CMakeLists.txt
@@ -38,10 +38,9 @@ add_mlir_dialect_library(MLIRSparseTensorDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/SparseTensor
 
-  DEPENDS
-  MLIRSparseTensorAttrDefsIncGen
-  MLIRSparseTensorOpsIncGen
-  MLIRSparseTensorTypesIncGen
+  # SparseTensorDialect.cpp includes the generated BufferizableOpInterface.
+  HEADER_LIBS PRIVATE
+  MLIRBufferizationDialect
 
   LINK_LIBS PUBLIC
   MLIRArithDialect
diff --git a/mlir/lib/Dialect/SparseTensor/TransformOps/CMakeLists.txt b/mlir/lib/Dialect/SparseTensor/TransformOps/CMakeLists.txt
index 53ae92535b325..7356e66a09073 100644
--- a/mlir/lib/Dialect/SparseTensor/TransformOps/CMakeLists.txt
+++ b/mlir/lib/Dialect/SparseTensor/TransformOps/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_dialect_library(MLIRSparseTensorTransformOps
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/SparseTensor/TransformOps
 
-  DEPENDS
-  MLIRSparseTensorTransformOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRSparseTensorDialect
diff --git a/mlir/lib/Dialect/SparseTensor/Transforms/CMakeLists.txt b/mlir/lib/Dialect/SparseTensor/Transforms/CMakeLists.txt
index 43e5c3251c525..6be6bbe4ee2be 100644
--- a/mlir/lib/Dialect/SparseTensor/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/SparseTensor/Transforms/CMakeLists.txt
@@ -27,9 +27,6 @@ add_mlir_dialect_library(MLIRSparseTensorTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/SparseTensor
 
-  DEPENDS
-  MLIRSparseTensorPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRBufferizationDialect
diff --git a/mlir/lib/Dialect/Tensor/IR/CMakeLists.txt b/mlir/lib/Dialect/Tensor/IR/CMakeLists.txt
index 66b73f9bead5d..98f10014766a4 100644
--- a/mlir/lib/Dialect/Tensor/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/Tensor/IR/CMakeLists.txt
@@ -14,9 +14,6 @@ add_mlir_dialect_library(MLIRTensorDialect
   ADDITIONAL_HEADER_DIRS
   ${PROJECT_SOURCE_DIR}/include/mlir/Dialect/Tensor
 
-  DEPENDS
-  MLIRTensorOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineDialect
   MLIRArithDialect
diff --git a/mlir/lib/Dialect/Tensor/TransformOps/CMakeLists.txt b/mlir/lib/Dialect/Tensor/TransformOps/CMakeLists.txt
index 113a29b31d0ac..b8b18686abf76 100644
--- a/mlir/lib/Dialect/Tensor/TransformOps/CMakeLists.txt
+++ b/mlir/lib/Dialect/Tensor/TransformOps/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_dialect_library(MLIRTensorTransformOps
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Tensor/TransformOps
 
-  DEPENDS
-  MLIRTensorTransformOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineDialect
   MLIRIR
diff --git a/mlir/lib/Dialect/Tensor/Transforms/CMakeLists.txt b/mlir/lib/Dialect/Tensor/Transforms/CMakeLists.txt
index 78e64c82544e0..a197e13b1436d 100644
--- a/mlir/lib/Dialect/Tensor/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/Tensor/Transforms/CMakeLists.txt
@@ -16,9 +16,6 @@ add_mlir_dialect_library(MLIRTensorTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Tensor/Transforms
 
-  DEPENDS
-  MLIRTensorTransformsIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineDialect
   MLIRAffineTransforms
diff --git a/mlir/lib/Dialect/Tosa/CMakeLists.txt b/mlir/lib/Dialect/Tosa/CMakeLists.txt
index 6404ca8fc5a56..78a2fb2b8880a 100644
--- a/mlir/lib/Dialect/Tosa/CMakeLists.txt
+++ b/mlir/lib/Dialect/Tosa/CMakeLists.txt
@@ -8,14 +8,6 @@ add_mlir_dialect_library(MLIRTosaDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Tosa
 
-  DEPENDS
-  MLIRTosaAttributesIncGen
-  MLIRTosaDialectBytecodeIncGen
-  MLIRTosaOpsIncGen
-  MLIRTosaInterfacesIncGen
-  MLIRTosaEnumsIncGen
-  MLIRShardingInterfaceIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRDialect
diff --git a/mlir/lib/Dialect/Tosa/Transforms/CMakeLists.txt b/mlir/lib/Dialect/Tosa/Transforms/CMakeLists.txt
index 1fd18bb5a395b..0d0533b4a0f1b 100644
--- a/mlir/lib/Dialect/Tosa/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/Tosa/Transforms/CMakeLists.txt
@@ -20,9 +20,6 @@ add_mlir_dialect_library(MLIRTosaTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Tosa/Transforms
 
-  DEPENDS
-  MLIRTosaPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRFuncDialect
   MLIRFuncTransformOps
diff --git a/mlir/lib/Dialect/Transform/DebugExtension/CMakeLists.txt b/mlir/lib/Dialect/Transform/DebugExtension/CMakeLists.txt
index 38aca4c7340e9..f57bf52005102 100644
--- a/mlir/lib/Dialect/Transform/DebugExtension/CMakeLists.txt
+++ b/mlir/lib/Dialect/Transform/DebugExtension/CMakeLists.txt
@@ -2,9 +2,6 @@ add_mlir_dialect_library(MLIRTransformDebugExtension
   DebugExtension.cpp
   DebugExtensionOps.cpp
 
-  DEPENDS
-  MLIRTransformDialectDebugExtensionOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRTransformDialect
diff --git a/mlir/lib/Dialect/Transform/IRDLExtension/CMakeLists.txt b/mlir/lib/Dialect/Transform/IRDLExtension/CMakeLists.txt
index 9216a3d722021..813d3aa7d6bf7 100644
--- a/mlir/lib/Dialect/Transform/IRDLExtension/CMakeLists.txt
+++ b/mlir/lib/Dialect/Transform/IRDLExtension/CMakeLists.txt
@@ -2,9 +2,6 @@ add_mlir_dialect_library(MLIRTransformDialectIRDLExtension
   IRDLExtension.cpp
   IRDLExtensionOps.cpp
 
-  DEPENDS
-  MLIRTransformDialectIRDLExtensionOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRTransformDialect
diff --git a/mlir/lib/Dialect/Transform/Interfaces/CMakeLists.txt b/mlir/lib/Dialect/Transform/Interfaces/CMakeLists.txt
index fc9cbfdc9a5bf..32a900532ea34 100644
--- a/mlir/lib/Dialect/Transform/Interfaces/CMakeLists.txt
+++ b/mlir/lib/Dialect/Transform/Interfaces/CMakeLists.txt
@@ -2,10 +2,6 @@ add_mlir_library(MLIRTransformDialectInterfaces
   MatchInterfaces.cpp
   TransformInterfaces.cpp
 
-  DEPENDS
-  MLIRMatchInterfacesIncGen
-  MLIRTransformInterfacesIncGen
-
   LINK_LIBS PUBLIC
   MLIRCastInterfaces
   MLIRIR
diff --git a/mlir/lib/Dialect/Transform/LoopExtension/CMakeLists.txt b/mlir/lib/Dialect/Transform/LoopExtension/CMakeLists.txt
index 9e1abdd1ca17b..97b97f8782609 100644
--- a/mlir/lib/Dialect/Transform/LoopExtension/CMakeLists.txt
+++ b/mlir/lib/Dialect/Transform/LoopExtension/CMakeLists.txt
@@ -2,9 +2,6 @@ add_mlir_dialect_library(MLIRTransformLoopExtension
   LoopExtension.cpp
   LoopExtensionOps.cpp
 
-  DEPENDS
-  MLIRTransformDialectLoopExtensionOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRLoopLikeInterface
diff --git a/mlir/lib/Dialect/Transform/PDLExtension/CMakeLists.txt b/mlir/lib/Dialect/Transform/PDLExtension/CMakeLists.txt
index 4a60ed48a1343..cf80556eaf68c 100644
--- a/mlir/lib/Dialect/Transform/PDLExtension/CMakeLists.txt
+++ b/mlir/lib/Dialect/Transform/PDLExtension/CMakeLists.txt
@@ -2,9 +2,6 @@ add_mlir_dialect_library(MLIRTransformPDLExtension
   PDLExtension.cpp
   PDLExtensionOps.cpp
 
-  DEPENDS
-  MLIRTransformDialectPDLExtensionOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRTransformDialect
diff --git a/mlir/lib/Dialect/Transform/SMTExtension/CMakeLists.txt b/mlir/lib/Dialect/Transform/SMTExtension/CMakeLists.txt
index ba1cc464e506d..fb027e9866c90 100644
--- a/mlir/lib/Dialect/Transform/SMTExtension/CMakeLists.txt
+++ b/mlir/lib/Dialect/Transform/SMTExtension/CMakeLists.txt
@@ -2,9 +2,6 @@ add_mlir_dialect_library(MLIRTransformSMTExtension
   SMTExtension.cpp
   SMTExtensionOps.cpp
 
-  DEPENDS
-  MLIRTransformDialectSMTExtensionOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRTransformDialect
diff --git a/mlir/lib/Dialect/Transform/Transforms/CMakeLists.txt b/mlir/lib/Dialect/Transform/Transforms/CMakeLists.txt
index 9fed8c6b5caa9..305e64a4f301a 100644
--- a/mlir/lib/Dialect/Transform/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/Transform/Transforms/CMakeLists.txt
@@ -5,9 +5,6 @@ add_mlir_dialect_library(MLIRTransformDialectTransforms
   PreloadLibraryPass.cpp
   TransformInterpreterUtils.cpp
 
-  DEPENDS
-  MLIRTransformDialectTransformsIncGen
-
   LINK_LIBS PUBLIC
   MLIRFunctionInterfaces
   MLIRTransformDialect
diff --git a/mlir/lib/Dialect/Transform/TuneExtension/CMakeLists.txt b/mlir/lib/Dialect/Transform/TuneExtension/CMakeLists.txt
index 56b90a9a04edf..eab161e025ec9 100644
--- a/mlir/lib/Dialect/Transform/TuneExtension/CMakeLists.txt
+++ b/mlir/lib/Dialect/Transform/TuneExtension/CMakeLists.txt
@@ -2,9 +2,6 @@ add_mlir_dialect_library(MLIRTransformTuneExtension
   TuneExtension.cpp
   TuneExtensionOps.cpp
 
-  DEPENDS
-  MLIRTransformDialectTuneExtensionOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRTransformDialect
diff --git a/mlir/lib/Dialect/UB/IR/CMakeLists.txt b/mlir/lib/Dialect/UB/IR/CMakeLists.txt
index 84125ea0b5718..c5a3f4e97e5b7 100644
--- a/mlir/lib/Dialect/UB/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/UB/IR/CMakeLists.txt
@@ -4,9 +4,9 @@ add_mlir_dialect_library(MLIRUBDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/UB
 
-  DEPENDS
-  MLIRUBOpsIncGen
-  MLIRUBOpsInterfacesIncGen
+  # UBOps.cpp includes mlir/Transforms/InliningUtils.h.
+  HEADER_LIBS PRIVATE
+  MLIRTransforms
 
   LINK_LIBS PUBLIC
   MLIRIR
diff --git a/mlir/lib/Dialect/Utils/CMakeLists.txt b/mlir/lib/Dialect/Utils/CMakeLists.txt
index 7673da5932304..91755a32a944d 100644
--- a/mlir/lib/Dialect/Utils/CMakeLists.txt
+++ b/mlir/lib/Dialect/Utils/CMakeLists.txt
@@ -5,8 +5,8 @@ add_mlir_library(MLIRDialectUtils
   StaticValueUtils.cpp
   VerificationUtils.cpp
 
-  DEPENDS
-  MLIRDialectUtilsIncGen
+  # ReshapeOpsUtils.h includes the generated Arith operation declarations.
+  HEADER_LIBS PUBLIC
   MLIRArithDialect
 
   LINK_LIBS PUBLIC
diff --git a/mlir/lib/Dialect/Vector/IR/CMakeLists.txt b/mlir/lib/Dialect/Vector/IR/CMakeLists.txt
index f45618cda8ece..8d6597ce5a692 100644
--- a/mlir/lib/Dialect/Vector/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/Vector/IR/CMakeLists.txt
@@ -6,12 +6,6 @@ add_mlir_dialect_library(MLIRVectorDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Vector/IR
 
-  DEPENDS
-  MLIRMaskableOpInterfaceIncGen
-  MLIRMaskingOpInterfaceIncGen
-  MLIRVectorOpsIncGen
-  MLIRVectorAttributesIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineDialect
   MLIRArithDialect
diff --git a/mlir/lib/Dialect/Vector/Interfaces/CMakeLists.txt b/mlir/lib/Dialect/Vector/Interfaces/CMakeLists.txt
index b93cefd525fe5..ec7abc0e027b1 100644
--- a/mlir/lib/Dialect/Vector/Interfaces/CMakeLists.txt
+++ b/mlir/lib/Dialect/Vector/Interfaces/CMakeLists.txt
@@ -10,9 +10,6 @@ function(add_mlir_interface_library name)
     ADDITIONAL_HEADER_DIRS
     ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Vector/Interfaces
 
-    DEPENDS
-    MLIR${name}IncGen
-
     LINK_LIBS PUBLIC
     MLIRIR
     )
diff --git a/mlir/lib/Dialect/Vector/TransformOps/CMakeLists.txt b/mlir/lib/Dialect/Vector/TransformOps/CMakeLists.txt
index ab3205e623fb3..a8fdd04ecff53 100644
--- a/mlir/lib/Dialect/Vector/TransformOps/CMakeLists.txt
+++ b/mlir/lib/Dialect/Vector/TransformOps/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_dialect_library(MLIRVectorTransformOps
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Vector/TransformOps
 
-  DEPENDS
-  MLIRVectorTransformOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRLLVMCommonConversion
diff --git a/mlir/lib/Dialect/Vector/Transforms/CMakeLists.txt b/mlir/lib/Dialect/Vector/Transforms/CMakeLists.txt
index dfe873f1a1b8d..a0f4f9ce27b37 100644
--- a/mlir/lib/Dialect/Vector/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/Vector/Transforms/CMakeLists.txt
@@ -32,9 +32,6 @@ add_mlir_dialect_library(MLIRVectorTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Vector/Transforms
 
-  DEPENDS
-  MLIRVectorTransformsIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineDialect
   MLIRAffineAnalysis
diff --git a/mlir/lib/Dialect/WasmSSA/IR/CMakeLists.txt b/mlir/lib/Dialect/WasmSSA/IR/CMakeLists.txt
index 9fc2d7b87abd7..5f6555d98a88e 100644
--- a/mlir/lib/Dialect/WasmSSA/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/WasmSSA/IR/CMakeLists.txt
@@ -7,10 +7,6 @@ add_mlir_dialect_library(MLIRWasmSSADialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/WasmSSA
 
-  DEPENDS
-  MLIRWasmSSAOpsIncGen
-  MLIRWasmSSAInterfacesIncGen
-
   LINK_LIBS PUBLIC
   MLIRCastInterfaces
   MLIRDataLayoutInterfaces
diff --git a/mlir/lib/Dialect/X86/IR/CMakeLists.txt b/mlir/lib/Dialect/X86/IR/CMakeLists.txt
index 1385e55169f84..e2594fa028b52 100644
--- a/mlir/lib/Dialect/X86/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/X86/IR/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_dialect_library(MLIRX86Dialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/X86
 
-  DEPENDS
-  MLIRX86IncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRLLVMCommonConversion
diff --git a/mlir/lib/Dialect/X86/TransformOps/CMakeLists.txt b/mlir/lib/Dialect/X86/TransformOps/CMakeLists.txt
index 5fe2fbc233eae..07d2d59d86bed 100644
--- a/mlir/lib/Dialect/X86/TransformOps/CMakeLists.txt
+++ b/mlir/lib/Dialect/X86/TransformOps/CMakeLists.txt
@@ -1,9 +1,6 @@
 add_mlir_dialect_library(MLIRX86TransformOps
   X86TransformOps.cpp
 
-  DEPENDS
-  MLIRX86TransformOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRLLVMCommonConversion
diff --git a/mlir/lib/Dialect/XeGPU/IR/CMakeLists.txt b/mlir/lib/Dialect/XeGPU/IR/CMakeLists.txt
index 4ea73cda6de95..7d92ce43b0499 100644
--- a/mlir/lib/Dialect/XeGPU/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/XeGPU/IR/CMakeLists.txt
@@ -5,12 +5,6 @@ add_mlir_dialect_library(MLIRXeGPUDialect
   ADDITIONAL_HEADER_DIRS
   ${PROJECT_SOURCE_DIR}/include/mlir/Dialect/XeGPU
 
-  DEPENDS
-  MLIRXeGPUIncGen
-  MLIRXeGPUAttrInterfaceIncGen
-  MLIRXeGPUAttrsIncGen
-  MLIRXeGPUEnumsIncGen
-
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRIndexDialect
diff --git a/mlir/lib/Dialect/XeGPU/TransformOps/CMakeLists.txt b/mlir/lib/Dialect/XeGPU/TransformOps/CMakeLists.txt
index 48fe841afaa83..a02b573808432 100644
--- a/mlir/lib/Dialect/XeGPU/TransformOps/CMakeLists.txt
+++ b/mlir/lib/Dialect/XeGPU/TransformOps/CMakeLists.txt
@@ -4,9 +4,6 @@ add_mlir_dialect_library(MLIRXeGPUTransformOps
   ADDITIONAL_HEADER_DIRS
   ${PROJECT_SOURCE_DIR}/mlir/Dialect/XeGPU/TransformOps/
 
-  DEPENDS
-  MLIRXeGPUTransformOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRXeGPUDialect
   MLIRXeGPUTransforms
diff --git a/mlir/lib/Dialect/XeGPU/Transforms/CMakeLists.txt b/mlir/lib/Dialect/XeGPU/Transforms/CMakeLists.txt
index 2ed81ae05ab34..67235427a4a04 100644
--- a/mlir/lib/Dialect/XeGPU/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/XeGPU/Transforms/CMakeLists.txt
@@ -13,9 +13,6 @@ add_mlir_dialect_library(MLIRXeGPUTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/XeGPU
 
-  DEPENDS
-  MLIRXeGPUPassIncGen
-
   LINK_LIBS PUBLIC
   MLIRAffineUtils
   MLIRIR
diff --git a/mlir/lib/IR/CMakeLists.txt b/mlir/lib/IR/CMakeLists.txt
index 6cadc3131ccd4..c646df7747c90 100644
--- a/mlir/lib/IR/CMakeLists.txt
+++ b/mlir/lib/IR/CMakeLists.txt
@@ -50,28 +50,6 @@ add_mlir_library(MLIRIR
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/IR
 
-  DEPENDS
-  MLIRBuiltinAttributesIncGen
-  MLIRBuiltinAttributeInterfacesIncGen
-  MLIRBuiltinDialectBytecodeIncGen
-  MLIRBuiltinDialectIncGen
-  MLIRBuiltinLocationAttributesIncGen
-  MLIRBuiltinOpsIncGen
-  MLIRBuiltinTypesIncGen
-  MLIRBuiltinTypeConstraintsIncGen
-  MLIRBuiltinTypeInterfacesIncGen
-  MLIRCallInterfacesIncGen
-  MLIRCastInterfacesIncGen
-  MLIRDataLayoutInterfacesIncGen
-  MLIRDialectFoldInterfaceIncGen
-  MLIROpAsmInterfaceIncGen
-  MLIRQuantStorageTypeInterfaceIncGen
-  MLIRRegionKindInterfaceIncGen
-  MLIRSideEffectInterfacesIncGen
-  MLIRSymbolInterfacesIncGen
-  MLIRTensorEncodingIncGen
-  MLIROpAsmDialectInterfaceIncGen
-
   LINK_LIBS PUBLIC
   MLIRSupport
   )
diff --git a/mlir/lib/Interfaces/CMakeLists.txt b/mlir/lib/Interfaces/CMakeLists.txt
index d20d290c45c01..ac67b77082bd0 100644
--- a/mlir/lib/Interfaces/CMakeLists.txt
+++ b/mlir/lib/Interfaces/CMakeLists.txt
@@ -34,9 +34,6 @@ function(add_mlir_interface_library name)
     ADDITIONAL_HEADER_DIRS
     ${MLIR_MAIN_INCLUDE_DIR}/mlir/Interfaces
 
-    DEPENDS
-    MLIR${name}IncGen
-
     LINK_LIBS PUBLIC
     MLIRIR
     )
@@ -58,9 +55,6 @@ add_mlir_library(MLIRFunctionInterfaces
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Interfaces
 
-  DEPENDS
-  MLIRFunctionInterfacesIncGen
-
   LINK_LIBS PUBLIC
   MLIRCallInterfaces
   MLIRIR
@@ -76,9 +70,6 @@ add_mlir_library(MLIRInferStridedMetadataInterface
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Interfaces
 
-  DEPENDS
-  MLIRInferStridedMetadataInterfaceIncGen
-
   LINK_LIBS PUBLIC
   MLIRInferIntRangeInterface
   MLIRIR
@@ -92,9 +83,6 @@ add_mlir_library(MLIRLoopLikeInterface
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Interfaces
 
-  DEPENDS
-  MLIRLoopLikeInterfaceIncGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRControlFlowInterfaces
@@ -114,11 +102,6 @@ add_mlir_library(MLIRSubsetOpInterface
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Interfaces
 
-  DEPENDS
-  MLIRDestinationStyleOpInterface
-  MLIRSubsetOpInterfaceIncGen
-  MLIRValueBoundsOpInterface
-
   LINK_LIBS PUBLIC
   MLIRDestinationStyleOpInterface
   MLIRIR
@@ -131,8 +114,8 @@ add_mlir_library(MLIRTilingInterface
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Interfaces
 
-  DEPENDS
-  MLIRTilingInterfaceIncGen
+  # TilingInterface.h includes Dialect/Utils/StructuredOpsUtils.h.
+  HEADER_LIBS PUBLIC
   MLIRDialectUtils
 
   LINK_LIBS PUBLIC
@@ -148,9 +131,8 @@ add_mlir_library(MLIRValueBoundsOpInterface
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Interfaces
 
-  DEPENDS
-  MLIRDestinationStyleOpInterface
-  MLIRValueBoundsOpInterfaceIncGen
+  # ValueBoundsOpInterface.cpp includes the generated ViewLike interface.
+  HEADER_LIBS PRIVATE
   MLIRViewLikeInterface
 
   LINK_LIBS PUBLIC
diff --git a/mlir/lib/Interfaces/Utils/CMakeLists.txt b/mlir/lib/Interfaces/Utils/CMakeLists.txt
index c722fbf4ece09..714e2193831e8 100644
--- a/mlir/lib/Interfaces/Utils/CMakeLists.txt
+++ b/mlir/lib/Interfaces/Utils/CMakeLists.txt
@@ -9,9 +9,6 @@ add_mlir_library(MLIRInferIntRangeCommon
     ADDITIONAL_HEADER_DIRS
     ${MLIR_MAIN_INCLUDE_DIR}/mlir/Interfaces/Utils
 
-    DEPENDS
-    MLIRInferIntRangeInterfaceIncGen
-
     LINK_LIBS PUBLIC
     MLIRShapedOpInterfaces
     MLIRInferIntRangeInterface
diff --git a/mlir/lib/Reducer/CMakeLists.txt b/mlir/lib/Reducer/CMakeLists.txt
index 68864e373c993..25efe7e420098 100644
--- a/mlir/lib/Reducer/CMakeLists.txt
+++ b/mlir/lib/Reducer/CMakeLists.txt
@@ -10,9 +10,6 @@ add_mlir_library(MLIRReduce
    MLIRRewrite
    MLIRTransformUtils
 
-   DEPENDS
-   MLIRReducerIncGen
-   MLIRDialectReductionPatternInterfaceIncGen
 )
 
 mlir_check_all_link_libraries(MLIRReduce)
diff --git a/mlir/lib/Rewrite/CMakeLists.txt b/mlir/lib/Rewrite/CMakeLists.txt
index 15b3739e4c633..53bf0b2d99bde 100644
--- a/mlir/lib/Rewrite/CMakeLists.txt
+++ b/mlir/lib/Rewrite/CMakeLists.txt
@@ -9,7 +9,12 @@ add_mlir_library(MLIRRewrite
 
   DEPENDS
   mlir-generic-headers
-  MLIRConversionPassIncGen
+
+  # ByteCode.cpp and FrozenRewritePatternSet.cpp include generated PDL and
+  # PDLInterp operation declarations.
+  HEADER_LIBS PRIVATE
+  MLIRPDLDialect
+  MLIRPDLInterpDialect
 
   LINK_LIBS PUBLIC
   MLIRIR
@@ -40,4 +45,3 @@ if(MLIR_ENABLE_PDL_IN_PATTERNMATCH)
     MLIRPDLToPDLInterp
     MLIRRewritePDL)
 endif()
-
diff --git a/mlir/lib/Target/LLVMIR/CMakeLists.txt b/mlir/lib/Target/LLVMIR/CMakeLists.txt
index 69fd5583fac2a..87141e9904b45 100644
--- a/mlir/lib/Target/LLVMIR/CMakeLists.txt
+++ b/mlir/lib/Target/LLVMIR/CMakeLists.txt
@@ -75,9 +75,6 @@ add_mlir_translation_library(MLIRTargetLLVMIRImport
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Target/LLVMIR
 
-  DEPENDS
-  MLIRLLVMImportDialectInterfaceIncGen
-
   LINK_COMPONENTS
   Core
   IRReader
diff --git a/mlir/lib/Target/LLVMIR/Dialect/ArmNeon/CMakeLists.txt b/mlir/lib/Target/LLVMIR/Dialect/ArmNeon/CMakeLists.txt
index 516fa179aa56e..edfaae4827500 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/ArmNeon/CMakeLists.txt
+++ b/mlir/lib/Target/LLVMIR/Dialect/ArmNeon/CMakeLists.txt
@@ -1,9 +1,6 @@
 add_mlir_translation_library(MLIRArmNeonToLLVMIRTranslation
   ArmNeonToLLVMIRTranslation.cpp
 
-  DEPENDS
-  MLIRArmNeonConversionsIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Target/LLVMIR/Dialect/ArmSME/CMakeLists.txt b/mlir/lib/Target/LLVMIR/Dialect/ArmSME/CMakeLists.txt
index d34cebf487271..88b802266b13e 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/ArmSME/CMakeLists.txt
+++ b/mlir/lib/Target/LLVMIR/Dialect/ArmSME/CMakeLists.txt
@@ -1,9 +1,6 @@
 add_mlir_translation_library(MLIRArmSMEToLLVMIRTranslation
   ArmSMEToLLVMIRTranslation.cpp
 
-  DEPENDS
-  MLIRArmSMEConversionsIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Target/LLVMIR/Dialect/ArmSVE/CMakeLists.txt b/mlir/lib/Target/LLVMIR/Dialect/ArmSVE/CMakeLists.txt
index 66180f9e001d5..f5f6b6905222f 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/ArmSVE/CMakeLists.txt
+++ b/mlir/lib/Target/LLVMIR/Dialect/ArmSVE/CMakeLists.txt
@@ -1,9 +1,6 @@
 add_mlir_translation_library(MLIRArmSVEToLLVMIRTranslation
   ArmSVEToLLVMIRTranslation.cpp
 
-  DEPENDS
-  MLIRArmSVEConversionsIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Target/LLVMIR/Dialect/NVVM/CMakeLists.txt b/mlir/lib/Target/LLVMIR/Dialect/NVVM/CMakeLists.txt
index a90de15798161..7a703e040c65d 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/NVVM/CMakeLists.txt
+++ b/mlir/lib/Target/LLVMIR/Dialect/NVVM/CMakeLists.txt
@@ -19,9 +19,6 @@ add_mlir_translation_library(MLIRLLVMIRToNVVMTranslation
 add_mlir_translation_library(MLIRNVVMToLLVMIRTranslation
   NVVMToLLVMIRTranslation.cpp
 
-  DEPENDS
-  MLIRNVVMConversionsIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Target/LLVMIR/Dialect/ROCDL/CMakeLists.txt b/mlir/lib/Target/LLVMIR/Dialect/ROCDL/CMakeLists.txt
index 9e69bcd4e9465..de78894a07ffe 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/ROCDL/CMakeLists.txt
+++ b/mlir/lib/Target/LLVMIR/Dialect/ROCDL/CMakeLists.txt
@@ -1,9 +1,6 @@
 add_mlir_translation_library(MLIRROCDLToLLVMIRTranslation
   ROCDLToLLVMIRTranslation.cpp
 
-  DEPENDS
-  MLIRROCDLConversionsIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Target/LLVMIR/Dialect/VCIX/CMakeLists.txt b/mlir/lib/Target/LLVMIR/Dialect/VCIX/CMakeLists.txt
index d2622af16d938..8bb678c0f2c2e 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/VCIX/CMakeLists.txt
+++ b/mlir/lib/Target/LLVMIR/Dialect/VCIX/CMakeLists.txt
@@ -1,9 +1,6 @@
 add_mlir_translation_library(MLIRVCIXToLLVMIRTranslation
   VCIXToLLVMIRTranslation.cpp
 
-  DEPENDS
-  MLIRVCIXConversionsIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Target/LLVMIR/Dialect/XeVM/CMakeLists.txt b/mlir/lib/Target/LLVMIR/Dialect/XeVM/CMakeLists.txt
index 6308d7e2e4404..979f3a475af4c 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/XeVM/CMakeLists.txt
+++ b/mlir/lib/Target/LLVMIR/Dialect/XeVM/CMakeLists.txt
@@ -5,9 +5,6 @@ set(LLVM_OPTIONAL_SOURCES
 add_mlir_translation_library(MLIRXeVMToLLVMIRTranslation
   XeVMToLLVMIRTranslation.cpp
 
-  DEPENDS
-  MLIRXeVMConversionsIncGen
-
   LINK_COMPONENTS
   Core
 
diff --git a/mlir/lib/Target/LLVMIR/Transforms/CMakeLists.txt b/mlir/lib/Target/LLVMIR/Transforms/CMakeLists.txt
index 044da1c442049..1d4f450d7a3c6 100644
--- a/mlir/lib/Target/LLVMIR/Transforms/CMakeLists.txt
+++ b/mlir/lib/Target/LLVMIR/Transforms/CMakeLists.txt
@@ -3,9 +3,6 @@ add_mlir_dialect_library(MLIRTargetLLVMIRTransforms
   TargetToTargetFeatures.cpp
   TargetUtils.cpp
 
-  DEPENDS
-  MLIRTargetLLVMIRTransformsIncGen
-
   LINK_COMPONENTS
   MC
   Target
diff --git a/mlir/lib/Target/SPIRV/CMakeLists.txt b/mlir/lib/Target/SPIRV/CMakeLists.txt
index 2926320ed286b..63df0c207b3ae 100644
--- a/mlir/lib/Target/SPIRV/CMakeLists.txt
+++ b/mlir/lib/Target/SPIRV/CMakeLists.txt
@@ -10,6 +10,10 @@ set(LLVM_OPTIONAL_SOURCES
 add_mlir_translation_library(MLIRSPIRVBinaryUtils
   SPIRVBinaryUtils.cpp
 
+  # SPIRVBinaryUtils.h includes the generated SPIRVEnums.h.
+  HEADER_LIBS PUBLIC
+  MLIRSPIRVDialect
+
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRSupport
diff --git a/mlir/lib/Target/SPIRV/Deserialization/CMakeLists.txt b/mlir/lib/Target/SPIRV/Deserialization/CMakeLists.txt
index 6b35a126af169..913eb55464435 100644
--- a/mlir/lib/Target/SPIRV/Deserialization/CMakeLists.txt
+++ b/mlir/lib/Target/SPIRV/Deserialization/CMakeLists.txt
@@ -3,9 +3,6 @@ add_mlir_translation_library(MLIRSPIRVDeserialization
   Deserializer.cpp
   Deserialization.cpp
 
-  DEPENDS
-  MLIRSPIRVSerializationGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRSPIRVDialect
diff --git a/mlir/lib/Target/SPIRV/Serialization/CMakeLists.txt b/mlir/lib/Target/SPIRV/Serialization/CMakeLists.txt
index e912efee08763..a8def57b85622 100644
--- a/mlir/lib/Target/SPIRV/Serialization/CMakeLists.txt
+++ b/mlir/lib/Target/SPIRV/Serialization/CMakeLists.txt
@@ -3,9 +3,6 @@ add_mlir_translation_library(MLIRSPIRVSerialization
   Serializer.cpp
   SerializeOps.cpp
 
-  DEPENDS
-  MLIRSPIRVSerializationGen
-
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRSPIRVDialect
diff --git a/mlir/lib/Transforms/CMakeLists.txt b/mlir/lib/Transforms/CMakeLists.txt
index 66b39f53c91df..397b2c10b09a8 100644
--- a/mlir/lib/Transforms/CMakeLists.txt
+++ b/mlir/lib/Transforms/CMakeLists.txt
@@ -26,10 +26,6 @@ add_mlir_library(MLIRTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Transforms
 
-  DEPENDS
-  MLIRTransformsPassIncGen
-  MLIRTransformsDialectInterfaceIncGen
-
   LINK_LIBS PUBLIC
   MLIRAnalysis
   MLIRFunctionInterfaces
diff --git a/mlir/test/lib/Dialect/Test/CMakeLists.txt b/mlir/test/lib/Dialect/Test/CMakeLists.txt
index 4c4721193322b..91c0a125906fe 100644
--- a/mlir/test/lib/Dialect/Test/CMakeLists.txt
+++ b/mlir/test/lib/Dialect/Test/CMakeLists.txt
@@ -13,33 +13,33 @@ mlir_tablegen(TestTypeInterfaces.h.inc -gen-type-interface-decls)
 mlir_tablegen(TestTypeInterfaces.cpp.inc -gen-type-interface-defs)
 mlir_tablegen(TestOpInterfaces.h.inc -gen-op-interface-decls)
 mlir_tablegen(TestOpInterfaces.cpp.inc -gen-op-interface-defs)
-add_public_tablegen_target(MLIRTestInterfaceIncGen)
+add_mlir_library_tablegen_target(MLIRTestInterfaceIncGen MLIRTestDialect)
 
 set(LLVM_TARGET_DEFINITIONS TestOps.td)
 mlir_tablegen(TestAttrDefs.h.inc -gen-attrdef-decls -attrdefs-dialect=test)
 mlir_tablegen(TestAttrDefs.cpp.inc -gen-attrdef-defs -attrdefs-dialect=test)
-add_public_tablegen_target(MLIRTestAttrDefIncGen)
+add_mlir_library_tablegen_target(MLIRTestAttrDefIncGen MLIRTestDialect)
 
 set(LLVM_TARGET_DEFINITIONS TestTypeDefs.td)
 mlir_tablegen(TestTypeDefs.h.inc -gen-typedef-decls -typedefs-dialect=test)
 mlir_tablegen(TestTypeDefs.cpp.inc -gen-typedef-defs -typedefs-dialect=test)
-add_public_tablegen_target(MLIRTestTypeDefIncGen)
+add_mlir_library_tablegen_target(MLIRTestTypeDefIncGen MLIRTestDialect)
 
 set(LLVM_TARGET_DEFINITIONS TestEnumDefs.td)
 mlir_tablegen(TestOpEnums.h.inc -gen-enum-decls)
 mlir_tablegen(TestOpEnums.cpp.inc -gen-enum-defs)
-add_public_tablegen_target(MLIRTestEnumDefIncGen)
+add_mlir_library_tablegen_target(MLIRTestEnumDefIncGen MLIRTestDialect)
 
 set(LLVM_TARGET_DEFINITIONS TestOps.td)
 mlir_tablegen(TestOpsDialect.h.inc -gen-dialect-decls -dialect=test)
 mlir_tablegen(TestOpsDialect.cpp.inc -gen-dialect-defs -dialect=test)
 mlir_tablegen(TestPatterns.inc -gen-rewriters)
-add_public_tablegen_target(MLIRTestOpsIncGen)
+add_mlir_library_tablegen_target(MLIRTestOpsIncGen MLIRTestDialect)
 
 set(LLVM_TARGET_DEFINITIONS TestOpsSyntax.td)
 mlir_tablegen(TestOpsSyntax.h.inc -gen-op-decls)
 mlir_tablegen(TestOpsSyntax.cpp.inc -gen-op-defs)
-add_public_tablegen_target(MLIRTestOpsSyntaxIncGen)
+add_mlir_library_tablegen_target(MLIRTestOpsSyntaxIncGen MLIRTestDialect)
 
 add_sharded_ops(TestOps 20)
 
@@ -60,15 +60,9 @@ add_mlir_library(MLIRTestDialect
 
   EXCLUDE_FROM_LIBMLIR
 
-  DEPENDS
-  MLIRTestAttrDefIncGen
-  MLIRTestEnumDefIncGen
-  MLIRTestInterfaceIncGen
-  MLIRTestTypeDefIncGen
-  MLIRTestOpsIncGen
-  MLIRTestOpsSyntaxIncGen
-  MLIRTestOpsShardGen
-  MLIRConvertToEmitCPatternInterfaceIncGen
+  # TestDialectInterfaces.cpp includes the generated ToEmitCInterface.
+  HEADER_LIBS PRIVATE
+  MLIRConvertToEmitC
   )
 mlir_target_link_libraries(MLIRTestDialect PUBLIC
   MLIRControlFlowInterfaces
diff --git a/mlir/test/lib/Dialect/Tosa/CMakeLists.txt b/mlir/test/lib/Dialect/Tosa/CMakeLists.txt
index 7d40881ee6ee4..fc90132ce1e75 100644
--- a/mlir/test/lib/Dialect/Tosa/CMakeLists.txt
+++ b/mlir/test/lib/Dialect/Tosa/CMakeLists.txt
@@ -6,8 +6,9 @@ add_mlir_dialect_library(MLIRTosaTestPasses
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Tosa/Transforms
 
-  DEPENDS
-  MLIRTosaPassIncGen
+  # TosaTestPasses.cpp includes the generated Tosa transform pass header.
+  HEADER_LIBS PRIVATE
+  MLIRTosaTransforms
   )
 mlir_target_link_libraries(MLIRTosaTestPasses PUBLIC
   MLIRFuncDialect
diff --git a/mlir/test/lib/Dialect/Transform/CMakeLists.txt b/mlir/test/lib/Dialect/Transform/CMakeLists.txt
index 4d626461d63bf..5bdbe02a85f2c 100644
--- a/mlir/test/lib/Dialect/Transform/CMakeLists.txt
+++ b/mlir/test/lib/Dialect/Transform/CMakeLists.txt
@@ -5,7 +5,8 @@ mlir_tablegen(TestTransformDialectExtensionAttrs.h.inc -gen-attrdef-decls -attrd
 mlir_tablegen(TestTransformDialectExtensionAttrs.cpp.inc -gen-attrdef-defs -attrdefs-dialect=transform)
 mlir_tablegen(TestTransformDialectExtensionTypes.h.inc -gen-typedef-decls -typedefs-dialect=transform)
 mlir_tablegen(TestTransformDialectExtensionTypes.cpp.inc -gen-typedef-defs -typedefs-dialect=transform)
-add_public_tablegen_target(MLIRTestTransformDialectExtensionIncGen)
+add_mlir_library_tablegen_target(MLIRTestTransformDialectExtensionIncGen
+  MLIRTestTransformDialect)
 
 add_mlir_library(MLIRTestTransformDialect
   TestPassStateExtensionCommunication.cpp
@@ -15,8 +16,6 @@ add_mlir_library(MLIRTestTransformDialect
 
   EXCLUDE_FROM_LIBMLIR
 
-  DEPENDS
-  MLIRTestTransformDialectExtensionIncGen
 )
 mlir_target_link_libraries(MLIRTestTransformDialect PUBLIC
   MLIRIR
diff --git a/mlir/test/lib/Interfaces/TilingInterface/CMakeLists.txt b/mlir/test/lib/Interfaces/TilingInterface/CMakeLists.txt
index 657fcb76815bc..c45ea2f4a2d2f 100644
--- a/mlir/test/lib/Interfaces/TilingInterface/CMakeLists.txt
+++ b/mlir/test/lib/Interfaces/TilingInterface/CMakeLists.txt
@@ -1,14 +1,12 @@
 set(LLVM_TARGET_DEFINITIONS TestTilingInterfaceTransformOps.td)
 mlir_tablegen(TestTilingInterfaceTransformOps.h.inc -gen-op-decls)
 mlir_tablegen(TestTilingInterfaceTransformOps.cpp.inc -gen-op-defs)
-add_public_tablegen_target(MLIRTestTilingInterfaceTransformOpsIncGen)
+add_mlir_library_tablegen_target(MLIRTestTilingInterfaceTransformOpsIncGen
+  MLIRTilingInterfaceTestPasses)
 
 add_mlir_library(MLIRTilingInterfaceTestPasses
   TestTilingInterfaceTransformOps.cpp
 
-  DEPENDS
-  MLIRTestTilingInterfaceTransformOpsIncGen
-
   EXCLUDE_FROM_LIBMLIR
   )
 mlir_target_link_libraries(MLIRTilingInterfaceTestPasses PUBLIC
diff --git a/mlir/test/lib/Tools/PDLL/CMakeLists.txt b/mlir/test/lib/Tools/PDLL/CMakeLists.txt
index 60cf30b33e559..fb1c0609b0c08 100644
--- a/mlir/test/lib/Tools/PDLL/CMakeLists.txt
+++ b/mlir/test/lib/Tools/PDLL/CMakeLists.txt
@@ -16,9 +16,6 @@ add_mlir_library(MLIRTestPDLL
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Tools/PDLL
 
-  DEPENDS
-  MLIRTestPDLLPatternsIncGen
-
   LINK_LIBS PUBLIC
   MLIRTestDialect
   )
diff --git a/mlir/test/lib/Transforms/CMakeLists.txt b/mlir/test/lib/Transforms/CMakeLists.txt
index ddc0a779e8f69..99ce55f65a444 100644
--- a/mlir/test/lib/Transforms/CMakeLists.txt
+++ b/mlir/test/lib/Transforms/CMakeLists.txt
@@ -1,11 +1,11 @@
 set(LLVM_TARGET_DEFINITIONS TestTransformsOps.td)
 mlir_tablegen(TestTransformsOps.h.inc -gen-op-decls)
 mlir_tablegen(TestTransformsOps.cpp.inc -gen-op-defs)
-add_public_tablegen_target(MLIRTestTransformsOpsIncGen)
+add_mlir_library_tablegen_target(MLIRTestTransformsOpsIncGen
+  MLIRTestTransforms)
 
 set(LLVM_OPTIONAL_SOURCES 
   TestDialectConversion.cpp)
-set(MLIRTestTransformsPDLDep)
 set(MLIRTestTransformsPDLSrc)
 if(MLIR_ENABLE_PDL_IN_PATTERNMATCH)
 add_mlir_pdll_library(MLIRTestDialectConversionPDLLPatternsIncGen
@@ -18,8 +18,6 @@ add_mlir_pdll_library(MLIRTestDialectConversionPDLLPatternsIncGen
   )
   set(MLIRTestTransformsPDLSrc
     TestDialectConversion.cpp)
-  set(MLIRTestTransformsPDLDep
-    MLIRTestDialectConversionPDLLPatternsIncGen)
 endif()
 
 # Exclude tests from libMLIR.so
@@ -39,10 +37,6 @@ add_mlir_library(MLIRTestTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Transforms
 
-  DEPENDS
-  ${MLIRTestTransformsPDLDep}
-  MLIRTestTransformsOpsIncGen
-
   LINK_LIBS PUBLIC
   MLIRTestDialect
   )
diff --git a/mlir/test/python/CMakeLists.txt b/mlir/test/python/CMakeLists.txt
index c81f75fc6a1af..1f52c37cb6e99 100644
--- a/mlir/test/python/CMakeLists.txt
+++ b/mlir/test/python/CMakeLists.txt
@@ -7,7 +7,7 @@ mlir_tablegen(lib/PythonTestAttributes.h.inc -gen-attrdef-decls)
 mlir_tablegen(lib/PythonTestAttributes.cpp.inc -gen-attrdef-defs)
 mlir_tablegen(lib/PythonTestTypes.h.inc -gen-typedef-decls)
 mlir_tablegen(lib/PythonTestTypes.cpp.inc -gen-typedef-defs)
-add_public_tablegen_target(MLIRPythonTestIncGen)
+add_mlir_library_tablegen_target(MLIRPythonTestIncGen MLIRPythonTestDialect)
 
 add_subdirectory(lib)
 
diff --git a/mlir/test/python/lib/CMakeLists.txt b/mlir/test/python/lib/CMakeLists.txt
index f51a7b44e64dd..b78bbd6a51c3c 100644
--- a/mlir/test/python/lib/CMakeLists.txt
+++ b/mlir/test/python/lib/CMakeLists.txt
@@ -9,8 +9,6 @@ add_mlir_library(MLIRPythonTestDialect
 
   EXCLUDE_FROM_LIBMLIR
 
-  DEPENDS
-  MLIRPythonTestIncGen
 )
 mlir_target_link_libraries(MLIRPythonTestDialect PUBLIC
   MLIRInferTypeOpInterface
@@ -21,12 +19,8 @@ mlir_target_link_libraries(MLIRPythonTestDialect PUBLIC
 add_mlir_public_c_api_library(MLIRCAPIPythonTestDialect
   PythonTestCAPI.cpp
 
-  DEPENDS
-  MLIRPythonTestIncGen
-
   LINK_LIBS PUBLIC
   MLIRCAPIInterfaces
   MLIRCAPIIR
   MLIRPythonTestDialect
 )
-
diff --git a/mlir/unittests/CMakeLists.txt b/mlir/unittests/CMakeLists.txt
index 654ec44d90b04..cdeb89f8eddd2 100644
--- a/mlir/unittests/CMakeLists.txt
+++ b/mlir/unittests/CMakeLists.txt
@@ -2,7 +2,11 @@
 add_definitions(-DGTEST_NO_LLVM_SUPPORT=0)
 
 function(add_mlir_unittest test_dirname)
-  add_unittest(MLIRUnitTests ${test_dirname} ${ARGN})
+  cmake_parse_arguments(ARG "" "" "HEADER_LIBS" ${ARGN})
+  add_unittest(MLIRUnitTests ${test_dirname} ${ARG_UNPARSED_ARGUMENTS})
+  if(ARG_HEADER_LIBS)
+    mlir_target_link_header_libraries(${test_dirname} ${ARG_HEADER_LIBS})
+  endif()
 endfunction()
 
 add_subdirectory(ABI)
diff --git a/mlir/unittests/IR/CMakeLists.txt b/mlir/unittests/IR/CMakeLists.txt
index ce9b230222f62..bab87d7e21596 100644
--- a/mlir/unittests/IR/CMakeLists.txt
+++ b/mlir/unittests/IR/CMakeLists.txt
@@ -27,8 +27,9 @@ add_mlir_unittest(MLIRIRTests
   VerifierTest.cpp
   BlobManagerTest.cpp
 
-  DEPENDS
-  MLIRTestInterfaceIncGen
+  # The IR unit tests include generated Test dialect headers directly.
+  HEADER_LIBS
+  MLIRTestDialect
 )
 target_include_directories(MLIRIRTests PRIVATE "${MLIR_BINARY_DIR}/test/lib/Dialect/Test")
 mlir_target_link_libraries(MLIRIRTests PRIVATE MLIRIR)
diff --git a/mlir/unittests/Interfaces/CMakeLists.txt b/mlir/unittests/Interfaces/CMakeLists.txt
index 193edda6bf8d8..7259cde1619c2 100644
--- a/mlir/unittests/Interfaces/CMakeLists.txt
+++ b/mlir/unittests/Interfaces/CMakeLists.txt
@@ -6,8 +6,9 @@ add_mlir_unittest(MLIRInterfacesTests
   SideEffectInterfacesTest.cpp
   InferTypeOpInterfaceTest.cpp
 
-  DEPENDS
-  MLIRTestInterfaceIncGen
+  # The interface unit tests include generated Test dialect headers directly.
+  HEADER_LIBS
+  MLIRTestDialect
 )
 target_include_directories(MLIRInterfacesTests PRIVATE "${MLIR_BINARY_DIR}/test/lib/Dialect/Test")
 
diff --git a/mlir/unittests/Parser/CMakeLists.txt b/mlir/unittests/Parser/CMakeLists.txt
index 4b3fedbb638c0..d49c34d7d1e50 100644
--- a/mlir/unittests/Parser/CMakeLists.txt
+++ b/mlir/unittests/Parser/CMakeLists.txt
@@ -2,8 +2,9 @@ add_mlir_unittest(MLIRParserTests
   ParserTest.cpp
   ResourceTest.cpp
 
-  DEPENDS
-  MLIRTestInterfaceIncGen
+  # ResourceTest.cpp includes generated Test dialect headers directly.
+  HEADER_LIBS
+  MLIRTestDialect
 )
 target_include_directories(MLIRParserTests PRIVATE "${MLIR_BINARY_DIR}/test/lib/Dialect/Test")
 



More information about the Mlir-commits mailing list