From 2d2d2d8b2dda8dc3790875af545af7db31ca1745 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Thu, 2 Jul 2026 13:37:13 -0500 Subject: [PATCH 1/2] COMP: Require DCMTK 3.7.0 or later for ITK_USE_SYSTEM_DCMTK Match the vendored DCMTK version and guarantee that the system package config exports DCMTK::-namespaced imported targets, which the DCMTK IO modules link against. --- Modules/ThirdParty/DCMTK/itk-module-init.cmake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/ThirdParty/DCMTK/itk-module-init.cmake b/Modules/ThirdParty/DCMTK/itk-module-init.cmake index 7650f3b5521..070da78eaf2 100644 --- a/Modules/ThirdParty/DCMTK/itk-module-init.cmake +++ b/Modules/ThirdParty/DCMTK/itk-module-init.cmake @@ -5,7 +5,8 @@ option(ITK_USE_SYSTEM_DCMTK "Use an outside build of DCMTK." OFF) if(ITK_USE_SYSTEM_DCMTK) # Use local FindDCMTK.cmake. list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_LIST_DIR}/CMake") - find_package(DCMTK REQUIRED NO_MODULE) + # 3.7.0 matches the vendored DCMTK and guarantees DCMTK::-namespaced targets. + find_package(DCMTK 3.7.0 REQUIRED NO_MODULE) else() # Change default from OFF to ON for portability. option( From 0a0a06c700afee8c1cd733f83b07e1732a4121a9 Mon Sep 17 00:00:00 2001 From: "Hans J. Johnson" Date: Thu, 2 Jul 2026 13:38:42 -0500 Subject: [PATCH 2/2] COMP: Link namespaced DCMTK targets in the DCMTK IO modules Bare dcmdata/dcmimgle/... names survive only inside ITK's own build scope; the exported link interface then carries $, which no external consumer of the ITK build tree can resolve. The DCMTK:: wrapper targets export as DCMTK::dcmdata, which consumers resolve through find_package(DCMTK). Pin BUILD_SINGLE_SHARED_LIBRARY=OFF for the vendored build: a single- library build renames the per-library targets with a suffix that the DCMTK:: link names cannot match, and the suffix variable is not visible outside DCMTK's directory scope. This also retires the dead DCMTK_LIBRARY_SUFFIX handling in the wrapper loop. --- Modules/IO/DCMTK/src/CMakeLists.txt | 12 ++++++------ .../IO/IOTransformDCMTK/src/CMakeLists.txt | 2 +- Modules/ThirdParty/DCMTK/CMakeLists.txt | 19 ++++++++----------- 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/Modules/IO/DCMTK/src/CMakeLists.txt b/Modules/IO/DCMTK/src/CMakeLists.txt index 9616fb7041d..53efc9c3201 100644 --- a/Modules/IO/DCMTK/src/CMakeLists.txt +++ b/Modules/IO/DCMTK/src/CMakeLists.txt @@ -21,12 +21,12 @@ target_include_directories(ITKIODCMTK PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries( ITKIODCMTK PRIVATE - dcmdata - dcmimgle - dcmimage - dcmjpeg - dcmjpls - oflog + DCMTK::dcmdata + DCMTK::dcmimgle + DCMTK::dcmimage + DCMTK::dcmjpeg + DCMTK::dcmjpls + DCMTK::oflog ) if(DEFINED DCMTK_HAVE_CONFIG_H_OPTIONAL AND NOT DCMTK_HAVE_CONFIG_H_OPTIONAL) diff --git a/Modules/IO/IOTransformDCMTK/src/CMakeLists.txt b/Modules/IO/IOTransformDCMTK/src/CMakeLists.txt index 54fc39b970f..1400c9b4f7e 100644 --- a/Modules/IO/IOTransformDCMTK/src/CMakeLists.txt +++ b/Modules/IO/IOTransformDCMTK/src/CMakeLists.txt @@ -10,7 +10,7 @@ list(REMOVE_ITEM ITK_MODULE_IOTransformDCMTK_PRIVATE_DEPENDS ITKDCMTK) itk_module_add_library(IOTransformDCMTK ${IOTransformDCMTK_SRCS}) -target_link_libraries(IOTransformDCMTK PRIVATE dcmdata) +target_link_libraries(IOTransformDCMTK PRIVATE DCMTK::dcmdata) # itkDCMTKTransformIO.hxx is a private implementation header in this directory. target_include_directories(IOTransformDCMTK PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/Modules/ThirdParty/DCMTK/CMakeLists.txt b/Modules/ThirdParty/DCMTK/CMakeLists.txt index 6f178a171d6..958d76b66d4 100644 --- a/Modules/ThirdParty/DCMTK/CMakeLists.txt +++ b/Modules/ThirdParty/DCMTK/CMakeLists.txt @@ -107,6 +107,9 @@ else(ITK_USE_SYSTEM_DCMTK) # DCMTK build options; compiler and language-standard settings inherit from ITK's scope. set(BUILD_APPS OFF) + # Per-library targets only: a single-library build renames targets with a + # suffix the DCMTK IO modules' DCMTK:: link names cannot match. + set(BUILD_SINGLE_SHARED_LIBRARY OFF) set(DCMTK_ENABLE_CXX11 ON) set(DCMTK_FORCE_FPIC_ON_UNIX ON) set(DCMTK_DEFAULT_DICT builtin) @@ -148,21 +151,15 @@ else(ITK_USE_SYSTEM_DCMTK) # namespaced name in ITKTargets.cmake, matching what find_package(DCMTK) # yields for downstream consumers. foreach(_dcmtk_lib IN LISTS _ITKDCMTK_LIB_NAMES) - set(_dcmtk_target "${_dcmtk_lib}${DCMTK_LIBRARY_SUFFIX}") - if(TARGET "${_dcmtk_target}") - if(NOT TARGET "DCMTK::${_dcmtk_target}") - add_library("DCMTK::${_dcmtk_target}" INTERFACE IMPORTED GLOBAL) - target_link_libraries( - "DCMTK::${_dcmtk_target}" - INTERFACE - "${_dcmtk_target}" - ) + if(TARGET "${_dcmtk_lib}") + if(NOT TARGET "DCMTK::${_dcmtk_lib}") + add_library("DCMTK::${_dcmtk_lib}" INTERFACE IMPORTED GLOBAL) + target_link_libraries("DCMTK::${_dcmtk_lib}" INTERFACE "${_dcmtk_lib}") endif() - list(APPEND ITKDCMTK_LIBRARIES "DCMTK::${_dcmtk_target}") + list(APPEND ITKDCMTK_LIBRARIES "DCMTK::${_dcmtk_lib}") endif() endforeach() unset(_dcmtk_lib) - unset(_dcmtk_target) # Build-tree consumers: locate DCMTKConfig.cmake in ITK's build root. set(