Skip to content

COMP: Use single export() call to fix namespace corruption - #3

Merged
blowekamp merged 1 commit into
InsightSoftwareConsortium:for/itk-dcmtk-3.7.0-ccfd10bfrom
blowekamp:fix-export-append-namespace
Jul 14, 2026
Merged

COMP: Use single export() call to fix namespace corruption#3
blowekamp merged 1 commit into
InsightSoftwareConsortium:for/itk-dcmtk-3.7.0-ccfd10bfrom
blowekamp:fix-export-append-namespace

Conversation

@blowekamp

Copy link
Copy Markdown
Member

Replacing the three APPEND export() calls with a single non-APPEND call fixes a namespace corruption bug in DCMTKTargets.cmake.

Root cause

CMake's cmExportBuildFileGenerator::HandleMissingTarget has two code paths for dependency targets not in the current export set:

  • Non-append mode: calls FindExportInfo(), which searches all registered build export sets. If the dependency is found in exactly one other set with one namespace, that namespace is used — e.g. ITK::ITKZLIBModule.
  • Append mode (APPEND): skips the lookup and blindly prepends the current export's namespace, producing DCMTK::ITK::ITKZLIBModule.

The previous file(WRITE) + 3×export(APPEND) pattern was used only to accumulate targets across multiple calls. All three calls share the same NAMESPACE DCMTK::, so combining them into a single export() is equivalent — and avoids triggering the append-mode shortcut.

Observed bug in ITK's FetchContent build

When DCMTK is consumed in-scope via FetchContent (as ITK does), DCMTKTargets.cmake contained:

INTERFACE_LINK_LIBRARIES "DCMTK::ofstd;DCMTK::oflog;DCMTK::ITK::ITKZLIBModule"

The DCMTK:: prefix was incorrectly prepended to the already-namespaced ITK codec targets. After this fix:

INTERFACE_LINK_LIBRARIES "DCMTK::ofstd;DCMTK::oflog;ITK::ITKZLIBModule"

See InsightSoftwareConsortium/ITK#6548 for context.

Replacing three APPEND export() calls with one non-APPEND call fixes
a namespace corruption bug where CMake prepends the DCMTK:: namespace
to dependency targets (e.g. ITK codec targets) that belong to other
export sets.

CMake's HandleMissingTarget only searches other registered export sets
when not in append mode. In append mode it blindly prepends the current
namespace, producing DCMTK::ITK::ITKZLIBModule instead of the correct
ITK::ITKZLIBModule in DCMTKTargets.cmake.

The file(WRITE)+3xAPPEND pattern was used only to accumulate targets
across multiple calls; combining them into a single export() call is
equivalent and avoids the append-mode shortcut.

@dzenanz dzenanz 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.

Looks good to me. Do you have an upstream PR for this?

hjmjohnson added a commit to hjmjohnson/ITK that referenced this pull request Jul 13, 2026
DCMTK's GenerateCMakeExports.cmake wrote DCMTKTargets.cmake with three
export(APPEND) calls; CMake's append mode skips the cross-export-set
namespace lookup and blindly prefixes DCMTK:: onto ITK's codec targets,
recording the nonexistent DCMTK::ITK::ITKZLIBModule (and TIFF/JPEG/PNG).
An external consumer of an ITK build tree then fails at generate. The
pinned InsightSoftwareConsortium/DCMTK#3 merges the exports into a
single export() call so foreign targets resolve to their ITK:: names.

Root cause analysis and DCMTK fix by Bradley Lowekamp.
@blowekamp

Copy link
Copy Markdown
Member Author

@hjmjohnson Were you able to build the ITK forest successfuly with this patch?

@dzenanz Once we confirm it fixes the issue for ITK, we can make a PR upstream.

@blowekamp
blowekamp merged commit 554b744 into InsightSoftwareConsortium:for/itk-dcmtk-3.7.0-ccfd10b Jul 14, 2026
1 check passed
blowekamp pushed a commit to hjmjohnson/ITK that referenced this pull request Jul 14, 2026
DCMTK's GenerateCMakeExports.cmake wrote DCMTKTargets.cmake with three
export(APPEND) calls; CMake's append mode skips the cross-export-set
namespace lookup and blindly prefixes DCMTK:: onto ITK's codec targets,
recording the nonexistent DCMTK::ITK::ITKZLIBModule (and TIFF/JPEG/PNG).
An external consumer of an ITK build tree then fails at generate. The
pinned InsightSoftwareConsortium/DCMTK#3 merges the exports into a
single export() call so foreign targets resolve to their ITK:: names.

Root cause analysis and DCMTK fix by Bradley Lowekamp.
@blowekamp

Copy link
Copy Markdown
Member Author

PR made upstream DCMTK#154

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants