Revert "[CMake][TableGen] Fix Ninja depslog error with implicit outputs on Ninja <1.10" (#182695)

Reverts llvm/llvm-project#179842

This seems to break some dependency tracking, as I no longer see .inc
files being regenerated when I update a TableGen .cpp file. Reverting
for now per the discussion on the PR.
This commit is contained in:
Rahul Joshi 2026-02-21 11:52:21 -08:00 committed by GitHub
parent a6416a8411
commit 8e2222795b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -24,14 +24,6 @@ function(tablegen project ofn)
# Filter out any empty include items.
list(REMOVE_ITEM tblgen_includes "")
# Check for multi-output tablegen invocations BEFORE deciding on depfile mode.
# Ninja's depslog cannot handle multiple outputs with depfile, so we must use
# fallback mode (globbing) for these cases.
set(has_extra_outputs FALSE)
if("-gen-register-info" IN_LIST ARGN)
set(has_extra_outputs TRUE)
endif()
# Use depfile instead of globbing arbitrary *.td(s) for Ninja. We force
# CMake versions older than v3.30 on Windows to use the fallback behavior
# due to a depfile parsing bug on Windows paths in versions prior to 3.30.
@ -40,28 +32,10 @@ function(tablegen project ofn)
# behavior as v3.22 and earlier fail to parse some depfiles that get
# generated, and this behavior was fixed in CMake commit
# e04a352cca523eba2ac0d60063a3799f5bb1c69e.
# CRITICAL: Ninja <1.10 has a depslog limitation: it cannot handle depfile
# mode when CMake generates implicit outputs (absolute path aliases for IDE
# support). For multi-output rules OR when using Ninja <1.10, we MUST use
# fallback mode (glob .td files) to avoid "multiple outputs aren't supported
# by depslog" errors.
cmake_policy(GET CMP0116 cmp0116_state)
# Check Ninja version to avoid depslog errors with implicit outputs
set(ninja_version_supports_depfile TRUE)
if(CMAKE_GENERATOR MATCHES "Ninja")
execute_process(COMMAND ${CMAKE_MAKE_PROGRAM} --version
OUTPUT_VARIABLE ninja_version
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(ninja_version VERSION_LESS "1.10")
set(ninja_version_supports_depfile FALSE)
endif()
endif()
if(CMAKE_GENERATOR MATCHES "Ninja" AND cmp0116_state STREQUAL NEW
AND NOT (CMAKE_HOST_WIN32 AND CMAKE_VERSION VERSION_LESS 3.30)
AND NOT (CMAKE_VERSION VERSION_LESS 3.23)
AND NOT has_extra_outputs
AND ninja_version_supports_depfile)
AND NOT (CMAKE_VERSION VERSION_LESS 3.23))
# CMake emits build targets as relative paths but Ninja doesn't identify
# absolute path (in *.d) as relative path (in build.ninja). Post CMP0116,
# CMake handles this discrepancy for us, otherwise we use the fallback
@ -154,7 +128,7 @@ function(tablegen project ofn)
# ("${${project}_TABLEGEN_TARGET}" STREQUAL "${${project}_TABLEGEN_EXE}")
# but lets us having smaller and cleaner code here.
set(tablegen_exe ${${project}_TABLEGEN_EXE})
set(tablegen_target ${${project}_TABLEGEN_TARGET})
set(tablegen_depends ${${project}_TABLEGEN_TARGET} ${tablegen_exe})
if(LLVM_PARALLEL_TABLEGEN_JOBS)
set(LLVM_TABLEGEN_JOB_POOL JOB_POOL tablegen_job_pool)
@ -162,20 +136,6 @@ function(tablegen project ofn)
set(LLVM_TABLEGEN_JOB_POOL "")
endif()
# For Ninja with multiple outputs, we cannot add the target to DEPENDS due to
# depslog limitations. Instead, rely on the implicit tool dependency from COMMAND
# and the globbed .td files for proper dependency tracking.
# For single outputs or non-Ninja generators, include the target in DEPENDS.
set(tablegen_target_dep)
if(NOT EXTRA_OUTPUTS)
# Single output: safe to add explicit target dependency
set(tablegen_target_dep ${tablegen_target})
elseif(NOT CMAKE_GENERATOR MATCHES "Ninja")
# Multiple outputs but not Ninja: Ninja's depslog is not a constraint
set(tablegen_target_dep ${tablegen_target})
endif()
# Multiple outputs + Ninja: Don't add target dependency; rely on COMMAND implicit tracking
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${ofn} ${EXTRA_OUTPUTS}
COMMAND ${tablegen_exe} ${ARG_UNPARSED_ARGUMENTS}
${tblgen_includes}
@ -186,7 +146,7 @@ function(tablegen project ofn)
# The file in LLVM_TARGET_DEFINITIONS may be not in the current
# directory and local_tds may not contain it, so we must
# explicitly list it here:
DEPENDS ${ARG_DEPENDS} ${tablegen_target_dep}
DEPENDS ${ARG_DEPENDS} ${tablegen_depends}
${global_tds}
${LLVM_TARGET_DEFINITIONS_ABSOLUTE}
${LLVM_TARGET_DEPENDS}