Patch to generate modern DCMTKConfig.cmake file

Compilation and installation of DCMTK

Moderator: Moderator Team

Post Reply
Message
Author
chaircrusher
Posts: 32
Joined: Tue, 2011-12-20, 23:24
Location: iowa city,ia

Patch to generate modern DCMTKConfig.cmake file

#1 Post by chaircrusher »

This patch is here: https://github.com/InsightSoftwareConso ... operConfig

This patch won't effect the Autoconf build system, and it is backwards compatible with the old-style find_package(DCMTK).

The rationale for doing this patch (beyond what I mention in the comment below) is that the FindDCMTK.cmake file included with CMake doesn't do a very good job of finding the CMake-generated DCMTK configuration. This new version properly 'pulls through' any dependencies like jpeg, tiff, zlib, etc.

Not to rush anyone but I have changes to ITK, BRAINS, and Slicer that are dependent on this patch. I could keep using our cloned repository and its patched branches, but this is a serious improvement on the functionality of DCMTK with respect to CMake, and should therefore have benefits outside the projects with which I'm concerned.

Thanks for your conisderation -- Kent Williams

Code: Select all

From 6e34cfaff6c0fefc958932f43f1c8649ed864570 Mon Sep 17 00:00:00 2001
From: Kent Williams <norman-k-williams@uiowa.edu>
Date: Wed, 13 Feb 2013 15:41:40 -0600
Subject: [PATCH] COMP: Add CMAKE code to generate comprehensive DCMTKConfig
 files

Since CMake 2.6 (and in particular since 2.8) CMake supports a new signature for
find_package: find_package(<package_name> NO_MODULE)

NO_MODULE tells CMake to skip loading the Find<package>.cmake to locate a
package and use it. The big advantage for implementing this in a package like
DCMTK is that once it is properly implemented, a third-party library (like
DCMTK) can be used by other CMake projects without needing a Find<package>.cmake
file in the CMake installation.

This work in DCMTK is based on this tutorial:
http://www.cmake.org/Wiki/CMake/Tutorials/How_to_create_a_ProjectConfig.cmake_file

along with assistance from Brad King (brad.king@kitware.com)
---
 CMake/3rdparty.cmake                  |  468 +++++++++++++++++----------------
 CMake/DCMTKBuildTreeSettings.cmake.in |    2 +
 CMake/DCMTKConfig.cmake.in            |   30 ++
 CMake/DCMTKConfigVersion.cmake.in     |   11 +
 CMake/dcmtkMacros.cmake               |    8 +-
 CMake/dcmtkPrepare.cmake              |    8 +
 CMakeLists.txt                        |  152 +++++++++---
 7 files changed, 410 insertions(+), 269 deletions(-)
 create mode 100644 CMake/DCMTKBuildTreeSettings.cmake.in
 create mode 100644 CMake/DCMTKConfigVersion.cmake.in

diff --git a/CMake/3rdparty.cmake b/CMake/3rdparty.cmake
index ed9e658..abb19f2 100755
--- a/CMake/3rdparty.cmake
+++ b/CMake/3rdparty.cmake
@@ -1,286 +1,292 @@
-IF(WIN32)
+if(WIN32)
 
   # For Windows, we don't used FIND_PACKAGE because DCMTK usually is used with its
   # own set of 3rd-party support libraries that can be downloaded from DCMTK's
   # website (pre-built).
 
   # libxml support: find out whether user has library
-  GET_FILENAME_COMPONENT(LIBXML_DIR "${DCMTK_SOURCE_DIR}/../libxml2-2.7.7" ABSOLUTE)
-  FIND_PATH(WITH_LIBXMLINC "/include/libxml/parser.h" "${LIBXML_DIR}"/ NO_DEFAULT_PATH)
+  get_filename_component(LIBXML_DIR "${DCMTK_SOURCE_DIR}/../libxml2-2.7.7" ABSOLUTE)
+  find_path(WITH_LIBXMLINC "/include/libxml/parser.h" "${LIBXML_DIR}"/ NO_DEFAULT_PATH)
 
   # libpng support: find out whether user has library
-  GET_FILENAME_COMPONENT(LIBPNG_DIR "${DCMTK_SOURCE_DIR}/../libpng-1.4.2" ABSOLUTE)
-  FIND_PATH(WITH_LIBPNGINC "include/png.h" "${LIBPNG_DIR}" NO_DEFAULT_PATH)
+  get_filename_component(LIBPNG_DIR "${DCMTK_SOURCE_DIR}/../libpng-1.4.2" ABSOLUTE)
+  find_path(WITH_LIBPNGINC "include/png.h" "${LIBPNG_DIR}" NO_DEFAULT_PATH)
 
   # libtiff support: find out whether user has library
-  GET_FILENAME_COMPONENT(LIBTIFF_DIR "${DCMTK_SOURCE_DIR}/../tiff-3.9.2" ABSOLUTE)
-  FIND_PATH(WITH_LIBTIFFINC "include/tiff.h" "${LIBTIFF_DIR}" NO_DEFAULT_PATH)
+  get_filename_component(LIBTIFF_DIR "${DCMTK_SOURCE_DIR}/../tiff-3.9.2" ABSOLUTE)
+  find_path(WITH_LIBTIFFINC "include/tiff.h" "${LIBTIFF_DIR}" NO_DEFAULT_PATH)
 
   # OpenSSL support: find out whether user has library
-  GET_FILENAME_COMPONENT(OPENSSL_DIR "${DCMTK_SOURCE_DIR}/../openssl-1.0.0" ABSOLUTE)
-  FIND_PATH(WITH_OPENSSLINC "include/openssl/ssl.h" "${OPENSSL_DIR}" NO_DEFAULT_PATH)
+  get_filename_component(OPENSSL_DIR "${DCMTK_SOURCE_DIR}/../openssl-1.0.0" ABSOLUTE)
+  find_path(WITH_OPENSSLINC "include/openssl/ssl.h" "${OPENSSL_DIR}" NO_DEFAULT_PATH)
 
   # zlib support: find out whether user has library
-  GET_FILENAME_COMPONENT(ZLIB_DIR "${DCMTK_SOURCE_DIR}/../zlib-1.2.5" ABSOLUTE)
-  FIND_PATH(WITH_ZLIBINC "include/zlib.h" "${ZLIB_DIR}" NO_DEFAULT_PATH)
+  get_filename_component(ZLIB_DIR "${DCMTK_SOURCE_DIR}/../zlib-1.2.5" ABSOLUTE)
+  find_path(WITH_ZLIBINC "include/zlib.h" "${ZLIB_DIR}" NO_DEFAULT_PATH)
 
   # sndfile support: find out whether user has library. Needed for module dcmwave (not in public DCMTK yet, marked as advanced)
-  GET_FILENAME_COMPONENT(SNDFILE_DIR "${DCMTK_SOURCE_DIR}/../libsndfile-1.0.17" ABSOLUTE)
-  FIND_PATH(WITH_SNDFILEINC "sndfile.h" "${SNDFILE_DIR}" NO_DEFAULT_PATH)
+  get_filename_component(SNDFILE_DIR "${DCMTK_SOURCE_DIR}/../libsndfile-1.0.17" ABSOLUTE)
+  find_path(WITH_SNDFILEINC "sndfile.h" "${SNDFILE_DIR}" NO_DEFAULT_PATH)
   MARK_AS_ADVANCED(SNDFILE_DIR WITH_SNDFILEINC)
 
   # libiconv support: find out whether user has library
