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

Mehdi Amini via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 8 16:49:04 PDT 2026


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

>From ba7884786c996e1abacd22e6953e63140007d063 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. Those edges serialize unrelated
generation, mask missing transitive dependencies, and can leave compilation
unordered when a logical dependency provides a generated header.

Record the exact outputs of each MLIR TableGen target at its generation site,
including generated sources from sharded operations, without inheriting prior
TABLEGEN_OUTPUT or LLVM_COMMON_DEPENDS batches. Resolve every generator to at
most one logical library after the complete target graph exists. Conventional
library and dialect names cover the common case, a unique dialect or mirrored
directory supplies a fallback, and an explicit OWNER is authoritative for
exceptional mixed layouts.

Give each MLIR library an internal generated-header carrier. CMake 3.28 uses
CMP0154 INTERFACE header file sets so Ninja can order the exact generated
files. Older supported CMake versions use a documented custom-target fallback
with TODOs for removal once LLVM requires CMake 3.28. Flatten carrier graphs
to generated-file leaves so legal cyclic static-library graphs do not create
cycles between fallback custom targets.

Derive transitive header ordering from LINK_LIBS using normal PUBLIC, PRIVATE,
and INTERFACE semantics. A library's compilation sees its local generators and
its PUBLIC and PRIVATE provider closures; its consumers see its local, PUBLIC,
and INTERFACE closure. LINK_LIBS generator expressions are expanded
conservatively, while explicit HEADER_LIBS and
mlir_target_link_header_libraries entries must name literal targets so typos
can be diagnosed during configuration. Imported providers are accepted because
their generated headers already exist.

Keep AddLLVM target-agnostic by registering a header dependency provider and
following only its public link closure for whole-library ordering. Cache that
closure and materialize the MLIR graph once in a deferred final pass, avoiding
an eager full-graph update after every library declaration.

Remove redundant generated-target dependencies while retaining actual source
generation and build-order edges. Document the source include that justifies
every HEADER_LIBS entry. Add an MLIR CMake Infrastructure guide covering
libraries, dialects, interfaces, generated files, visibility, compatibility,
and correctness checks, plus configuration-time regression coverage for
ownership, exact output batches, cycles, visibility, aliases, imported
targets, sharded sources, and invalid explicit dependencies.

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. Repeat this
sequence with CMake older than 3.28 and with an empty out-of-tree standalone
build when compatibility or package-export behavior changes.

Assisted-by: Codex
---
 clang/lib/CIR/Dialect/IR/CMakeLists.txt       |   2 +-
 clang/lib/CIR/Interfaces/CMakeLists.txt       |   2 +
 llvm/cmake/modules/AddLLVM.cmake              | 228 ++++-
 mlir/cmake/modules/AddMLIR.cmake              | 876 +++++++++++++++++-
 mlir/docs/CMakeInfrastructure.md              | 403 ++++++++
 .../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/OpenACC/CMakeLists.txt       |   3 +
 .../mlir/Dialect/OpenMP/CMakeLists.txt        |   6 +-
 .../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/include/mlir/Transforms/CMakeLists.txt   |   3 +-
 mlir/lib/Analysis/CMakeLists.txt              |   4 -
 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      |  10 +-
 .../Conversion/ArithToAMDGPU/CMakeLists.txt   |   7 +-
 .../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  |   5 +-
 .../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 +-
 mlir/lib/Dialect/GPU/Pipelines/CMakeLists.txt |   7 +
 .../Dialect/GPU/TransformOps/CMakeLists.txt   |   5 -
 mlir/lib/Dialect/GPU/Utils/CMakeLists.txt     |   5 +
 mlir/lib/Dialect/IRDL/CMakeLists.txt          |   5 -
 mlir/lib/Dialect/Index/IR/CMakeLists.txt      |   5 +-
 mlir/lib/Dialect/LLVMIR/CMakeLists.txt        |  41 +-
 .../Dialect/LLVMIR/Transforms/CMakeLists.txt  |   3 -
 mlir/lib/Dialect/Linalg/IR/CMakeLists.txt     |  11 +-
 .../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      |  18 +-
 .../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/Pipelines/CMakeLists.txt     |   7 +
 .../SparseTensor/TransformOps/CMakeLists.txt  |   3 -
 .../SparseTensor/Transforms/CMakeLists.txt    |   3 -
 mlir/lib/Dialect/Tensor/IR/CMakeLists.txt     |   5 +-
 .../Tensor/TransformOps/CMakeLists.txt        |   3 -
 .../Dialect/Tensor/Transforms/CMakeLists.txt  |   3 -
 mlir/lib/Dialect/Tosa/CMakeLists.txt          |  10 +-
 .../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          |   8 +
 .../SPIRV/Deserialization/CMakeLists.txt      |   3 -
 .../Target/SPIRV/Serialization/CMakeLists.txt |   3 -
 mlir/lib/Transforms/CMakeLists.txt            |   4 -
 mlir/test/CMake/header-dependencies.test      | 274 ++++++
 mlir/test/CMake/lit.local.cfg                 |   3 +
 mlir/test/lib/Dialect/NVGPU/CMakeLists.txt    |   6 +
 mlir/test/lib/Dialect/Shard/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 +-
 254 files changed, 2068 insertions(+), 953 deletions(-)
 create mode 100644 mlir/docs/CMakeInfrastructure.md
 create mode 100644 mlir/test/CMake/header-dependencies.test
 create mode 100644 mlir/test/CMake/lit.local.cfg

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..73d22f8e48e78 100644
--- a/llvm/cmake/modules/AddLLVM.cmake
+++ b/llvm/cmake/modules/AddLLVM.cmake
@@ -594,6 +594,205 @@ 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()
+
+# Register an internal generated-header carrier for a logical library. This is
+# a target-agnostic hook: project-specific helpers opt providers into the
+# ordering model, while llvm_add_library remains unaware of carrier details.
+function(_llvm_register_header_dependency_provider target header_target)
+  set_property(TARGET ${target} PROPERTY LLVM_HEADER_DEP_TARGET
+    ${header_target})
+  set_property(GLOBAL PROPERTY LLVM_HAS_HEADER_DEPENDENCY_PROVIDERS TRUE)
+endfunction()
+
+# Follow a logical library's public link interface and collect only registered
+# generated-header carriers and explicit custom prerequisites. This lets an
+# object library consume generated public headers without depending on every
+# linked library's compiled objects.
+function(_llvm_collect_transitive_header_dependencies output)
+  set(cache_target ${ARGV1})
+  if(TARGET "${cache_target}")
+    get_target_property(aliased_cache_target "${cache_target}" ALIASED_TARGET)
+    if(aliased_cache_target)
+      set(cache_target ${aliased_cache_target})
+    endif()
+    get_target_property(cache_target_imported ${cache_target} IMPORTED)
+    get_target_property(cache_valid ${cache_target}
+      LLVM_HEADER_DEPENDENCY_CACHE_VALID)
+    if(cache_valid)
+      get_target_property(cached_result ${cache_target}
+        LLVM_TRANSITIVE_HEADER_DEPENDENCIES)
+      set(${output} ${cached_result} PARENT_SCOPE)
+      return()
+    endif()
+  endif()
+
+  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(candidate_cache_valid ${candidate}
+      LLVM_HEADER_DEPENDENCY_CACHE_VALID)
+    if(candidate_cache_valid)
+      get_target_property(candidate_cached_result ${candidate}
+        LLVM_TRANSITIVE_HEADER_DEPENDENCIES)
+      list(APPEND result ${candidate_cached_result})
+      continue()
+    endif()
+
+    get_target_property(header_target ${candidate} LLVM_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)
+  if(TARGET "${cache_target}" AND NOT cache_target_imported)
+    set_property(TARGET ${cache_target} PROPERTY
+      LLVM_TRANSITIVE_HEADER_DEPENDENCIES "${result}")
+    set_property(TARGET ${cache_target} PROPERTY
+      LLVM_HEADER_DEPENDENCY_CACHE_VALID TRUE)
+  endif()
+  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)
+  get_property(has_header_dependency_providers GLOBAL PROPERTY
+    LLVM_HAS_HEADER_DEPENDENCY_PROVIDERS)
+  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 a project-specific provider publishes
+    # a precise generated-header carrier, depend on that carrier alone.
+    if(NOT has_header_dependency_providers)
+      continue()
+    endif()
+    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 +873,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 +930,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..a5faec6409e88 100644
--- a/mlir/cmake/modules/AddMLIR.cmake
+++ b/mlir/cmake/modules/AddMLIR.cmake
@@ -4,10 +4,33 @@ 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()
 
