[CMake] Make dictionary module dependencies independent of config order#22648
Merged
Conversation
For each entry in DEPENDENCIES, ROOT_GENERATE_DICTIONARY passes rootcling
a `-m <dep>.pcm` flag and a dependency on the dependency's module file, so
that the prebuilt module is loaded instead of being built implicitly. This
was wired up by inspecting the target graph while the macro runs
(`if(NOT TARGET G__${dep})` / `get_target_property(... ROOT_PCM_FILENAME)`),
which only works if <dep> is configured before the dictionaries using it.
That breaks for core/multiproc: libMultiProc depends on Net (via TSocket),
but it lives under core/, configured long before net/. So when G__MultiProc
is generated, G__Net does not exist yet, the dependency is silently dropped,
and rootcling can build Net implicitly, failing with "Building module 'Net'
implicitly ... 'G__MultiProc.cxx' depends on 'Net'". The same shape affects
every dictionary depending on a module configured later (Tree -> Net, ...).
Decide this at generation time instead, when all targets exist: guard the
flag and the module-file dependency with $<TARGET_EXISTS:G__<dep>>. They are
emitted whenever <dep> provides a dictionary and expand to nothing otherwise
(e.g. a plain library such as TBB::tbb), regardless of configuration order.
Closes root-project#21673.
🤖 Problem identified by AI, then the human guided the AI to write the
solution that the human wanted to apply.
1 task
Test Results 22 files 22 suites 3d 12h 24m 33s ⏱️ Results for commit 3706630. |
hageboeck
approved these changes
Jun 18, 2026
hageboeck
left a comment
Member
There was a problem hiding this comment.
That looks quite nice. I have a small idea to save us an expansion.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
For each entry in DEPENDENCIES, ROOT_GENERATE_DICTIONARY passes rootcling a
-m <dep>.pcmflag and a dependency on the dependency's module file, so that the prebuilt module is loaded instead of being built implicitly. This was wired up by inspecting the target graph while the macro runs (if(NOT TARGET G__${dep})/get_target_property(... ROOT_PCM_FILENAME)), which only works if is configured before the dictionaries using it.That breaks for core/multiproc: libMultiProc depends on Net (via TSocket), but it lives under core/, configured long before net/. So when G__MultiProc is generated, G__Net does not exist yet, the dependency is silently dropped, and rootcling can build Net implicitly, failing with "Building module 'Net' implicitly ... 'G__MultiProc.cxx' depends on 'Net'". The same shape affects every dictionary depending on a module configured later (Tree -> Net, ...).
Decide this at generation time instead, when all targets exist: guard the flag and the module-file dependency with $<TARGET_EXISTS:G__>. They are emitted whenever provides a dictionary and expand to nothing otherwise (e.g. a plain library such as TBB::tbb), regardless of configuration order.
Closes #21673.
🤖 Problem identified by AI, then the human guided the AI to write the solution that the human wanted to apply.