Skip to content

[CMake] Use DEPFILE instead of IMPLICIT_DEPENDS for dictionaries - #23011

Open
guitargeek wants to merge 2 commits into
root-project:masterfrom
guitargeek:issue-21203
Open

[CMake] Use DEPFILE instead of IMPLICIT_DEPENDS for dictionaries#23011
guitargeek wants to merge 2 commits into
root-project:masterfrom
guitargeek:issue-21203

Conversation

@guitargeek

@guitargeek guitargeek commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Re-applying commit ae4d830 after revert in 94caecf.

This PR also contains a follow-up fix to make things work under CMP0116 OLD.

This version was confirmed to not result in spurious dictionary rebuilds on the alma8 Docker container.

Closes #21203.

DhanashreePetare and others added 2 commits August 4, 2026 16:06
Follows up on ae4d830, which switched ROOT_GENERATE_DICTIONARY()
from IMPLICIT_DEPENDS to a proper DEPFILE, but rebuilt every dictionary
on every incremental build with older Ninja (e.g. 1.8.2 on Alma 8):

```txt
  ninja: expected depfile '.../io/io/G__RIO.depfile' to mention
         'io/io/G__RIO.cxx', got 'G__RIO.cxx'
```

rootcling writes the depfile target as the plain dictionary name it is
given (`"G__RIO.cxx"`) relative to CMAKE_CURRENT_BINARY_DIR. ROOT pins
`CMP0116` to OLD globally (see 7392b02), and under OLD the Ninja
generator consumes the depfile verbatim and expects the target relative
to the top-level build directory (`"io/io/G__RIO.cxx"`). The mismatch
makes older Ninja treat the dictionary as perpetually out of date; newer
Ninja tolerates it, which is why the regression only showed up on some
platforms.

This commit suggests to enable CMP0116 NEW locally around the dictionary
`add_custom_command` so CMake transforms the depfile to whatever the
active generator needs.
@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown

Test Results

    23 files      23 suites   3d 15h 32m 36s ⏱️
 3 856 tests  3 856 ✅ 0 💤 0 ❌
78 541 runs  78 541 ✅ 0 💤 0 ❌

Results for commit 3c63d03.

# use CMP0116 NEW locally so CMake normalises the depfile
# target for the active generator regardless of the global OLD setting.
cmake_policy(PUSH)
cmake_policy(SET CMP0116 NEW)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems that the current LLVM code can handle (when it needs to) CMP0116 to be NEW (See content of interpreter/llvm-project/llvm/cmake/modules/TableGen.cmake ; and the fact that the code refered to in 7392b02 in no longer in interpreter/llvm-project/cmake/Modules/CMakePolicy.cmake).

I would strongly recommend that we also (in a separate PR) set CMP0116 to be NEW globally.

continue;
std::string filenameStr(absPath.str());
// Skip the output dictionary file itself (final or temporary name).
if (filenameStr == dictOutputFileName || filenameStr == gOptDictionaryFileName.getValue())

@pcanal pcanal Aug 5, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are dictOutputFileName and gOptDictionaryFileName guaranteed to be absolute path name?

@pcanal pcanal left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally this PR would verify by doing this (non trivial) flow in a fork (or equivalent tweaks no affecting the actual master):

  • Merge (or another operation/hack that triggers the flow) so that that the build artefacts are produced and cached
  • Create another no-op PR (i.e affecting only the README files) and verify that all the build have zero rebuilds.

@pcanal

pcanal commented Aug 6, 2026

Copy link
Copy Markdown
Member

On the surface this looks fine (but obviously needs through testing)

@guitargeek

guitargeek commented Aug 10, 2026

Copy link
Copy Markdown
Contributor Author

Ideally this PR would verify by doing this (non trivial) flow in a fork (or equivalent tweaks no affecting the actual master):

[...]

I think there is an easier solution: checking in the CI that a second build is a no-op. I 'm exploring this idea in #23056

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ROOT_GENERATE_DICTIONARY needs to be updated to use DEPFILE instead of IMPLICIT_DEPENDS with add_custom_command

2 participants