-  GET_FILENAME_COMPONENT(LIBICONV_DIR "${DCMTK_SOURCE_DIR}/../libiconv-1.14" ABSOLUTE)
-  FIND_PATH(WITH_LIBICONVINC "include/iconv.h" "${LIBICONV_DIR}" NO_DEFAULT_PATH)
+  get_filename_component(LIBICONV_DIR "${DCMTK_SOURCE_DIR}/../libiconv-1.14" ABSOLUTE)
+  find_path(WITH_LIBICONVINC "include/iconv.h" "${LIBICONV_DIR}" NO_DEFAULT_PATH)
 
   # libxml support: configure compiler
-  IF(DCMTK_WITH_XML)
-    IF(WITH_LIBXMLINC)
-      SET(LIBXML_INCDIR ${WITH_LIBXMLINC}/include)
-      SET(LIBXML_LIBDIR ${WITH_LIBXMLINC}/lib)
-      SET(LIBXML_LIBS debug ${LIBXML_LIBDIR}/libxml2_d.lib optimized ${LIBXML_LIBDIR}/libxml2_o.lib debug ${LIBXML_LIBDIR}/iconv_d.lib optimized ${LIBXML_LIBDIR}/iconv_o.lib)
-      MESSAGE(STATUS "Info: DCMTK XML support will be enabled")
-      SET(WITH_LIBXML 1)
-    ELSE(WITH_LIBXMLINC) # turn off library if library path not set
-      MESSAGE(STATUS "Warning: XML support will be disabled because libxml2 directory is not specified. Correct path and re-enable DCMTK_WITH_XML.")
-      SET(DCMTK_WITH_XML OFF CACHE BOOL "" FORCE)
-      SET(WITH_LIBXML "")
-    ENDIF(WITH_LIBXMLINC)
-  ENDIF(DCMTK_WITH_XML)
+  if(DCMTK_WITH_XML)
+    if(WITH_LIBXMLINC)
+      set(LIBXML_INCDIR ${WITH_LIBXMLINC}/include)
+      set(LIBXML_LIBDIR ${WITH_LIBXMLINC}/lib)
+      set(LIBXML_LIBS debug ${LIBXML_LIBDIR}/libxml2_d.lib optimized ${LIBXML_LIBDIR}/libxml2_o.lib debug ${LIBXML_LIBDIR}/iconv_d.lib optimized ${LIBXML_LIBDIR}/iconv_o.lib)
+      message(STATUS "Info: DCMTK XML support will be enabled")
+      set(WITH_LIBXML 1)
+    else() # turn off library if library path not set
+      message(STATUS "Warning: XML support will be disabled because libxml2 directory is not specified. Correct path and re-enable DCMTK_WITH_XML.")
+      set(DCMTK_WITH_XML OFF CACHE BOOL "" FORCE)
+      set(WITH_LIBXML "")
+    endif()
+  endif()
 
   # libpng support: configure compiler
-  IF(DCMTK_WITH_PNG)
-    IF(WITH_LIBPNGINC)
-      SET(LIBPNG_INCDIR ${WITH_LIBPNGINC}/include)
-      SET(LIBPNG_LIBDIR ${WITH_LIBPNGINC}/lib)
-      SET(LIBPNG_LIBS debug ${LIBPNG_LIBDIR}/libpng_d.lib optimized ${LIBPNG_LIBDIR}/libpng_o.lib)
-      MESSAGE(STATUS "Info: DCMTK PNG support will be enabled")
-      SET(WITH_LIBPNG 1)
-    ELSE(WITH_LIBPNGINC) # turn off library if library path not set
-      MESSAGE(STATUS "Warning: PNG support will be disabled because libpng directory was not specified. Correct path and re-enable DCMTK_WITH_PNG.")
-      SET(DCMTK_WITH_PNG OFF CACHE BOOL "" FORCE)
-      SET(WITH_LIBPNG "")
-    ENDIF(WITH_LIBPNGINC)
-  ENDIF(DCMTK_WITH_PNG)
+  if(DCMTK_WITH_PNG)
+    if(WITH_LIBPNGINC)
+      set(LIBPNG_INCDIR ${WITH_LIBPNGINC}/include)
+      set(LIBPNG_LIBDIR ${WITH_LIBPNGINC}/lib)
+      set(LIBPNG_LIBS debug ${LIBPNG_LIBDIR}/libpng_d.lib optimized ${LIBPNG_LIBDIR}/libpng_o.lib)
+      message(STATUS "Info: DCMTK PNG support will be enabled")
+      set(WITH_LIBPNG 1)
+    else() # turn off library if library path not set
+      message(STATUS "Warning: PNG support will be disabled because libpng directory was not specified. Correct path and re-enable DCMTK_WITH_PNG.")
+      set(DCMTK_WITH_PNG OFF CACHE BOOL "" FORCE)
+      set(WITH_LIBPNG "")
+    endif()
+  endif()
 
   # libtiff support: configure compiler
-  IF(DCMTK_WITH_TIFF)
-    IF(WITH_LIBTIFFINC)
-      SET(LIBTIFF_INCDIR ${WITH_LIBTIFFINC}/include)
-      SET(LIBTIFF_LIBDIR ${WITH_LIBTIFFINC}/lib)
-      SET(LIBTIFF_LIBS debug ${LIBTIFF_LIBDIR}/libtiff_d.lib optimized ${LIBTIFF_LIBDIR}/libtiff_o.lib)
-      MESSAGE(STATUS "Info: DCMTK TIFF support will be enabled")
-      SET(WITH_LIBTIFF 1)
-    ELSE(WITH_LIBTIFFINC) # turn off library if library path not set
-      MESSAGE(STATUS "Warning: TIFF support will be disabled because libtiff directory was not specified. Correct path and re-enable DCMTK_WITH_TIFF.")
-      SET(DCMTK_WITH_TIFF OFF CACHE BOOL "" FORCE)
-      SET(WITH_LIBTIFF "")
-    ENDIF(WITH_LIBTIFFINC)
-  ENDIF(DCMTK_WITH_TIFF)
+  if(DCMTK_WITH_TIFF)
+    if(WITH_LIBTIFFINC)
+      set(LIBTIFF_INCDIR ${WITH_LIBTIFFINC}/include)
+      set(LIBTIFF_LIBDIR ${WITH_LIBTIFFINC}/lib)
+      set(LIBTIFF_LIBS debug ${LIBTIFF_LIBDIR}/libtiff_d.lib optimized ${LIBTIFF_LIBDIR}/libtiff_o.lib)
+      message(STATUS "Info: DCMTK TIFF support will be enabled")
+      set(WITH_LIBTIFF 1)
+    else() # turn off library if library path not set
+      message(STATUS "Warning: TIFF support will be disabled because libtiff directory was not specified. Correct path and re-enable DCMTK_WITH_TIFF.")
+      set(DCMTK_WITH_TIFF OFF CACHE BOOL "" FORCE)
+      set(WITH_LIBTIFF "")
+    endif()
+  endif()
 
   # OpenSSL support: configure compiler