+# Create an MLIR TableGen target from only the outputs accumulated since the
+# preceding MLIR target. add_public_tablegen_target() normally consumes the
+# directory's cumulative TABLEGEN_OUTPUT list, which would make a later target
+# depend on unrelated earlier generators and hide missing logical edges.
+function(_mlir_add_public_tablegen_target target)
+  get_property(target_outputs DIRECTORY PROPERTY
+    MLIR_UNCLAIMED_TABLEGEN_OUTPUTS)
+  if(target_outputs)
+    set(TABLEGEN_OUTPUT ${target_outputs})
+  endif()
+  # LLVM_COMMON_DEPENDS is cumulative within a directory. Do not let an
+  # earlier, unrelated TableGen target become an ordering dependency of this
+  # one: doing so masks missing logical header dependencies from Ninja. Keep
+  # maintaining the variable for callers that consume the complete list.
+  set(saved_common_depends ${LLVM_COMMON_DEPENDS})
+  set(LLVM_COMMON_DEPENDS)
+  add_public_tablegen_target(${target})
+  set(LLVM_COMMON_DEPENDS ${saved_common_depends} ${target} PARENT_SCOPE)
+endfunction()
+
 # Clear out any pre-existing compile_commands file before processing. This
 # allows for generating a clean compile_commands on each configure.
 file(REMOVE ${CMAKE_BINARY_DIR}/pdll_compile_commands.yml)
@@ -115,7 +138,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.
@@ -140,11 +166,25 @@ function(add_mlir_pdll_library target inputFile ofn)
       "  includes: \"${CMAKE_CURRENT_SOURCE_DIR};${tblgen_includes}\"\n"
   )
 
-  add_public_tablegen_target(${target})
+  _mlir_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()
+  _mlir_register_tablegen_directory_owners(${owners})
+
   set(LLVM_TARGET_DEFINITIONS ${dialect}.td)
   mlir_tablegen(${dialect}.h.inc -gen-op-decls)
   mlir_tablegen(${dialect}.cpp.inc -gen-op-defs)
@@ -153,6 +193,25 @@ 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()
+
+# Record the logical dialect candidates for generators declared alongside its
+# primary operation definitions. Resolution is deferred so a directory with
+# more than one dialect can diagnose ambiguity instead of depending on call
+# order.
+function(_mlir_register_tablegen_directory_owners)
+  cmake_path(SET tablegen_source_dir NORMALIZE
+    "${CMAKE_CURRENT_SOURCE_DIR}")
+  string(SHA1 directory_id "${tablegen_source_dir}")
+  set_property(GLOBAL APPEND PROPERTY
+    MLIR_TABLEGEN_DEFAULT_OWNERS_${directory_id} ${ARGN})
 endfunction()
 
 # Declare sharded dialect operation declarations and definitions
@@ -165,42 +224,236 @@ function(add_sharded_ops ops_target shard_count)
     set(SHARDED_SRC ${ops_target}.${index}.cpp)
     list(APPEND SHARDED_SRCS ${SHARDED_SRC})
     tablegen(MLIR_SRC_SHARDER ${SHARDED_SRC} -op-shard-index=${index})
-    set(TABLEGEN_OUTPUT ${TABLEGEN_OUTPUT} ${CMAKE_CURRENT_BINARY_DIR}/${SHARDED_SRC})
+    set(sharded_output "${CMAKE_CURRENT_BINARY_DIR}/${SHARDED_SRC}")
+    set(TABLEGEN_OUTPUT ${TABLEGEN_OUTPUT} ${sharded_output})
+    # This target owns both the public .inc files and the generated shard
+    # sources. Record the raw tablegen() outputs in the same per-target batch
+    # as the mlir_tablegen() outputs so DEPENDS on the shard target continues
+    # to generate every source without inheriting earlier unrelated batches.
+    set_property(DIRECTORY APPEND PROPERTY
+      MLIR_UNCLAIMED_TABLEGEN_OUTPUTS "${sharded_output}")
   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()
