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..0042e54c571 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 CACHE INTERNAL "") set(DCMTK_ENABLE_CXX11 ON) set(DCMTK_FORCE_FPIC_ON_UNIX ON) set(DCMTK_DEFAULT_DICT builtin) @@ -148,32 +151,43 @@ 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. + # Build-tree consumers: locate DCMTKConfig.cmake in ITK's build root. The + # build-tree export was written by export(TARGETS NAMESPACE), which + # mis-prefixes ITK's codec targets as DCMTK::ITK::*Module; rewrite those + # link-interface entries to their real ITK::* names after import. + list(JOIN _ITKDCMTK_LIB_NAMES " " _itkdcmtk_lib_names_spaced) set( ITKDCMTK_EXPORT_CODE_BUILD " if(NOT ITK_BINARY_DIR) set(DCMTK_DIR \"${CMAKE_BINARY_DIR}\") find_package(DCMTK REQUIRED NO_MODULE) + foreach(_itkdcmtk_lib ${_itkdcmtk_lib_names_spaced}) + if(TARGET DCMTK::\${_itkdcmtk_lib}) + get_target_property(_itkdcmtk_ll DCMTK::\${_itkdcmtk_lib} INTERFACE_LINK_LIBRARIES) + if(_itkdcmtk_ll MATCHES \"DCMTK::ITK::\") + string(REPLACE \"DCMTK::ITK::\" \"ITK::\" _itkdcmtk_ll \"\${_itkdcmtk_ll}\") + set_target_properties(DCMTK::\${_itkdcmtk_lib} PROPERTIES + INTERFACE_LINK_LIBRARIES \"\${_itkdcmtk_ll}\") + endif() + endif() + endforeach() + unset(_itkdcmtk_lib) + unset(_itkdcmtk_ll) endif() " ) + unset(_itkdcmtk_lib_names_spaced) # Install-tree consumers: locate DCMTKConfig.cmake under ITK_INSTALL_PREFIX. set( ITKDCMTK_EXPORT_CODE_INSTALL 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(