-  IF(DCMTK_WITH_OPENSSL)
-    IF(WITH_OPENSSLINC)
-      SET(OPENSSL_BINDIR ${WITH_OPENSSLINC}/bin)
-      SET(OPENSSL_INCDIR ${WITH_OPENSSLINC}/include)
-      SET(OPENSSL_LIBDIR ${WITH_OPENSSLINC}/lib)
-      SET(OPENSSL_LIBS debug ${OPENSSL_LIBDIR}/dcmtkssl_d.lib optimized ${OPENSSL_LIBDIR}/dcmtkssl_o.lib debug ${OPENSSL_LIBDIR}/dcmtkeay_d.lib optimized ${OPENSSL_LIBDIR}/dcmtkeay_o.lib)
-      MESSAGE(STATUS "Info: DCMTK OPENSSL support will be enabled")
-      SET(WITH_OPENSSL 1)
-    ELSE(WITH_OPENSSLINC) # turn off library if library path not set
-      MESSAGE(STATUS "Warning: OPENSSL support will be disabled because openssl directory was not specified. Correct path and re-enable DCMTK_WITH_OPENSSL.")
-      SET(DCMTK_WITH_OPENSSL OFF CACHE BOOL "" FORCE)
-      SET(WITH_OPENSSL "")
-    ENDIF(WITH_OPENSSLINC)
-  ENDIF(DCMTK_WITH_OPENSSL)
+  if(DCMTK_WITH_OPENSSL)
+    if(WITH_OPENSSLINC)
+      set(OPENSSL_BINDIR ${WITH_OPENSSLINC}/bin)
+      set(OPENSSL_INCDIR ${WITH_OPENSSLINC}/include)
+      set(OPENSSL_LIBDIR ${WITH_OPENSSLINC}/lib)
+      set(OPENSSL_LIBS debug ${OPENSSL_LIBDIR}/dcmtkssl_d.lib optimized ${OPENSSL_LIBDIR}/dcmtkssl_o.lib debug ${OPENSSL_LIBDIR}/dcmtkeay_d.lib optimized ${OPENSSL_LIBDIR}/dcmtkeay_o.lib)
+      message(STATUS "Info: DCMTK OPENSSL support will be enabled")
+      set(WITH_OPENSSL 1)
+    else() # turn off library if library path not set
+      message(STATUS "Warning: OPENSSL support will be disabled because openssl directory was not specified. Correct path and re-enable DCMTK_WITH_OPENSSL.")
+      set(DCMTK_WITH_OPENSSL OFF CACHE BOOL "" FORCE)
+      set(WITH_OPENSSL "")
+    endif()
+  endif()
 
   # zlib support: configure compiler
-  IF(DCMTK_WITH_ZLIB)
-    IF(WITH_ZLIBINC)
-      SET(ZLIB_INCDIR ${WITH_ZLIBINC}/include)
-      SET(ZLIB_LIBDIR ${WITH_ZLIBINC}/lib)
-      SET(ZLIB_LIBS debug ${ZLIB_LIBDIR}/zlib_d.lib optimized ${ZLIB_LIBDIR}/zlib_o.lib)
-      MESSAGE(STATUS "Info: DCMTK ZLIB support will be enabled")
-      SET(WITH_ZLIB 1)
-    ELSE(WITH_ZLIBINC) # turn off library if library path not set
-      MESSAGE(STATUS "Warning: ZLIB support will be disabled because zlib directory was not specified. Correct path and re-enable DCMTK_WITH_ZLIB.")
-      SET(DCMTK_WITH_ZLIB OFF CACHE BOOL "" FORCE)
-      SET(WITH_ZLIB "")
-    ENDIF(WITH_ZLIBINC)
-  ENDIF(DCMTK_WITH_ZLIB)
+  if(DCMTK_WITH_ZLIB)
+    if(WITH_ZLIBINC)
+      set(ZLIB_INCDIR ${WITH_ZLIBINC}/include)
+      set(ZLIB_LIBDIR ${WITH_ZLIBINC}/lib)
+      set(ZLIB_LIBS debug ${ZLIB_LIBDIR}/zlib_d.lib optimized ${ZLIB_LIBDIR}/zlib_o.lib)
+      message(STATUS "Info: DCMTK ZLIB support will be enabled")
+      set(WITH_ZLIB 1)
+    else() # turn off library if library path not set
+      message(STATUS "Warning: ZLIB support will be disabled because zlib directory was not specified. Correct path and re-enable DCMTK_WITH_ZLIB.")
+      set(DCMTK_WITH_ZLIB OFF CACHE BOOL "" FORCE)
+      set(WITH_ZLIB "")
+    endif()
+  endif()
 
   # sndfile support: configure compiler
-  IF(DCMTK_WITH_SNDFILE)
-    IF(WITH_SNDFILEINC)
-      SET(SNDFILE_INCDIR ${WITH_SNDFILEINC}/include)
-      SET(SNDFILE_LIBDIR ${WITH_SNDFILEINC}/lib)
-      SET(SNDFILE_LIBS debug ${SNDFILE_LIBDIR}/libsndfile_d.lib optimized ${SNDFILE_LIBDIR}/libsndfile_o.lib)
-      MESSAGE(STATUS "Info: DCMTK SNDFILE support will be enabled")
-      SET(WITH_SNDFILE 1)
-    ELSE(WITH_SNDFILEINC) # turn off library if library path not set
-      MESSAGE(STATUS "Warning: SNDFILE support will be disabled because libsndfile directory was not specified. Correct path and re-enable DCMTK_WITH_SNDFILE.")
-      SET(DCMTK_WITH_SNDFILE OFF CACHE BOOL "" FORCE)
-      SET(WITH_SNDFILE "")
-    ENDIF(WITH_SNDFILEINC)
-  ENDIF(DCMTK_WITH_SNDFILE)
+  if(DCMTK_WITH_SNDFILE)
+    if(WITH_SNDFILEINC)
+      set(SNDFILE_INCDIR ${WITH_SNDFILEINC}/include)
+      set(SNDFILE_LIBDIR ${WITH_SNDFILEINC}/lib)
+      set(SNDFILE_LIBS debug ${SNDFILE_LIBDIR}/libsndfile_d.lib optimized ${SNDFILE_LIBDIR}/libsndfile_o.lib)
+      message(STATUS "Info: DCMTK SNDFILE support will be enabled")
+      set(WITH_SNDFILE 1)
+    else() # turn off library if library path not set
+      message(STATUS "Warning: SNDFILE support will be disabled because libsndfile directory was not specified. Correct path and re-enable DCMTK_WITH_SNDFILE.")
+      set(DCMTK_WITH_SNDFILE OFF CACHE BOOL "" FORCE)
+      set(WITH_SNDFILE "")
+    endif()
+  endif()
 
   # libiconv support: configure compiler