+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)
+  foreach(tablegen_target ${ARGN})
+    # Replace inferred candidates: OWNER is authoritative even if a
+    # conventionally named library also exists.
+    set_property(TARGET ${tablegen_target} PROPERTY
+      MLIR_TABLEGEN_OWNERS ${library})
+    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()
+  # Pass generators conventionally belong to the dialect's transforms
+  # library. Keep the unsuffixed candidate for general targets such as
+  # MLIRTransformsPassIncGen.
+  if(target MATCHES "^(MLIR.+)PassIncGen$")
+    _mlir_register_tablegen_owner(
+      ${CMAKE_MATCH_1}Transforms ${target})
+    _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)
+  _mlir_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)
-  add_public_tablegen_target(${target})
+  cmake_parse_arguments(TABLEGEN_TARGET "" "OWNER" "" ${ARGN})
+  _mlir_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)
-  add_public_tablegen_target(${target})
+  cmake_parse_arguments(TABLEGEN_TARGET "" "OWNER" "" ${ARGN})
+  _mlir_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 +526,533 @@ 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()
+
+# Resolve each TableGen target to at most one logical owner after the complete
+# graph exists. Ordered naming candidates take precedence, followed by a
+# unique containing-dialect default and the narrow single-library directory
+# fallback.
+function(_mlir_resolve_tablegen_ownership)
+  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(resolved_owner)
+    foreach(owner ${owners})
+      if(TARGET ${owner})
+        set(resolved_owner ${owner})
+        break()
+      endif()
+    endforeach()
+
+    if(NOT resolved_owner)
+      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 owner '${owners}', "
+          "but that library target does not exist")
+        continue()
+      endif()
+
+      get_target_property(directory_id ${tablegen_target}
+        MLIR_TABLEGEN_DIRECTORY_ID)
+
+      # A primary add_mlir_dialect() declaration supplies the natural owner
+      # for additional enums, attributes, bytecode, and conversion generators
+      # in the same directory. Resolve this only after all targets exist so a
+      # multi-dialect directory remains an explicit, diagnosed case.
+      get_property(default_owners GLOBAL PROPERTY
+        MLIR_TABLEGEN_DEFAULT_OWNERS_${directory_id})
+      set(existing_default_owners)
+      foreach(default_owner ${default_owners})
+        if(TARGET ${default_owner})
+          list(APPEND existing_default_owners ${default_owner})
+        endif()
+      endforeach()
+      list(REMOVE_DUPLICATES existing_default_owners)
+      list(LENGTH existing_default_owners default_owner_count)
+      if(default_owner_count GREATER 1)
+        message(SEND_ERROR
+          "${tablegen_target} has multiple dialect owner candidates "
+          "'${existing_default_owners}'; pass OWNER to its TableGen target "
+          "helper")
+        continue()
+      elseif(default_owner_count EQUAL 1)
+        list(GET existing_default_owners 0 resolved_owner)
+      endif()
+
+      if(NOT resolved_owner)
+        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")
+          continue()
+        elseif(candidate_count EQUAL 1)
+          list(GET candidate_libraries 0 resolved_owner)
+        endif()
+      endif()
+    endif()
+
+    if(resolved_owner)
+      set_property(TARGET ${tablegen_target} PROPERTY
+        MLIR_TABLEGEN_RESOLVED_OWNER ${resolved_owner})
+      set_property(GLOBAL APPEND PROPERTY
+        MLIR_RESOLVED_TABLEGEN_TARGETS_${resolved_owner} ${tablegen_target})
+    endif()
+  endforeach()
+endfunction()
+
+# Collect the TableGen targets assigned to one library by the final ownership
+# pass above.
+function(_mlir_collect_library_tablegen output_targets library)
+  get_property(result GLOBAL
+    PROPERTY MLIR_RESOLVED_TABLEGEN_TARGETS_${library})
+  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})
+  foreach(header_library ${ARG_HEADER_LIBS})
+    if(header_library MATCHES "\\$<")
+      message(SEND_ERROR
+        "${name} uses a generator expression in HEADER_LIBS. Name literal "
+        "logical targets there and put the condition around the declaration "
+        "instead, so MLIR can validate every generated-header provider.")
+    endif()
+  endforeach()
+
+  _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. Ordinary DEPENDS entries keep their existing build-order
+  # behavior and are not part of generated-header ownership.
+  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()
+
+# Collect the generated-file targets owned directly by one logical library.
+# Explicit DEPENDS entries with TableGen metadata are retained for backwards
+# compatibility, while inferred targets come from the exclusive ownership
+# pass above.
+function(_mlir_collect_library_local_tablegen output_targets library)
+  get_target_property(explicit_targets ${library}
+    MLIR_EXPLICIT_TABLEGEN_TARGETS)
+  _mlir_collect_library_tablegen(inferred_targets ${library})
+  set(result ${explicit_targets} ${inferred_targets})
+  list(REMOVE_DUPLICATES result)
+  set(${output_targets} ${result} PARENT_SCOPE)
+endfunction()
+
+# Compute the generated-file targets published by logical MLIR libraries.
+# Flattening the graph to TableGen leaves is intentional: legal cyclic static
+# library link graphs must not turn into cycles between header carrier targets,
+# especially in the pre-CMake-3.28 add_dependencies() fallback.
+function(_mlir_collect_public_tablegen_closure output_targets)
+  set(queue ${ARGN})
+  set(visited)
+  set(result)
+  while(queue)
+    list(POP_FRONT queue provider_expression)
+    _mlir_expand_header_provider_candidates(provider_candidates
+      "${provider_expression}")
+    foreach(provider ${provider_candidates})
+      if(NOT TARGET "${provider}")
+        continue()
+      endif()
+      get_target_property(aliased_provider "${provider}" ALIASED_TARGET)
+      if(aliased_provider)
+        set(provider ${aliased_provider})
+      endif()
+      if(provider IN_LIST visited)
+        continue()
+      endif()
+      list(APPEND visited ${provider})
+
+      get_target_property(provider_imported "${provider}" IMPORTED)
+      get_target_property(provider_headers "${provider}"
+        MLIR_HEADER_DEP_TARGET)
+      if(provider_imported OR NOT provider_headers)
+        continue()
+      endif()
+
+      _mlir_collect_library_local_tablegen(local_targets ${provider})
+      list(APPEND result ${local_targets})
+      get_target_property(public_providers ${provider}
+        MLIR_PUBLIC_HEADER_LIBRARIES)
+      get_target_property(interface_providers ${provider}
+        MLIR_INTERFACE_HEADER_LIBRARIES)
+      list(APPEND queue ${public_providers} ${interface_providers})
+    endforeach()
+  endwhile()
+  list(REMOVE_DUPLICATES result)
+  set(${output_targets} ${result} PARENT_SCOPE)
+endfunction()
+
+# Attach generated-file leaves to a build target. On CMake 3.28 and newer, the
+# per-generator INTERFACE file-set target carries the public generated files.
+# Older CMake versions retain direct ordering on the TableGen custom targets.
+function(_mlir_attach_tablegen_targets target visibility)
+  # TODO: Remove the custom-target branch once LLVM requires CMake 3.28 or
+  # newer.
+  foreach(tablegen_target ${ARGN})
+    if(NOT TARGET ${tablegen_target})
+      continue()
+    endif()
+    get_target_property(tablegen_headers ${tablegen_target}
+      MLIR_TABLEGEN_HEADER_TARGET)
+    if(tablegen_headers)
+      if(visibility STREQUAL "INTERFACE")
+        target_link_libraries(${target} INTERFACE ${tablegen_headers})
+      else()
+        target_link_libraries(${target} PRIVATE
+          "$<BUILD_LOCAL_INTERFACE:${tablegen_headers}>")
+      endif()
+    else()
+      add_dependencies(${target} ${tablegen_target})
+    endif()
+  endforeach()
+endfunction()
+
+# Materialize all generated-header edges once, after the complete CMake target
+# graph and exclusive TableGen ownership are known. Header carriers contain a
+# flattened public closure of leaf generators instead of linking to one
+# another. Besides being more precise, this keeps reciprocal PUBLIC static
+# library links from creating forbidden custom-target cycles.
+function(_mlir_update_library_tablegen_dependencies)
+  get_property(header_libraries GLOBAL PROPERTY MLIR_HEADER_LIBRARIES)
+  list(REMOVE_DUPLICATES header_libraries)
+  foreach(library ${header_libraries})
+    _mlir_collect_public_tablegen_closure(public_targets ${library})
+    _mlir_collect_library_local_tablegen(local_targets ${library})
+    get_target_property(public_providers ${library}
+      MLIR_PUBLIC_HEADER_LIBRARIES)
+    get_target_property(private_providers ${library}
+      MLIR_PRIVATE_HEADER_LIBRARIES)
+    _mlir_collect_public_tablegen_closure(compile_provider_targets
+      ${public_providers} ${private_providers})
+    # INTERFACE providers belong only to the public header carrier. Compiling
+    # the library itself needs its local generators plus the usage
+    # requirements of PUBLIC and PRIVATE providers, matching CMake's ordinary
+    # link visibility semantics.
+    set(compile_targets ${local_targets} ${compile_provider_targets})
+    list(REMOVE_DUPLICATES compile_targets)
+
+    get_target_property(header_target ${library} MLIR_HEADER_DEP_TARGET)
+    get_target_property(compile_target ${library} MLIR_HEADER_COMPILE_TARGET)
+    _mlir_attach_tablegen_targets(${header_target} INTERFACE
+      ${public_targets})
+    _mlir_attach_tablegen_targets(${compile_target} PRIVATE
+      ${compile_targets})
+  endforeach()
+endfunction()
+
+# Add the public generated-header closure of logical MLIR libraries to a
+# non-library target. Library consumers are handled in one flattened pass
+# above; keeping this helper leaf-based avoids introducing carrier cycles.
+function(_mlir_update_header_target_dependencies)
+  get_property(header_consumers GLOBAL PROPERTY MLIR_HEADER_TARGET_CONSUMERS)
+  list(REMOVE_DUPLICATES header_consumers)
+  foreach(consumer ${header_consumers})
+    get_target_property(providers ${consumer} MLIR_TARGET_HEADER_LIBRARIES)
+    _mlir_collect_public_tablegen_closure(tablegen_targets ${providers})
+    _mlir_attach_tablegen_targets(${consumer} PRIVATE ${tablegen_targets})
+
+    foreach(provider_expression ${providers})
+      _mlir_expand_header_provider_candidates(provider_candidates
+        "${provider_expression}")
+      foreach(provider ${provider_candidates})
+        if(NOT TARGET "${provider}")
+          continue()
+        endif()
+        get_target_property(provider_imported "${provider}" IMPORTED)
+        get_target_property(provider_headers "${provider}"
+          MLIR_HEADER_DEP_TARGET)
+        if(provider_imported OR provider_headers)
+          set_property(TARGET ${consumer} APPEND PROPERTY
+            MLIR_RESOLVED_TARGET_HEADER_LIBRARIES ${provider})
+        endif()
+      endforeach()
+    endforeach()
+  endforeach()
+endfunction()
+
+function(_mlir_validate_header_libraries)
+  # Resolve and materialize ownership after the complete graph is available.
+  _mlir_resolve_tablegen_ownership()
+  _mlir_update_library_tablegen_dependencies()
+  _mlir_update_header_target_dependencies()
+
+  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 folded into that
+  # compile-only closure by the final deferred materialization pass.
+  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}")
+  _llvm_register_header_dependency_provider(${name} ${header_target})
+  _mlir_register_library_tablegen_directories(${name})
+  set_property(GLOBAL APPEND PROPERTY MLIR_HEADER_LIBRARIES ${name})
+  _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()
+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)
+  foreach(header_library ${ARGN})
+    if(header_library MATCHES "\\$<")
+      message(SEND_ERROR
+        "${target} uses a generator expression in "
+        "mlir_target_link_header_libraries. Name literal logical targets so "
+        "MLIR can validate every generated-header provider.")
+    endif()
+  endforeach()
+  set_property(GLOBAL APPEND PROPERTY MLIR_HEADER_TARGET_CONSUMERS ${target})
+  set_property(TARGET ${target} APPEND PROPERTY
+    MLIR_TARGET_HEADER_LIBRARIES ${ARGN})
+  _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 +1070,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 +1111,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 +1217,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 +1518,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 +1596,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..6206613a27d01
--- /dev/null
+++ b/mlir/docs/CMakeInfrastructure.md
@@ -0,0 +1,403 @@
+# 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. Additional TableGen targets declared in the same directory as
+a single `add_mlir_dialect` declaration inherit that dialect's logical owner.
+Directories that declare more than one dialect must use `OWNER` for extra
+generators so ownership remains unambiguous.
+
+### 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.
+
+Use literal target names in `HEADER_LIBS`; generator expressions are rejected
+so misspelled logical providers cannot silently lose their ordering edge. Put
+the CMake condition around the declaration or construct the list conditionally
+instead. Generator expressions remain supported in `LINK_LIBS`.
+
+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.
+Like `HEADER_LIBS`, it accepts only literal target names.
+
+### 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. Targets created with the MLIR TableGen wrappers record only the outputs
+   accumulated for that target. Downstream projects that call raw `tablegen()`
+   retain a cumulative-output compatibility fallback and should migrate to
+   `mlir_tablegen()` for the same precision.
+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 computes a flattened closure of
+   leaf TableGen targets for each carrier and compile target. Carriers do not
+   depend on one another, so cyclic static-library link graphs remain legal.
+
+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/OpenACC/CMakeLists.txt b/mlir/include/mlir/Dialect/OpenACC/CMakeLists.txt
index 789cd709ff16d..f242f3f5c2a22 100644
--- a/mlir/include/mlir/Dialect/OpenACC/CMakeLists.txt
+++ b/mlir/include/mlir/Dialect/OpenACC/CMakeLists.txt
@@ -3,6 +3,8 @@ add_subdirectory(Transforms)
 set(LLVM_TARGET_DEFINITIONS ${LLVM_MAIN_INCLUDE_DIR}/llvm/Frontend/OpenACC/ACC.td)
 mlir_tablegen(AccCommon.td --gen-directive-decl --directives-dialect=OpenACC)
 add_mlir_dialect_tablegen_target(acc_common_td)