-  IF(DCMTK_WITH_ICONV)
-    IF(WITH_LIBICONVINC)
-      SET(LIBICONV_INCDIR ${WITH_LIBICONVINC}/include)
-      SET(LIBICONV_LIBDIR ${WITH_LIBICONVINC}/lib)
-      SET(LIBICONV_LIBS debug ${LIBICONV_LIBDIR}/libiconv_d.lib optimized ${LIBICONV_LIBDIR}/libiconv_o.lib)
-      MESSAGE(STATUS "Info: DCMTK ICONV support will be enabled")
-      SET(WITH_LIBICONV 1)
-    ELSE(WITH_LIBICONVINC) # turn off library if library path not set
-      MESSAGE(STATUS "Warning: ICONV support will be disabled because libiconv directory was not specified. Correct path and re-enable DCMTK_WITH_ICONV.")
-      SET(DCMTK_WITH_ICONV OFF CACHE BOOL "" FORCE)
-      SET(WITH_LIBICONV "")
-    ENDIF(WITH_LIBICONVINC)
-  ENDIF(DCMTK_WITH_ICONV)
+  if(DCMTK_WITH_ICONV)
+    if(WITH_LIBICONVINC)
+      set(LIBICONV_INCDIR ${WITH_LIBICONVINC}/include)
+      set(LIBICONV_LIBDIR ${WITH_LIBICONVINC}/lib)
+      set(LIBICONV_LIBS debug ${LIBICONV_LIBDIR}/libiconv_d.lib optimized ${LIBICONV_LIBDIR}/libiconv_o.lib)
+      message(STATUS "Info: DCMTK ICONV support will be enabled")
+      set(WITH_LIBICONV 1)
+    else() # turn off library if library path not set
+      message(STATUS "Warning: ICONV support will be disabled because libiconv directory was not specified. Correct path and re-enable DCMTK_WITH_ICONV.")
+      set(DCMTK_WITH_ICONV OFF CACHE BOOL "" FORCE)
+      set(WITH_LIBICONV "")
+    endif()
+  endif()
 
-ELSE(WIN32)
+else()
 
   # Find TIFF
-  IF(DCMTK_WITH_TIFF)
-    FIND_PACKAGE(TIFF)
-    INCLUDE_DIRECTORIES(${TIFF_INCLUDE_DIR})
-    SET(LIBTIFF_LIBS ${TIFF_LIBRARY})
+  if(DCMTK_WITH_TIFF)
+    find_package(TIFF)
+    message("TIFF_FOUND=${TIFF_FOUND} TIFF_LIBRARY=${TIFF_LIBRARY}")
+    find_package(JPEG)
+    message("JPEG_FOUND=${JPEG_FOUND} JPEG_LIBRARY=${JPEG_LIBRARY}")
     # turn off library if it could not be found
-    IF(NOT LIBTIFF_LIBS)
-      MESSAGE(STATUS "Warning: TIFF support will be disabled because libtiff was not found.")
-      SET(DCMTK_WITH_TIFF OFF CACHE BOOL "" FORCE)
-      SET(WITH_LIBTIFF "")
-    ELSE(NOT LIBTIFF_LIBS)
-      MESSAGE(STATUS "Info: DCMTK TIFF support will be enabled")
-      SET(WITH_LIBTIFF 1)
-    ENDIF(NOT LIBTIFF_LIBS)
-  ENDIF(DCMTK_WITH_TIFF)
+    if(NOT TIFF_FOUND OR NOT JPEG_FOUND)
+      if(NOT TIFF_FOUND)
+        message(STATUS "Warning: TIFF support will be disabled because libtiff was not found.")
+      else()
+        message(STATUS "Warning: TIFF support will be disabled because libjpeg was not found.")
+      endif()
+      set(DCMTK_WITH_TIFF OFF CACHE BOOL "" FORCE)
+      set(WITH_LIBTIFF "")
+    else()
+      message(STATUS "Info: DCMTK TIFF support will be enabled")
+      set(WITH_LIBTIFF 1)
+      include_directories(${TIFF_INCLUDE_DIR})
+      set(LIBTIFF_LIBS ${TIFF_LIBRARY} ${JPEG_LIBRARY})
+    endif()
+  endif()
 
   # Find PNG
-  IF(DCMTK_WITH_PNG)
-    FIND_PACKAGE(PNG)
-    INCLUDE_DIRECTORIES(${PNG_INCLUDE_DIR})
-    SET(LIBPNG_LIBS ${PNG_LIBRARY})
-    IF(NOT LIBPNG_LIBS)
-      SET(DCMTK_WITH_PNG OFF CACHE BOOL "" FORCE)
-      MESSAGE(STATUS "Warning: PNG support will be disabled because libpng was not found.")
-      SET(WITH_LIBPNG "")
-    ELSE(NOT LIBPNG_LIBS)
-      MESSAGE(STATUS "Info: DCMTK PNG support will be enabled")
-      SET(WITH_LIBPNG 1)
-    ENDIF(NOT LIBPNG_LIBS)
-  ENDIF(DCMTK_WITH_PNG)
+  if(DCMTK_WITH_PNG)
+    find_package(PNG QUIET)
+    if(NOT PNG_FOUND)
+      set(DCMTK_WITH_PNG OFF CACHE BOOL "" FORCE)
+      message(STATUS "Warning: PNG support will be disabled because libpng was not found.")
+      set(WITH_LIBPNG "")
+    else()
+      message(STATUS "Info: DCMTK PNG support will be enabled")
+      set(WITH_LIBPNG 1)
+      include_directories(${PNG_INCLUDE_DIR})
+      set(LIBPNG_LIBS ${PNG_LIBRARY})
+    endif()
+  endif()
 
   # Find OpenSSL
-  IF(DCMTK_WITH_OPENSSL)
-    FIND_PACKAGE(OpenSSL)
-    INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
-    SET(OPENSSL_LIBS ${OPENSSL_LIBRARIES})
-    IF(NOT OPENSSL_LIBS)
-      MESSAGE(STATUS "Warning: OPENSSL support will be disabled because openssl was not found.")
-      SET(WITH_OPENSSL "")
-      SET(DCMTK_WITH_OPENSSL OFF CACHE BOOL "" FORCE)
-    ELSE(NOT OPENSSL_LIBS)
-      MESSAGE(STATUS "Info: DCMTK OPENSSL support will be enabled")
-      SET(WITH_OPENSSL 1)
-    ENDIF(NOT OPENSSL_LIBS)
-  ENDIF(DCMTK_WITH_OPENSSL)
+  if(DCMTK_WITH_OPENSSL)
+    find_package(OpenSSL QUIET)
+    if(NOT OPENSSL_FOUND)
+      message(STATUS "Warning: OPENSSL support will be disabled because openssl was not found.")
+      set(WITH_OPENSSL "")
+      set(DCMTK_WITH_OPENSSL OFF CACHE BOOL "" FORCE)
+    else()
+      message(STATUS "Info: DCMTK OPENSSL support will be enabled")
+      set(WITH_OPENSSL 1)
+      include_directories(${OPENSSL_INCLUDE_DIR})
+      set(OPENSSL_LIBS ${OPENSSL_LIBRARIES})
+    endif()
+  endif()
 
   # Find libXML2
-  IF(DCMTK_WITH_XML)
-    FIND_PACKAGE(LibXml2)
-    INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR})
-    SET(LIBXML_LIBS ${LIBXML2_LIBRARIES})
-    IF(NOT LIBXML_LIBS)
-      MESSAGE(STATUS "Warning: XML support will be disabled because libxml2 was not found.")
-      SET(WITH_LIBXML "")
-      SET(DCMTK_WITH_XML OFF CACHE BOOL "" FORCE)
-    ELSE(NOT LIBXML_LIBS)
-      MESSAGE(STATUS "Info: DCMTK XML support will be enabled")
-      SET(WITH_LIBXML 1)
-    ENDIF(NOT LIBXML_LIBS)
-  ENDIF(DCMTK_WITH_XML)
+  if(DCMTK_WITH_XML)
+    find_package(LibXml2 QUIET)
+    if(NOT LIBXML2_FOUND)
+      message(STATUS "Warning: XML support will be disabled because libxml2 was not found.")
+      set(WITH_LIBXML "")
+      set(DCMTK_WITH_XML OFF CACHE BOOL "" FORCE)
+    else()
+      message(STATUS "Info: DCMTK XML support will be enabled")
+      set(WITH_LIBXML 1)
+      include_directories(${LIBXML2_INCLUDE_DIR})
+      set(LIBXML_LIBS ${LIBXML2_LIBRARIES})
+    endif()
+  endif()
 
   # Find zlib
-  IF(DCMTK_WITH_ZLIB)
-    FIND_PACKAGE(ZLIB)
-    INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIRS})
-    SET(ZLIB_LIBS ${ZLIB_LIBRARIES})
-    IF(NOT ZLIB_LIBS)
-      MESSAGE(STATUS "Warning: ZLIB support will be disabled because zlib was not found.")
-      SET(WITH_ZLIB "")
-      SET(DCMTK_WITH_ZLIB OFF CACHE BOOL "" FORCE)
-    ELSE(NOT ZLIB_LIBS)
-      MESSAGE(STATUS "Info: DCMTK ZLIB support will be enabled")
-      SET(WITH_ZLIB 1)
-    ENDIF(NOT ZLIB_LIBS)
-  ENDIF(DCMTK_WITH_ZLIB)
+  if(DCMTK_WITH_ZLIB)
+    find_package(ZLIB QUIET)
+    if(NOT ZLIB_FOUND)
+      message(STATUS "Warning: ZLIB support will be disabled because zlib was not found.")
+      set(WITH_ZLIB "")
+      set(DCMTK_WITH_ZLIB OFF CACHE BOOL "" FORCE)
+    else()
+      message(STATUS "Info: DCMTK ZLIB support will be enabled")
+      set(WITH_ZLIB 1)
+      include_directories(${ZLIB_INCLUDE_DIRS})
+      set(ZLIB_LIBS ${ZLIB_LIBRARIES})
+    endif()
+  endif()
 
   # Find libsndfile
-  IF(DCMTK_WITH_SNDFILE)
-    FIND_PACKAGE(Sndfile)
-    INCLUDE_DIRECTORIES(${SNDFILE_INCLUDE_DIRS})
-    SET(SNDFILE_LIBS ${SNDFILE_LIBRARIES})
-    IF(NOT SNDFILE_LIBS)
-      MESSAGE(STATUS "Warning: SNDFILE support will be disabled because libsndfile was not found.")
-      SET(WITH_SNDFILE "")
-      SET(DCMTK_WITH_SNDFILE OFF CACHE BOOL "" FORCE)
-    ELSE(NOT SNDFILE_LIBS)
-      MESSAGE(STATUS "Info: DCMTK SNDFILE support will be enabled")
-      SET(WITH_SNDFILE 1)
-    ENDIF(NOT SNDFILE_LIBS)
-  ENDIF(DCMTK_WITH_SNDFILE)
+  if(DCMTK_WITH_SNDFILE)
+    find_package(Sndfile QUIET)
+    if(NOT SNDFILE_LIBS)
+      message(STATUS "Warning: SNDFILE support will be disabled because libsndfile was not found.")
+      set(WITH_SNDFILE "")
+      set(DCMTK_WITH_SNDFILE OFF CACHE BOOL "" FORCE)
+    else()
+      message(STATUS "Info: DCMTK SNDFILE support will be enabled")
+      set(WITH_SNDFILE 1)
+      include_directories(${SNDFILE_INCLUDE_DIRS})
+      set(SNDFILE_LIBS ${SNDFILE_LIBRARIES})
+    endif()
+  endif()
 
   # Find libiconv
-  IF(DCMTK_WITH_ICONV)
-    FIND_PACKAGE(ICONV)
-    FIND_PACKAGE(Charset)
-
-    IF(LIBICONV_FOUND AND LIBCHARSET_FOUND)
-      MESSAGE(STATUS "Info: DCMTK ICONV support will be enabled")
-      SET(WITH_LIBICONV 1)
-      SET(LIBICONV_INCDIR ${LIBICONV_INCLUDE_DIRS} ${LIBCHARSET_INCLUDE_DIRS})
-      SET(LIBICONV_LIBDIR ${LIBICONV_LIBDIR})
-      SET(LIBICONV_LIBS ${LIBICONV_LIBRARIES} ${LIBCHARSET_LIBRARY})
-      INCLUDE_DIRECTORIES(${LIBICONV_INCDIR})
-    ELSE(LIBICONV_FOUND AND LIBCHARSET_FOUND)
-      MESSAGE(STATUS "Warning: ICONV support will be disabled because libiconv was not found. Correct LIBICONV_LIBDIR and LIBICONV_INCLUDE_DIR and re-enable DCMTK_WITH_ICONV.")
-      SET(DCMTK_WITH_ICONV OFF CACHE BOOL "" FORCE)
-      SET(WITH_LIBICONV "")
-    ENDIF(LIBICONV_FOUND AND LIBCHARSET_FOUND)
-  ENDIF(DCMTK_WITH_ICONV)
+  if(DCMTK_WITH_ICONV)
+    find_package(ICONV QUIET)
+    find_package(Charset QUIET)
+    if(NOT LIBICONV_FOUND OR NOT LIBCHARSET_FOUND)
+      message(STATUS "Warning: ICONV support will be disabled because libiconv was not found. Correct LIBICONV_LIBDIR and LIBICONV_INCLUDE_DIR and re-enable DCMTK_WITH_ICONV.")
+      set(DCMTK_WITH_ICONV OFF CACHE BOOL "" FORCE)
+      set(WITH_LIBICONV "")
+    else()
+      message(STATUS "Info: DCMTK ICONV support will be enabled")
+      set(WITH_LIBICONV 1)
+      set(LIBICONV_INCDIR ${LIBICONV_INCLUDE_DIRS} ${LIBCHARSET_INCLUDE_DIRS})
+      set(LIBICONV_LIBDIR ${LIBICONV_LIBDIR})
+      set(LIBICONV_LIBS ${LIBICONV_LIBRARIES} ${LIBCHARSET_LIBRARY})
+      include_directories(${LIBICONV_INCDIR})
+    endif()
+  endif()
 
   # Find libwrap
-  IF(DCMTK_WITH_WRAP)
-    FIND_PACKAGE(Wrap)
-    INCLUDE_DIRECTORIES(${WRAP_INCLUDE_DIRS})
-    SET(WRAP_LIBS ${WRAP_LIBRARIES})
-    IF(NOT WRAP_LIBS)
-      MESSAGE(STATUS "Warning: WRAP support will be disabled because libwrap was not found.")
-      SET(WITH_TCPWRAPPER "")
-      SET(DCMTK_WITH_WRAP OFF CACHE BOOL "" FORCE)
-    ELSE(NOT WRAP_LIBS)
-      MESSAGE(STATUS "Info: DCMTK WRAP support will be enabled")
-      SET(WITH_TCPWRAPPER 1)
-    ENDIF(NOT WRAP_LIBS)
-  ENDIF(DCMTK_WITH_WRAP)
+  if(DCMTK_WITH_WRAP)
+    find_package(Wrap QUIET)
+    if(NOT WRAP_FOUND)
+      message(STATUS "Warning: WRAP support will be disabled because libwrap was not found.")
+      set(WITH_TCPWRAPPER "")
+      set(DCMTK_WITH_WRAP OFF CACHE BOOL "" FORCE)
+    else()
+      message(STATUS "Info: DCMTK WRAP support will be enabled")
+      set(WITH_TCPWRAPPER 1)
+      include_directories(${WRAP_INCLUDE_DIRS})
+      set(WRAP_LIBS ${WRAP_LIBRARIES})
+    endif()
+  endif()
 