+# Subsequent TableGen inputs include the generated AccCommon.td file.
+list(APPEND LLVM_TARGET_DEPENDS acc_common_td)
 
 add_mlir_dialect(OpenACCOps acc)
 
@@ -25,3 +27,4 @@ set(LLVM_TARGET_DEFINITIONS OpenACCTypeInterfaces.td)
 mlir_tablegen(OpenACCTypeInterfaces.h.inc -gen-type-interface-decls)
 mlir_tablegen(OpenACCTypeInterfaces.cpp.inc -gen-type-interface-defs)
 add_mlir_dialect_tablegen_target(MLIROpenACCTypeInterfacesIncGen)
+list(REMOVE_ITEM LLVM_TARGET_DEPENDS acc_common_td)
diff --git a/mlir/include/mlir/Dialect/OpenMP/CMakeLists.txt b/mlir/include/mlir/Dialect/OpenMP/CMakeLists.txt
index 691163d9ce9ac..c5e9972fdaa97 100644
--- a/mlir/include/mlir/Dialect/OpenMP/CMakeLists.txt
+++ b/mlir/include/mlir/Dialect/OpenMP/CMakeLists.txt
@@ -3,6 +3,8 @@ add_subdirectory(Transforms)
 set(LLVM_TARGET_DEFINITIONS ${LLVM_MAIN_INCLUDE_DIR}/llvm/Frontend/OpenMP/OMP.td)
 mlir_tablegen(OmpCommon.td --gen-directive-decl --directives-dialect=OpenMP)
 add_mlir_dialect_tablegen_target(omp_common_td)
+# Subsequent TableGen inputs include the generated OmpCommon.td file.
+list(APPEND LLVM_TARGET_DEPENDS omp_common_td)
 
 set(LLVM_TARGET_DEFINITIONS OpenMPOps.td)
 
@@ -27,7 +29,8 @@ mlir_tablegen(OpenMPOpsEnums.cpp.inc -gen-enum-defs)
 mlir_tablegen(OpenMPOpsAttributes.h.inc -gen-attrdef-decls -attrdefs-dialect=omp)
 mlir_tablegen(OpenMPOpsAttributes.cpp.inc -gen-attrdef-defs -attrdefs-dialect=omp)
 add_mlir_doc(OpenMPOps OpenMPDialect Dialects/ -gen-dialect-doc -dialect=omp)
-add_mlir_dialect_tablegen_target(MLIROpenMPOpsIncGen)
+add_mlir_dialect_tablegen_target(MLIROpenMPOpsIncGen
+  OWNER MLIROpenMPDialect)
 add_dependencies(OpenMPDialectDocGen omp_common_td)
 add_mlir_interface(OpenMPOpsInterfaces)
 
@@ -35,3 +38,4 @@ set(LLVM_TARGET_DEFINITIONS OpenMPTypeInterfaces.td)
 mlir_tablegen(OpenMPTypeInterfaces.h.inc -gen-type-interface-decls)
 mlir_tablegen(OpenMPTypeInterfaces.cpp.inc -gen-type-interface-defs)
 add_mlir_generic_tablegen_target(MLIROpenMPTypeInterfacesIncGen)
+list(REMOVE_ITEM LLVM_TARGET_DEPENDS omp_common_td)
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/include/mlir/Transforms/CMakeLists.txt b/mlir/include/mlir/Transforms/CMakeLists.txt
index 1b57a3482c1bb..c39fe0d010a6f 100644
--- a/mlir/include/mlir/Transforms/CMakeLists.txt
+++ b/mlir/include/mlir/Transforms/CMakeLists.txt
@@ -7,6 +7,7 @@ add_mlir_dialect_tablegen_target(MLIRTransformsPassIncGen)
 
 set(LLVM_TARGET_DEFINITIONS DialectInlinerInterface.td)
 mlir_tablegen(DialectInlinerInterface.h.inc -gen-dialect-interface-decls)
-add_mlir_dialect_tablegen_target(MLIRTransformsDialectInterfaceIncGen)
+add_mlir_dialect_tablegen_target(MLIRTransformsDialectInterfaceIncGen
+  OWNER MLIRTransformUtils)
 
 add_mlir_doc(Passes GeneralPasses ./ -gen-pass-doc)