-ENDIF(WIN32)
+endif()
 
 # Find doxygen
-IF(DCMTK_WITH_DOXYGEN)
-  FIND_PACKAGE(Doxygen) # will set variable DOXYGEN_EXECUTABLE
-  IF(NOT DOXYGEN_EXECUTABLE)
-    MESSAGE(STATUS "Warning: DOXYGEN support will be disabled because doxygen was not found.")
-    SET(DCMTK_WITH_DOXYGEN OFF CACHE BOOL "" FORCE)
-  ENDIF(NOT DOXYGEN_EXECUTABLE)
-ENDIF(DCMTK_WITH_DOXYGEN)
+if(DCMTK_WITH_DOXYGEN)
+  find_package(Doxygen) # will set variable DOXYGEN_EXECUTABLE
+  if(NOT DOXYGEN_FOUND)
+    message(STATUS "Warning: DOXYGEN support will be disabled because doxygen was not found.")
+    set(DCMTK_WITH_DOXYGEN OFF CACHE BOOL "" FORCE)
+  endif()
+endif()
 
-IF(DCMTK_WITH_ICONV)
-  INCLUDE(CheckCXXSourceCompiles)
-  SET(CMAKE_REQUIRED_INCLUDES ${LIBICONV_INCDIR})
-  SET(CMAKE_REQUIRED_LIBRARIES ${LIBICONV_LIBS})
+if(DCMTK_WITH_ICONV)
+  include(CheckCXXSourceCompiles)
+  set(CMAKE_REQUIRED_INCLUDES ${LIBICONV_INCDIR})
+  set(CMAKE_REQUIRED_LIBRARIES ${LIBICONV_LIBS})
   CHECK_CXX_SOURCE_COMPILES("
   #include <iconv.h>
   int main() {
@@ -289,6 +295,6 @@ IF(DCMTK_WITH_ICONV)
     iconv(cd, &in, 0, 0, 0);
     return 0;
   }" LIBICONV_SECOND_ARGUMENT_CONST)
-  SET(CMAKE_REQUIRED_INCLUDES)
-  SET(CMAKE_REQUIRED_LIBRARIES)
-ENDIF(DCMTK_WITH_ICONV)
+  set(CMAKE_REQUIRED_INCLUDES)
+  set(CMAKE_REQUIRED_LIBRARIES)
+endif()
diff --git a/CMake/DCMTKBuildTreeSettings.cmake.in b/CMake/DCMTKBuildTreeSettings.cmake.in
new file mode 100644
index 0000000..7026128
--- /dev/null
+++ b/CMake/DCMTKBuildTreeSettings.cmake.in
@@ -0,0 +1,2 @@
+set(DCMTK_INCLUDE_DIRS
+  "@DCMTK_INCLUDE_DIR@")
diff --git a/CMake/DCMTKConfig.cmake.in b/CMake/DCMTKConfig.cmake.in
index 99a1ea6..dbadc32 100644
--- a/CMake/DCMTKConfig.cmake.in
+++ b/CMake/DCMTKConfig.cmake.in
@@ -26,3 +26,33 @@ SET(DCMTK_SINGLE_SHARED_LIBRARY @BUILD_SINGLE_SHARED_LIBRARY@)
 SET(DCMTK_OVERWRITE_WIN32_COMPILER_FLAGS @DCMTK_OVERWRITE_WIN32_COMPILER_FLAGS@)
 SET(DCMTK_WIDE_CHAR_FILE_IO_FUNCTIONS @DCMTK_WIDE_CHAR_FILE_IO_FUNCTIONS@)
 SET(DCMTK_WIDE_CHAR_MAIN_FUNCTION @DCMTK_WIDE_CHAR_MAIN_FUNCTION@)
+
+get_filename_component(DCMTK_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
+
+set(DCMTK_INCLUDE_DIR_LIST "@DCMTK_MODULES_W_INCLUDE@")
+
+@DCMTKCONFIG_INCLUDE_DIR_CODE@
+
+include("${DCMTK_CMAKE_DIR}/DCMTKLibraryDepends.cmake")
+
+set(DCMTK_LIBRARIES charls
+dcmimage
+dcmjpls
+dcmqrdb
+dcmtls
+ijg12
+oflog
+dcmdata
+dcmimgle
+dcmnet
+dcmrt
+dcmwlm
+ijg16
+ofstd
+dcmdsig
+dcmjpeg
+dcmpstat
+dcmsr
+i2d
+ijg8
+)
diff --git a/CMake/DCMTKConfigVersion.cmake.in b/CMake/DCMTKConfigVersion.cmake.in
new file mode 100644
index 0000000..5d53321
--- /dev/null
+++ b/CMake/DCMTKConfigVersion.cmake.in
@@ -0,0 +1,11 @@
+set(PACKAGE_VERSION "@DCMTK_MAJOR_VERSION@.@DCMTK_MINOR_VERSION@.@DCMTK_BUILD_VERSION@")
+
+# Check whether the requested PACKAGE_FIND_VERSION is compatible
+if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}")
+  set(PACKAGE_VERSION_COMPATIBLE FALSE)
+else()
+  set(PACKAGE_VERSION_COMPATIBLE TRUE)
+  if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}")
+    set(PACKAGE_VERSION_EXACT TRUE)
+  endif()
+endif()
diff --git a/CMake/dcmtkMacros.cmake b/CMake/dcmtkMacros.cmake
index 1a3c772..57d14fe 100644
--- a/CMake/dcmtkMacros.cmake
+++ b/CMake/dcmtkMacros.cmake
@@ -62,10 +62,10 @@ MACRO(DCMTK_ADD_LIBRARY LIBRARY)
     IF(NOT BUILD_SINGLE_SHARED_LIBRARY)
         # Declare installation files
         INSTALL(TARGETS ${LIBRARY}${DCMTK_LIBRARY_SUFFIX}
-                COMPONENT lib
-                RUNTIME DESTINATION ${DCMTK_INSTALL_BINDIR}
-                LIBRARY DESTINATION ${DCMTK_INSTALL_LIBDIR}
-                ARCHIVE DESTINATION ${DCMTK_INSTALL_LIBDIR})
+          EXPORT DCMTKLibraryDepends
+          RUNTIME DESTINATION ${INSTALL_BIN_DIR} COMPONENT bin
+          LIBRARY DESTINATION ${INSTALL_LIB_DIR}/lib COMPONENT shlib
+          ARCHIVE DESTINATION ${INSTALL_LIB_DIR}/lib COMPONENT lib)
     ENDIF(NOT BUILD_SINGLE_SHARED_LIBRARY)
 ENDMACRO(DCMTK_ADD_LIBRARY)
 