diff --git a/mlir/lib/Analysis/CMakeLists.txt b/mlir/lib/Analysis/CMakeLists.txt
index 2712ab503663e..b630f5b883d84 100644
--- a/mlir/lib/Analysis/CMakeLists.txt
+++ b/mlir/lib/Analysis/CMakeLists.txt
@@ -47,9 +47,6 @@ add_mlir_library(MLIRAnalysis
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Analysis
 
-  DEPENDS
-  mlir-headers
-
   LINK_LIBS PUBLIC
   MLIRCallInterfaces
   MLIRControlFlowInterfaces
@@ -65,4 +62,3 @@ add_mlir_library(MLIRAnalysis
   MLIRSideEffectInterfaces
   MLIRViewLikeInterface
   )
-
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..d84ebe569147e 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,12 +33,13 @@ add_mlir_conversion_library(MLIRMathToAPFloat
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/MathToLLVM
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
+  # MathToAPFloat.cpp includes the generated Math transforms pass header.
+  HEADER_LIBS PRIVATE
+  MLIRMathTransforms
+
   LINK_LIBS PUBLIC
   MLIRTransformUtils
   MLIRArithAndMathToAPFloatUtils
diff --git a/mlir/lib/Conversion/ArithToAMDGPU/CMakeLists.txt b/mlir/lib/Conversion/ArithToAMDGPU/CMakeLists.txt
index 50be09ab5a7c5..b7c5ef47daf78 100644
--- a/mlir/lib/Conversion/ArithToAMDGPU/CMakeLists.txt
+++ b/mlir/lib/Conversion/ArithToAMDGPU/CMakeLists.txt
@@ -4,12 +4,13 @@ add_mlir_conversion_library(MLIRArithToAMDGPU
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ArithToAMDGPU
 
-  DEPENDS
-  MLIRConversionPassIncGen
-
   LINK_COMPONENTS
   Core
 
+  # ArithToAMDGPU.cpp includes VectorRewritePatterns.h.
+  HEADER_LIBS PRIVATE
+  MLIRVectorTransforms
+
   LINK_LIBS PUBLIC
   MLIRAMDGPUDialect
   MLIRAMDGPUUtils
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..b183599031a8a 100644
--- a/mlir/lib/Dialect/AMDGPU/Transforms/CMakeLists.txt
+++ b/mlir/lib/Dialect/AMDGPU/Transforms/CMakeLists.txt
@@ -7,8 +7,9 @@ add_mlir_dialect_library(MLIRAMDGPUTransforms
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/AMDGPU/Transforms
 
-  DEPENDS
-  MLIRAMDGPUTransformsIncGen
+  # MaskedloadToLoad.cpp includes VectorTransforms.h.
+  HEADER_LIBS PRIVATE
+  MLIRVectorTransforms
 
   LINK_LIBS PUBLIC
   MLIRAMDGPUDialect
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..2ee43aeb5d2e7 100644
--- a/mlir/lib/Dialect/GPU/CMakeLists.txt
+++ b/mlir/lib/Dialect/GPU/CMakeLists.txt
@@ -6,12 +6,9 @@ add_mlir_dialect_library(MLIRGPUDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/GPU
 
+  # GPU dialect sources include llvm/IR/Attributes.h.
   DEPENDS
-  MLIRGPUOpsIncGen
-  MLIRGPUOpsAttributesIncGen
-  MLIRGPUOpsEnumsGen
-  MLIRGPUOpInterfacesIncGen
-  MLIRGPUCompilationAttrInterfacesIncGen
+  intrinsics_gen
 
   LINK_LIBS PUBLIC
   MLIRArithDialect
@@ -52,10 +49,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/Pipelines/CMakeLists.txt b/mlir/lib/Dialect/GPU/Pipelines/CMakeLists.txt
index 3a0cd7ef5c39d..eeb777d98ab7b 100644
--- a/mlir/lib/Dialect/GPU/Pipelines/CMakeLists.txt
+++ b/mlir/lib/Dialect/GPU/Pipelines/CMakeLists.txt
@@ -6,6 +6,13 @@ add_mlir_dialect_library(MLIRGPUPipelines
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/GPU
 
+  # GPUToXeVMPipeline.cpp includes the aggregate Conversion/Passes.h header,
+  # whose declarations include these generated dialect and pass headers.
+  HEADER_LIBS PRIVATE
+  MLIRArmSMETransforms
+  MLIROpenACCDialect
+  MLIRTosaTransforms
+
   LINK_LIBS PUBLIC
   MLIRMemRefTransforms
   MLIRFuncDialect
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/GPU/Utils/CMakeLists.txt b/mlir/lib/Dialect/GPU/Utils/CMakeLists.txt
index 69094c518a159..a49baddc2bee8 100644
--- a/mlir/lib/Dialect/GPU/Utils/CMakeLists.txt
+++ b/mlir/lib/Dialect/GPU/Utils/CMakeLists.txt
@@ -5,10 +5,15 @@ add_mlir_dialect_library(MLIRGPUUtils
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/GPU/Utils
 
+  # GPU utility headers include llvm/IR/Attributes.h.
+  DEPENDS
+  intrinsics_gen
+
   LINK_LIBS PUBLIC
   MLIRArithDialect
   MLIRAffineDialect
   MLIRGPUDialect
   MLIRSupport
   MLIRIR
+  MLIRVectorDialect
   )
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..7f4debce44f70 100644
--- a/mlir/lib/Dialect/LLVMIR/CMakeLists.txt
+++ b/mlir/lib/Dialect/LLVMIR/CMakeLists.txt
@@ -29,21 +29,19 @@ 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
 
+  HEADER_LIBS PRIVATE
+  # LLVMAttrs.cpp includes mlir/Dialect/Ptr/IR/PtrEnums.h.
+  MLIRPtrDialect
+  # LLVMDialect.cpp includes mlir/Transforms/InliningUtils.h.
+  MLIRTransforms
+
   LINK_LIBS PUBLIC
   MLIRCallInterfaces
   MLIRControlFlowInterfaces
@@ -67,11 +65,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 +98,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 +123,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 +146,6 @@ add_mlir_dialect_library(MLIRXeVMDialect
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/LLVMIR
 
   DEPENDS
-  MLIRGPUCompilationAttrInterfacesIncGen
-  MLIRXeVMOpsIncGen
-  MLIRXeVMConversionsIncGen
   intrinsics_gen
 
   LINK_COMPONENTS
@@ -160,6 +153,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..5264a84526de7 100644
--- a/mlir/lib/Dialect/Linalg/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/Linalg/IR/CMakeLists.txt
@@ -7,14 +7,9 @@ add_mlir_dialect_library(MLIRLinalgDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Linalg
 
-  DEPENDS
-  MLIRLinalgInterfacesIncGen
-  MLIRLinalgOpsAttributesIncGen
-  MLIRLinalgOpsEnumsIncGen
-  MLIRLinalgOpsIncGen
-  MLIRLinalgStructuredOpsIncGen
-  MLIRLinalgRelayoutOpsIncGen
-  MLIRShardingInterfaceIncGen
+  # LinalgDialect.cpp includes ShardingInterface.h for promised interfaces.
+  HEADER_LIBS PRIVATE
+  MLIRShardingInterface
 
   LINK_LIBS PUBLIC
   MLIRAffineDialect
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..29d767bc67d5f 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,16 +45,13 @@ 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 llvm/IR/Attributes.h.
+  intrinsics_gen
+
+  # SPIRVDialect.cpp includes the generated GPU CompilationInterfaces.
+  HEADER_LIBS PRIVATE
+  MLIRGPUDialect
 
   LINK_LIBS PUBLIC
   MLIRControlFlowInterfaces
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/Pipelines/CMakeLists.txt b/mlir/lib/Dialect/SparseTensor/Pipelines/CMakeLists.txt
index c724b49762a1a..351033cd01898 100644
--- a/mlir/lib/Dialect/SparseTensor/Pipelines/CMakeLists.txt
+++ b/mlir/lib/Dialect/SparseTensor/Pipelines/CMakeLists.txt
@@ -4,6 +4,13 @@ add_mlir_dialect_library(MLIRSparseTensorPipelines
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/SparseTensor
 
+  # SparseTensorPipelines.cpp includes the aggregate Conversion/Passes.h
+  # header, whose declarations include these generated dialect headers.
+  HEADER_LIBS PRIVATE
+  MLIRArmSMETransforms
+  MLIROpenACCDialect
+  MLIRTosaTransforms
+
   LINK_LIBS PUBLIC
   MLIRArithTransforms
   MLIRAffineToStandard
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..9feee13bfc4f2 100644
--- a/mlir/lib/Dialect/Tensor/IR/CMakeLists.txt
+++ b/mlir/lib/Dialect/Tensor/IR/CMakeLists.txt
@@ -14,8 +14,9 @@ add_mlir_dialect_library(MLIRTensorDialect
   ADDITIONAL_HEADER_DIRS
   ${PROJECT_SOURCE_DIR}/include/mlir/Dialect/Tensor
 
-  DEPENDS
-  MLIRTensorOpsIncGen
+  # TensorDialect.cpp includes TransformInterfaces.h.
+  HEADER_LIBS PRIVATE
+  MLIRTransformDialectInterfaces
 
   LINK_LIBS PUBLIC
   MLIRAffineDialect
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..c65d6d3e47ac1 100644
--- a/mlir/lib/Dialect/Tosa/CMakeLists.txt
+++ b/mlir/lib/Dialect/Tosa/CMakeLists.txt
@@ -8,13 +8,9 @@ add_mlir_dialect_library(MLIRTosaDialect
   ADDITIONAL_HEADER_DIRS
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/Tosa
 
-  DEPENDS
-  MLIRTosaAttributesIncGen
-  MLIRTosaDialectBytecodeIncGen
-  MLIRTosaOpsIncGen
-  MLIRTosaInterfacesIncGen
-  MLIRTosaEnumsIncGen
-  MLIRShardingInterfaceIncGen
+  # TosaOps.cpp includes ShardingInterface.h for promised interfaces.
+  HEADER_LIBS PRIVATE
+  MLIRShardingInterface
 
   LINK_LIBS PUBLIC
   MLIRIR
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..1b4abc9c016c6 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
@@ -28,6 +32,10 @@ add_mlir_translation_library(MLIRSPIRVTranslateRegistration
 add_mlir_dialect_library(MLIRSPIRVTarget
   Target.cpp
 
+  # Target.cpp includes llvm/IR/Attributes.h.
+  DEPENDS
+  intrinsics_gen
+
   LINK_LIBS PUBLIC
   MLIRIR
   MLIRGPUDialect
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/CMake/header-dependencies.test b/mlir/test/CMake/header-dependencies.test
new file mode 100644
index 0000000000000..8eef682ae4450
--- /dev/null
+++ b/mlir/test/CMake/header-dependencies.test
@@ -0,0 +1,274 @@
+# RUN: rm -rf %t
+# RUN: split-file %s %t
+# RUN: "%cmake_exe" -S %t/valid -B %t/valid-build \
+# RUN:   -G "%cmake_generator" -DMLIR_DIR=%mlir_cmake_dir 2>&1 \
+# RUN:   | FileCheck %s --check-prefix=VALID
+# RUN: not "%cmake_exe" -S %t/owner-typo -B %t/owner-typo-build \
+# RUN:   -G "%cmake_generator" -DMLIR_DIR=%mlir_cmake_dir 2>&1 \
+# RUN:   | FileCheck %s --check-prefix=OWNER-TYPO
+# RUN: not "%cmake_exe" -S %t/ambiguous -B %t/ambiguous-build \
+# RUN:   -G "%cmake_generator" -DMLIR_DIR=%mlir_cmake_dir 2>&1 \
+# RUN:   | FileCheck %s --check-prefix=AMBIGUOUS
+# RUN: not "%cmake_exe" -S %t/header-genex -B %t/header-genex-build \
+# RUN:   -G "%cmake_generator" -DMLIR_DIR=%mlir_cmake_dir 2>&1 \
+# RUN:   | FileCheck %s --check-prefix=HEADER-GENEX
+# RUN: not "%cmake_exe" -S %t/target-header-genex \
+# RUN:   -B %t/target-header-genex-build -G "%cmake_generator" \
+# RUN:   -DMLIR_DIR=%mlir_cmake_dir 2>&1 \
+# RUN:   | FileCheck %s --check-prefix=TARGET-HEADER-GENEX
+
+# VALID: -- MLIR generated-header dependency model checks passed
+# OWNER-TYPO: MissingOwnerGen names generated-header owner 'MissingOwner'
+# AMBIGUOUS: AmbiguousGen is in a directory shared by MLIR libraries
+# AMBIGUOUS-NEXT: 'AmbiguousA;AmbiguousB'
+# HEADER-GENEX: BadConsumer uses a generator expression in HEADER_LIBS
+# TARGET-HEADER-GENEX: BadTarget uses a generator expression in
+# TARGET-HEADER-GENEX-SAME: mlir_target_link_header_libraries
+
+#--- common.cmake
+cmake_minimum_required(VERSION 3.20)
+
+find_package(MLIR REQUIRED CONFIG)
+list(APPEND CMAKE_MODULE_PATH "${MLIR_CMAKE_DIR}" "${LLVM_CMAKE_DIR}")
+include(AddLLVM)
+include(AddMLIR)
+
+# Installed projects do not define the in-tree source roots used as optional
+# directory-inference hints. The fixtures only need one stable directory.
+set(MLIR_MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
+set(MLIR_MAIN_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
+if(NOT TARGET mlir-headers)
+  add_custom_target(mlir-headers)
+endif()
+
+function(add_fake_tablegen target)
+  add_custom_target(${target})
+  string(SHA1 directory_id "${CMAKE_CURRENT_SOURCE_DIR}")
+  set_property(TARGET ${target} PROPERTY MLIR_TABLEGEN_OUTPUTS
+    "${CMAKE_CURRENT_BINARY_DIR}/${target}.inc")
+  set_property(TARGET ${target} PROPERTY MLIR_TABLEGEN_DIRECTORY_ID
+    ${directory_id})
+  set_property(GLOBAL APPEND PROPERTY MLIR_TABLEGEN_TARGETS ${target})
+endfunction()
+
+function(add_fake_library target)
+  add_library(${target} STATIC empty.cpp)
+  _mlir_configure_library_header_dependencies(${target}
+    COMPILE_TARGET ${target} ${ARGN})
+endfunction()
+
+#--- valid/CMakeLists.txt
+cmake_minimum_required(VERSION 3.20)
+project(MLIRHeaderDependencies LANGUAGES CXX)
+include(../common.cmake)
+
+# Schedule final resolution before declaring the owner. The deferred pass must
+# still find the later library.
+add_fake_tablegen(LateOwnerGen)
+_mlir_register_tablegen_owner(LateOwner LateOwnerGen)
+_mlir_schedule_header_library_validation()
+add_fake_library(LateOwner)
+
+# An explicit OWNER must replace a viable conventional candidate.
+add_fake_tablegen(ExplicitOwnerGen)
+_mlir_register_tablegen_owner(InferredOwner ExplicitOwnerGen)
+_mlir_register_explicit_tablegen_owner(ExplicitOwner ExplicitOwnerGen)
+add_fake_library(InferredOwner)
+add_fake_library(ExplicitOwner)
+
+# Extra generators declared beside a single dialect inherit that dialect's
+# logical owner without repeating OWNER.
+_mlir_register_tablegen_directory_owners(DefaultDialect)
+add_fake_tablegen(DefaultDialectExtraGen)
+add_fake_library(DefaultDialect)
+
+# Two libraries in one directory must publish disjoint explicitly owned
+# generators instead of inheriting every generator from the directory.
+add_fake_tablegen(MixedAGen)
+add_fake_tablegen(MixedBGen)
+_mlir_register_explicit_tablegen_owner(MixedA MixedAGen)
+_mlir_register_explicit_tablegen_owner(MixedB MixedBGen)
+add_fake_library(MixedA)
+add_fake_library(MixedB)
+
+# Per-target MLIR wrappers must not inherit the preceding target's outputs or
+# cumulative LLVM_COMMON_DEPENDS ordering.
+set(first_output "${CMAKE_CURRENT_BINARY_DIR}/FirstOutput.inc")
+set_property(DIRECTORY PROPERTY MLIR_UNCLAIMED_TABLEGEN_OUTPUTS
+  ${first_output})
+set(TABLEGEN_OUTPUT ${first_output})
+_mlir_add_public_tablegen_target(FirstOutputGen)
+_mlir_register_tablegen_target(FirstOutputGen)
+_mlir_register_explicit_tablegen_owner(FirstOutputOwner FirstOutputGen)
+add_fake_library(FirstOutputOwner)
+
+set(second_output "${CMAKE_CURRENT_BINARY_DIR}/SecondOutput.inc")
+set_property(DIRECTORY PROPERTY MLIR_UNCLAIMED_TABLEGEN_OUTPUTS
+  ${second_output})
+set(TABLEGEN_OUTPUT ${first_output} ${second_output})
+_mlir_add_public_tablegen_target(SecondOutputGen)
+_mlir_register_tablegen_target(SecondOutputGen)
+_mlir_register_explicit_tablegen_owner(SecondOutputOwner SecondOutputGen)
+add_fake_library(SecondOutputOwner)
+
+# add_sharded_ops combines public .inc files from mlir_tablegen() with source
+# outputs from the raw source sharder. They must remain one exact target batch.
+add_sharded_ops(ShardedOps 1)
+add_fake_library(MLIRSharded)
+
+# Reciprocal PUBLIC links are legal for static libraries. Their carriers must
+# flatten to generator leaves rather than form an artificial carrier cycle.
+add_fake_tablegen(CycleAGen)
+add_fake_tablegen(CycleBGen)
+_mlir_register_explicit_tablegen_owner(CycleA CycleAGen)
+_mlir_register_explicit_tablegen_owner(CycleB CycleBGen)
+add_fake_library(CycleA PUBLIC_LIBRARIES CycleB)
+add_fake_library(CycleB PUBLIC_LIBRARIES CycleA)
+
+# INTERFACE dependencies propagate to consumers without becoming compile
+# dependencies of the library that declares them.
+add_fake_tablegen(InterfaceProviderGen)
+_mlir_register_explicit_tablegen_owner(InterfaceProvider
+  InterfaceProviderGen)
+add_fake_library(InterfaceProvider)
+add_fake_tablegen(InterfaceConsumerGen)
+_mlir_register_explicit_tablegen_owner(InterfaceConsumer
+  InterfaceConsumerGen)
+add_fake_library(InterfaceConsumer
+  INTERFACE_LIBRARIES InterfaceProvider)
+
+# Alias and conditional LINK_LIBS candidates must reach the real provider;
+# imported HEADER_LIBS providers are already generated and therefore a no-op.
+add_fake_tablegen(AliasProviderGen)
+_mlir_register_explicit_tablegen_owner(AliasProvider AliasProviderGen)
+add_fake_library(AliasProvider)
+add_library(AliasProviderName ALIAS AliasProvider)
+add_library(InstalledProvider STATIC IMPORTED)
+add_fake_library(AliasConsumer PUBLIC_LIBRARIES AliasProviderName)
+add_fake_library(ConditionalConsumer
+  EXPLICIT_LIBRARIES InstalledProvider
+  PRIVATE_LIBRARIES "$<$<BOOL:1>:AliasProviderName>" InstalledProvider)
+
+function(expect_owner tablegen_target expected)
+  get_target_property(actual ${tablegen_target} MLIR_TABLEGEN_RESOLVED_OWNER)
+  if(NOT "${actual}" STREQUAL "${expected}")
+    message(FATAL_ERROR
+      "${tablegen_target}: expected owner ${expected}, got ${actual}")
+  endif()
+endfunction()
+
+function(expect_manual_dependencies target expected)
+  get_target_property(actual ${target} MANUALLY_ADDED_DEPENDENCIES)
+  if(NOT actual)
+    set(actual)
+  endif()
+  list(SORT actual)
+  set(sorted_expected ${expected})
+  list(SORT sorted_expected)
+  if(NOT "${actual}" STREQUAL "${sorted_expected}")
+    message(FATAL_ERROR
+      "${target}: expected dependencies '${sorted_expected}', got '${actual}'")
+  endif()
+  foreach(dependency ${actual})
+    if(dependency MATCHES "^headers\\.")
+      message(FATAL_ERROR
+        "${target}: carrier dependency ${dependency} can create cycles")
+    endif()
+  endforeach()
+endfunction()
+
+function(expect_property target property expected)
+  get_target_property(actual ${target} ${property})
+  if(NOT "${actual}" STREQUAL "${expected}")
+    message(FATAL_ERROR
+      "${target}.${property}: expected '${expected}', got '${actual}'")
+  endif()
+endfunction()
+
+function(check_header_model)
+  expect_owner(LateOwnerGen LateOwner)
+  expect_owner(ExplicitOwnerGen ExplicitOwner)
+  expect_owner(DefaultDialectExtraGen DefaultDialect)
+  expect_owner(MixedAGen MixedA)
+  expect_owner(MixedBGen MixedB)
+  expect_property(FirstOutputGen MLIR_TABLEGEN_OUTPUTS "${first_output}")
+  expect_property(SecondOutputGen MLIR_TABLEGEN_OUTPUTS "${second_output}")
+  set(sharded_outputs
+    "${CMAKE_CURRENT_BINARY_DIR}/ShardedOps.h.inc"
+    "${CMAKE_CURRENT_BINARY_DIR}/ShardedOps.cpp.inc"
+    "${CMAKE_CURRENT_BINARY_DIR}/ShardedOps.0.cpp"
+    "${CMAKE_CURRENT_BINARY_DIR}/ShardedOps.1.cpp")
+  expect_property(MLIRShardedOpsShardGen MLIR_TABLEGEN_OUTPUTS
+    "${sharded_outputs}")
+  get_target_property(second_ordering SecondOutputGen
+    MANUALLY_ADDED_DEPENDENCIES)
+  if(second_ordering)
+    message(FATAL_ERROR
+      "SecondOutputGen inherited ordering '${second_ordering}'")
+  endif()
+  expect_manual_dependencies(headers.MixedA "MixedAGen")
+  expect_manual_dependencies(headers.MixedB "MixedBGen")
+  expect_manual_dependencies(headers.CycleA "CycleAGen;CycleBGen")
+  expect_manual_dependencies(headers.CycleB "CycleAGen;CycleBGen")
+  expect_manual_dependencies(headers.InterfaceConsumer
+    "InterfaceConsumerGen;InterfaceProviderGen")
+  expect_manual_dependencies(InterfaceConsumer "InterfaceConsumerGen")
+  expect_manual_dependencies(headers.AliasConsumer "AliasProviderGen")
+  expect_manual_dependencies(headers.ConditionalConsumer "")
+  expect_manual_dependencies(ConditionalConsumer "AliasProviderGen")
+  message(STATUS "MLIR generated-header dependency model checks passed")
+endfunction()
+
+cmake_language(DEFER CALL check_header_model)
+
+#--- valid/empty.cpp
+void empty() {}
+
+#--- valid/ShardedOps.td
+// Only configuration-time output ownership is under test.
+
+#--- valid/ShardedOps.cpp
+// Only configuration-time output ownership is under test.
+
+#--- owner-typo/CMakeLists.txt
+cmake_minimum_required(VERSION 3.20)
+project(MLIRHeaderOwnerTypo LANGUAGES CXX)
+include(../common.cmake)
+add_fake_tablegen(MissingOwnerGen)
+_mlir_register_explicit_tablegen_owner(MissingOwner MissingOwnerGen)
+_mlir_schedule_header_library_validation()
+
+#--- owner-typo/empty.cpp
+void empty() {}
+
+#--- ambiguous/CMakeLists.txt
+cmake_minimum_required(VERSION 3.20)
+project(MLIRHeaderAmbiguousOwner LANGUAGES CXX)
+include(../common.cmake)
+add_fake_tablegen(AmbiguousGen)
+add_fake_library(AmbiguousA)
+add_fake_library(AmbiguousB)
+
+#--- ambiguous/empty.cpp
+void empty() {}
+
+#--- header-genex/CMakeLists.txt
+cmake_minimum_required(VERSION 3.20)
+project(MLIRHeaderGeneratorExpression LANGUAGES CXX)
+include(../common.cmake)
+_mlir_collect_library_header_dependencies(BadConsumer
+  HEADER_LIBS PRIVATE "$<$<BOOL:1>:MisspelledProvider>")
+
+#--- header-genex/empty.cpp
+void empty() {}
+
+#--- target-header-genex/CMakeLists.txt
+cmake_minimum_required(VERSION 3.20)
+project(MLIRTargetHeaderGeneratorExpression LANGUAGES CXX)
+include(../common.cmake)
+add_executable(BadTarget empty.cpp)
+mlir_target_link_header_libraries(BadTarget
+  "$<$<BOOL:1>:MisspelledProvider>")
+
+#--- target-header-genex/empty.cpp
+int main() { return 0; }
diff --git a/mlir/test/CMake/lit.local.cfg b/mlir/test/CMake/lit.local.cfg
new file mode 100644
index 0000000000000..a16efaf9cc65c
--- /dev/null
+++ b/mlir/test/CMake/lit.local.cfg
@@ -0,0 +1,3 @@
+config.substitutions.append(("%cmake_exe", config.host_cmake))
+config.substitutions.append(("%cmake_generator", config.host_cmake_generator))
+config.substitutions.append(("%mlir_cmake_dir", config.mlir_cmake_dir))
diff --git a/mlir/test/lib/Dialect/NVGPU/CMakeLists.txt b/mlir/test/lib/Dialect/NVGPU/CMakeLists.txt
index 025f1a0dbc488..61abe68d00b93 100644
--- a/mlir/test/lib/Dialect/NVGPU/CMakeLists.txt
+++ b/mlir/test/lib/Dialect/NVGPU/CMakeLists.txt
@@ -3,6 +3,12 @@ add_mlir_library(MLIRNVGPUTestPasses
   TestNVGPUTransforms.cpp
 
   EXCLUDE_FROM_LIBMLIR
+
+  # TestNVGPUTransforms.cpp includes Linalg and Vector transform headers.
+  HEADER_LIBS PRIVATE
+  MLIRLinalgDialect
+  MLIRLinalgTransforms
+  MLIRVectorTransforms
   )
 mlir_target_link_libraries(MLIRNVGPUTestPasses PUBLIC
   MLIRIR
diff --git a/mlir/test/lib/Dialect/Shard/CMakeLists.txt b/mlir/test/lib/Dialect/Shard/CMakeLists.txt
index a97839b6b1ffd..87b30072fb867 100644
--- a/mlir/test/lib/Dialect/Shard/CMakeLists.txt
+++ b/mlir/test/lib/Dialect/Shard/CMakeLists.txt
@@ -4,6 +4,10 @@ add_mlir_library(MLIRShardTest
   TestReshardingPartition.cpp
 
   EXCLUDE_FROM_LIBMLIR
+
+  # TestReshardingPartition.cpp includes SPIRVOps.h.
+  HEADER_LIBS PRIVATE
+  MLIRSPIRVDialect
   )
 mlir_target_link_libraries(MLIRShardTest PUBLIC
   MLIRShardDialect
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 cfe-commits mailing list