diff --git a/CMake/dcmtkPrepare.cmake b/CMake/dcmtkPrepare.cmake
index d36e935..09ffb12 100644
--- a/CMake/dcmtkPrepare.cmake
+++ b/CMake/dcmtkPrepare.cmake
@@ -13,6 +13,14 @@ IF(CMAKE_BACKWARDS_COMPATIBILITY GREATER 2.8.10)
   SET(CMAKE_BACKWARDS_COMPATIBILITY 2.8.10 CACHE STRING "Latest version of CMake when this project was released." FORCE)
 ENDIF(CMAKE_BACKWARDS_COMPATIBILITY GREATER 2.8.10)
 
+# make sure CMAKE_BUILD_TYPE has a value. default to release
+if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+  message(STATUS "Setting build type to 'Release' as none was specified.")
+  set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
+  # Set the possible values of build type for cmake-gui
+  set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
+endif()
+
 # Basic version information
 # (Starting with version 3.5.5, an odd number at the last position indicates
 #  a development snapshot and an even number indicates an official release.)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index db1e219..a1c7af0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -12,50 +12,78 @@ INCLUDE(CMake/dcmtkPrepare.cmake NO_POLICY_SCOPE)
 #-----------------------------------------------------------------------------
 
 # Modules to be built
-SET(DCMTK_MODULES config ofstd oflog dcmdata dcmimgle dcmimage dcmjpeg dcmjpls dcmtls dcmnet dcmsr dcmsign dcmwlm dcmqrdb dcmpstat dcmrt doxygen
-    CACHE STRING "List of modules that should be built.")
-MARK_AS_ADVANCED(DCMTK_MODULES)
+SET(DCMTK_LIBS ofstd oflog dcmdata dcmimgle
+  dcmimage dcmjpeg dcmjpls dcmtls dcmnet dcmsr
+  dcmsign dcmwlm dcmqrdb dcmpstat dcmrt)
+
+SET(DCMTK_MODULES config doxygen ofstd oflog dcmdata dcmimgle
+  dcmimage dcmjpeg dcmjpls dcmtls dcmnet dcmsr
+  dcmsign dcmwlm dcmqrdb dcmpstat dcmrt)
+
+set(DCMTK_LIBRARIES ${DCMTK_LIBS} ijg8 ijg12 ijg16 charls dcmdsig)
 
 #-----------------------------------------------------------------------------
 # Include directories
 #-----------------------------------------------------------------------------
-
-SET(DCMTK_INCLUDE_DIR
-  ${DCMTK_BINARY_DIR}/config/include
-  ${DCMTK_SOURCE_DIR}/ofstd/include
-  ${DCMTK_SOURCE_DIR}/oflog/include
-  ${DCMTK_SOURCE_DIR}/dcmdata/include
-  ${DCMTK_SOURCE_DIR}/dcmimgle/include
-  ${DCMTK_SOURCE_DIR}/dcmimage/include
-  ${DCMTK_SOURCE_DIR}/dcmjpeg/libijg8
-  ${DCMTK_SOURCE_DIR}/dcmjpeg/libijg12
-  ${DCMTK_SOURCE_DIR}/dcmjpeg/libijg16
-  ${DCMTK_SOURCE_DIR}/dcmjpeg/include
-  ${DCMTK_SOURCE_DIR}/dcmjpls/include
-  ${DCMTK_SOURCE_DIR}/dcmnet/include
-  ${DCMTK_SOURCE_DIR}/dcmpstat/include
-  ${DCMTK_SOURCE_DIR}/dcmqrdb/include
-  ${DCMTK_SOURCE_DIR}/dcmsign/include
-  ${DCMTK_SOURCE_DIR}/dcmsr/include
-  ${DCMTK_SOURCE_DIR}/dcmtls/include
-  ${DCMTK_SOURCE_DIR}/dcmwlm/include
+set(DCMTK_MODULES_W_INCLUDE
+  config
+  ofstd
+  oflog
+  dcmdata
+  dcmimgle
+  dcmimage
+  dcmjpeg
+  dcmjpeg
+  dcmjpeg
+  dcmjpeg
+  dcmjpls
+  dcmnet
+  dcmpstat
+  dcmqrdb
+  dcmsign
+  dcmsr
+  dcmtls
+  dcmwlm
 )
+
+SET(DCMTK_INCLUDE_DIR)
+foreach(inc ${DCMTK_MODULES_W_INCLUDE})
+  if(inc STREQUAL config)
+    list(APPEND DCMTK_INCLUDE_DIR ${DCMTK_BINARY_DIR}/config/include)
+  else()
+    list(APPEND DCMTK_INCLUDE_DIR ${DCMTK_SOURCE_DIR}/${inc}/include)
+  endif()
+endforeach()
+
 INCLUDE_DIRECTORIES(${DCMTK_INCLUDE_DIR})
 
+# set paths for install -- empty initially
+# Offer the user the choice of overriding the installation directories
+set(INSTALL_BIN_DIR CACHE PATH "Installation directory for libraries")
+set(INSTALL_LIB_DIR CACHE PATH "Installation directory for libraries")
+set(INSTALL_INCLUDE_DIR CACHE PATH "Installation directory for include")
+# set suffix for CMake files used for packaging
+if(WIN32 AND NOT CYGWIN)
+  set(INSTALL_CMAKE_DIR cmake)
+else()
+  set(INSTALL_CMAKE_DIR lib/cmake/dcmtk)
+endif()
+
+# Make relative paths absolute (needed later)
+foreach(p LIB BIN INCLUDE CMAKE)
+  set(var INSTALL_${p}_DIR)
+  if(NOT IS_ABSOLUTE "${${var}}")
+    set(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}")
+  endif()
+endforeach()
+
 #-----------------------------------------------------------------------------
 # Prepare osconfig.h
 #-----------------------------------------------------------------------------
 
 # add the osconfig.h.in file
 CONFIGURE_FILE(${DCMTK_SOURCE_DIR}/CMake/osconfig.h.in
-               ${DCMTK_BINARY_DIR}/config/include/dcmtk/config/osconfig.h)
-
-#-----------------------------------------------------------------------------
-# Write current configuration to file (for external projects)
-#-----------------------------------------------------------------------------
-
-CONFIGURE_FILE(${DCMTK_SOURCE_DIR}/CMake/DCMTKConfig.cmake.in
-               ${DCMTK_BINARY_DIR}/DCMTKConfig.cmake @ONLY)
+  ${DCMTK_BINARY_DIR}/config/include/dcmtk/config/osconfig.h)
 
 #-----------------------------------------------------------------------------
 # Start actual compilation tasks
@@ -68,6 +96,58 @@ ENDFOREACH(module)
 INCLUDE(CMake/dcmtkAfterModules.cmake NO_POLICY_SCOPE)
 
 #-----------------------------------------------------------------------------
+# exports
+#-----------------------------------------------------------------------------
+if(BUILD_SINGLE_SHARED_LIBRARY)
+  set(EXPORT_LIBS dcmtk)
+else()
+  set(EXPORT_LIBS ${DCMTK_LIBRARIES})
+endif()
+
+export(TARGETS ${EXPORT_LIBS}
+  FILE ${PROJECT_BINARY_DIR}/DCMTKLibraryDepends.cmake)
+
+export(PACKAGE DCMTK)
+
+#
+# determine where include is relative to the CMake dir in
+# in installed tree
+file(RELATIVE_PATH CONF_REL_INCLUDE_DIR "${INSTALL_CMAKE_DIR}"
+  "${INSTALL_INCLUDE_DIR}")
+
+#-----------------------------------------------------------------------------
+# Write current configuration to file (for external projects)
+#-----------------------------------------------------------------------------
+set(DCMTKCONFIG_INCLUDE_DIR_CODE
+  "include(\"\${DCMTK_CMAKE_DIR}/DCMTKBuildTreeSettings.cmake\")")
+configure_file(${DCMTK_SOURCE_DIR}/CMake/DCMTKConfig.cmake.in
+  ${DCMTK_BINARY_DIR}/DCMTKConfig.cmake @ONLY)
+
+set(DCMTKCONFIG_INCLUDE_DIR_CODE
+"SET(DCMTK_INCLUDE_DIRS)
+foreach(inc \${DCMTK_INCLUDE_DIR_LIST})
+  list(APPEND DCMTK_INCLUDE_DIRS \${DCMTK_CMAKE_DIR}/${CONF_REL_INCLUDE_DIR}include/dcmtk/\${inc})
+endforeach()
+list(APPEND DCMTK_INCLUDE_DIRS \${DCMTK_CMAKE_DIR}/${CONF_REL_INCLUDE_DIR}include)"
+)
+configure_file(${DCMTK_SOURCE_DIR}/CMake/DCMTKConfig.cmake.in
+  CMakeFiles/DCMTKConfig.cmake @ONLY)
+
+#-----------------------------------------------------------------------------
+# Export version # checked by find_package
+#-----------------------------------------------------------------------------
+configure_file(${DCMTK_SOURCE_DIR}/CMake/DCMTKConfigVersion.cmake.in
+  "${PROJECT_BINARY_DIR}/DCMTKConfigVersion.cmake"
+  @ONLY)
+
+#
+# make a cmake file -- in this case, all that needs defining
+# is double-conversion_INCLUDE_DIRS
+configure_file(${DCMTK_SOURCE_DIR}/CMake/DCMTKBuildTreeSettings.cmake.in
+  "${PROJECT_BINARY_DIR}/DCMTKBuildTreeSettings.cmake"
+  @ONLY)
+
+#-----------------------------------------------------------------------------
 # Installation tasks
 #-----------------------------------------------------------------------------
 
@@ -82,6 +162,10 @@ INSTALL(FILES ANNOUNCE.${DCMTK_PACKAGE_VERSION_NUMBER} CHANGES.${DCMTK_PACKAGE_V
         COMPONENT doc)
 
 # Install DCMTK's CMake configuration file
-INSTALL(FILES ${DCMTK_BINARY_DIR}/DCMTKConfig.cmake
-        DESTINATION ${DCMTK_INSTALL_DATDIR}
-        COMPONENT data)
+INSTALL(FILES ${DCMTK_BINARY_DIR}/CMakeFiles/DCMTKConfig.cmake
+  ${DCMTK_BINARY_DIR}/DCMTKConfigVersion.cmake
+  DESTINATION ${INSTALL_CMAKE_DIR}
+  COMPONENT dev)
+
+install(EXPORT DCMTKLibraryDepends DESTINATION
+      "${INSTALL_CMAKE_DIR}" COMPONENT dev)
-- 
1.7.6.1

J. Riesmeier
DCMTK Developer
Posts: 2503
Joined: Tue, 2011-05-03, 14:38
Location: Oldenburg, Germany
Contact:

Re: Patch to generate modern DCMTKConfig.cmake file

#2 Post by J. Riesmeier »

Thank you for your contribution. We added a link to this posting to our internal to-do list.

Uli Schlachter
DCMTK Developer
Posts: 120
Joined: Thu, 2009-11-26, 08:15

Re: Patch to generate modern DCMTKConfig.cmake file

#3 Post by Uli Schlachter »

I tried to review this patch. However, this is not easy.

Why do you change all the CMake commands (IF(), SET(), ...) to be lower case?
Why do you remove the argument to all ELSE() and ENDIF() commands?
Why does TIFF support suddenly depend on libjpeg?
What the heck is this supposed to be: MESSAGE("JPEG_FOUND=${JPEG_FOUND} JPEG_LIBRARY=${JPEG_LIBRARY}")
Why do you rewrite the detection of external dependencies on Unix?
Why do you change "if (condition) { a } else { b }" into "if (not condition) { b } else { a }"? (Seen in the ICONV detection code)
Why do you modify DCMTK_ADD_LIBRARY() so that it now ignores ${DCMTK_INSTALL_BINDIR} and _LIBDIR?
Also, what's up with the new COMPONENTs that you add here?

And finally: Why is all of this done in a patch that is supposed to add the equivalent of FindDCMTK.cmake?

If you have several changes, please consider putting them into multiple patches so that it becomes easier to see which changes belong together and which ones are unrelated. Each patch should do a single, logically consistent thing. Also, the various commit message hopefully describe the rationale for each change.

chaircrusher
Posts: 32
Joined: Tue, 2011-12-20, 23:24
Location: iowa city,ia

Re: Patch to generate modern DCMTKConfig.cmake file

#4 Post by chaircrusher »

You are correct, that I changed things gratuitously that made it difficult to review this patch. Sorry that I didn't get back to you quicker.

As for the style questions (capitalization, arguments to ELSE & ENDIF etc) -- this is a style I'm more accustomed to. But it does make it difficult to see what's going on.

The TIFF/libjpeg dependency came from using a more recent version of TIFF that actually does depend on jpeg. In the context of this patch, that is just confusing to you.

I re-wrote checking dependencies because the way it was being done seemed to make it more difficult than it needed to be, and further, requires passing in paths of headers & libraries when DCMTK is configured, instead of using the CMake find_package.

Everything else I did was based on the examples given in the CMake WIKI for how to properly write a Use<Module>.cmake file so that it can be used with NO_MODULE -- i.e. so the find_package(dcmtk, NO_MODULE) works. The problem with the FindDCMTK.cmake that is included with CMake up to about 2.8.9 is that it doesn't work with a CMake-built DCMTK.

I will return to this when I get the chance and send you a clearer, more minimal patch.
Uli Schlachter wrote:I tried to review this patch. However, this is not easy.

Why do you change all the CMake commands (IF(), SET(), ...) to be lower case?
Why do you remove the argument to all ELSE() and ENDIF() commands?
Why does TIFF support suddenly depend on libjpeg?
What the heck is this supposed to be: MESSAGE("JPEG_FOUND=${JPEG_FOUND} JPEG_LIBRARY=${JPEG_LIBRARY}")
Why do you rewrite the detection of external dependencies on Unix?
Why do you change "if (condition) { a } else { b }" into "if (not condition) { b } else { a }"? (Seen in the ICONV detection code)
Why do you modify DCMTK_ADD_LIBRARY() so that it now ignores ${DCMTK_INSTALL_BINDIR} and _LIBDIR?
Also, what's up with the new COMPONENTs that you add here?

And finally: Why is all of this done in a patch that is supposed to add the equivalent of FindDCMTK.cmake?

If you have several changes, please consider putting them into multiple patches so that it becomes easier to see which changes belong together and which ones are unrelated. Each patch should do a single, logically consistent thing. Also, the various commit message hopefully describe the rationale for each change.

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest