summaryrefslogtreecommitdiff
path: root/Modules/FindDCMTK.cmake
diff options
context:
space:
mode:
authorJean-Christophe Fillion-Robin <jchris.fillionr@kitware.com>2016-01-11 16:08:56 -0500
committerMatt McCormick <matt.mccormick@kitware.com>2016-01-11 16:51:24 -0500
commit31b4700ed640bee962f9db9ce25fa84261a944d2 (patch)
treea91d0c35c113ca71b4f7fc5622e477c8a55e2136 /Modules/FindDCMTK.cmake
parenta9e8b123de79a65074dab1944bf80d94dc101b12 (diff)
downloadcmake-31b4700ed640bee962f9db9ce25fa84261a944d2.tar.gz
FindDCMTK: Improve compatibility with DCMTKConfig.cmake.
This improvement to the FindDCMTK module improves compatibility with recent DCMTK, which provides a DCMTKConfig.cmake file. See the module comments for a compatibility matrix. It also provides DCMTK_INCLUDE_DIRS. Ported from CommonTK (commontk.org).
Diffstat (limited to 'Modules/FindDCMTK.cmake')
-rw-r--r--Modules/FindDCMTK.cmake284
1 files changed, 239 insertions, 45 deletions
diff --git a/Modules/FindDCMTK.cmake b/Modules/FindDCMTK.cmake
index 91aafbbd02..56939720a1 100644
--- a/Modules/FindDCMTK.cmake
+++ b/Modules/FindDCMTK.cmake
@@ -2,9 +2,10 @@
# FindDCMTK
# ---------
#
-# find DCMTK libraries and applications
-
-# DCMTK_INCLUDE_DIRS - Directories to include to use DCMTK
+# - find DCMTK libraries and applications
+# The module defines the following variables:
+#
+# DCMTK_INCLUDE_DIRS - Directories to include to use DCMTK
# DCMTK_LIBRARIES - Files to link against to use DCMTK
# DCMTK_FOUND - If false, don't try to use DCMTK
# DCMTK_DIR - (optional) Source directory for DCMTK
@@ -12,8 +13,91 @@
# DCMTK_DIR can be used to make it simpler to find the various include
# directories and compiled libraries if you've just compiled it in the
# source tree. Just set it to the root of the tree where you extracted
-# the source (default to /usr/include/dcmtk/)
-
+# the source (default to /usr)
+#
+#
+# This file is able to find version of DCMTK that do or do not export
+# a DCMTKConfig.cmake file.
+#
+# IMPORTANT: A set of patches has been contributed to DCMTK
+# maintainers, as soon as:
+# (1) it has been integrated upstream so that it is available in
+# an official release (for example X.Y.Z),
+# (2) code bases have been updated to build against X.Y.Z
+# This file could be removed.
+#
+# The set of patches is listed here: https://github.com/commontk/DCMTK/compare/79030ba...f461865
+#
+#
+# Waiting for this to happen, build systems will have to be able
+# to support different versions of DCMTK.
+#
+# On any given system, the following combination of DCMTK version could be
+# considered:
+#
+# | SYSTEM DCMTK + LOCAL DCMTK | Supported ? |
+# ---------------------------------------------------------------------------
+# Case A | NA + [ ] DCMTKConfig | YES |
+# ------------------------------------------------------|--------------------
+# Case B | NA + [X] DCMTKConfig | YES |
+# ------------------------------------------------------|--------------------
+# Case C | [ ] DCMTKConfig + NA | YES |
+# ------------------------------------------------------|--------------------
+# Case D | [X] DCMTKConfig + NA | YES |
+# ------------------------------------------------------|--------------------
+# Case E | [ ] DCMTKConfig + [ ] DCMTKConfig | YES (*) |
+# ------------------------------------------------------|--------------------
+# Case F | [X] DCMTKConfig + [ ] DCMTKConfig | NO |
+# ------------------------------------------------------|--------------------
+# Case G | [ ] DCMTKConfig + [X] DCMTKConfig | YES |
+# ------------------------------------------------------|--------------------
+# Case H | [X] DCMTKConfig + [X] DCMTKConfig | YES |
+# ---------------------------------------------------------------------------
+#
+# (*) See Troubleshooting section.
+#
+# Legend:
+#
+# NA ...............: Means that no System or Local DCMTK is available
+#
+# [ ] DCMTKConfig ..: Means that the version of DCMTK does NOT export a DCMTKConfig.cmake file.
+#
+# [X] DCMTKConfig ..: Means that the version of DCMTK exports a DCMTKConfig.cmake file.
+#
+#
+#
+# In CTK commits 52d953 and 74b4b07, the FindDCMTK.cmake module has been updated to be able
+# to find both version of DCMTK ([ ] DCMTKConfig and [X] DCMTKConfig).
+#
+# It is a two steps process:
+#
+# * Step 1: Attempt to find DCMTK version providing a DCMTKConfig.cmake file. This is done
+# with the help of ''
+#
+# * Step 2: If step 1 failed, rely on FindDCMTK.cmake to set DCMTK_* variables details below.
+#
+#
+#
+# Troubleshooting:
+#
+# What to do if my project find a different version of DCMTK ?
+#
+# Remove DCMTK entry from the CMake registry.
+# Search for "CMake user package registry" on http://www.cmake.org/cmake/help/v2.8.9/cmake.html#command:find_package
+#
+# Details: As some point, the DCMTK build tree was exported [1][2][3]. Indeed, before the set of
+# patches discussed above has been contributed to upstream DCMTK, an initial implementation of
+# a DCMTK build system exporting its build tree has been implemented and has been tested by some
+# folks. This had the effect of populating the CMake registry.
+#
+# Since Step1 does not exclude the CMake registry, when dealing with case E, the incorrect version of
+# DCMTK could be found.
+#
+# [1] http://slicer-devel.65872.n3.nabble.com/Packaging-seems-to-work-again-tp4028121p4028134.html
+# [2] https://www.assembla.com/spaces/slicerrt/tickets/244-dcmtk_dir-vs--dcmtkconfig-cmake?comment=267984263#comment:267984263
+# [3] http://www.cmake.org/cmake/help/v2.8.11/cmake.html#command:export
+#
+#
#=============================================================================
# Copyright 2004-2009 Kitware, Inc.
# Copyright 2009-2010 Mathieu Malaterre <mathieu.malaterre@gmail.com>
@@ -26,7 +110,7 @@
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
-# (To distribute this file outside of CMake, substitute the full
+# (To distributed this file outside of CMake, substitute the full
# License text for the above reference.)
#
@@ -35,50 +119,133 @@
# Modified for EasyViz by Thomas Sondergaard.
#
-if(NOT DCMTK_FOUND AND NOT DCMTK_DIR)
- set(DCMTK_DIR
- "/usr/include/dcmtk/"
- CACHE
- PATH
- "Root of DCMTK source tree (optional).")
- mark_as_advanced(DCMTK_DIR)
+set(_dcmtk_dir_description "The directory of DCMTK build or install tree.")
+
+# Ensure that DCMTK_DIR is set to a reasonable default value
+# so that DCMTK libraries can be found on a standard Unix distribution.
+# It also overwrite the value of DCMTK_DIR after this one has been
+# set by a successful discovery of DCMTK by the unpatched FindDCMTK.cmake module
+# distributed with CMake (as of 0167cea)
+if(NOT DCMTK_DIR OR DCMTK_DIR STREQUAL "/usr/include/dcmtk")
+ set(DCMTK_DIR "/usr" CACHE PATH ${_dcmtk_dir_description} FORCE)
endif()
+set(_SAVED_DCMTK_DIR ${DCMTK_DIR})
+#
+# Step1: Attempt to find a version of DCMTK providing a DCMTKConfig.cmake file.
+#
+message(STATUS "Trying to find DCMTK expecting DCMTKConfig.cmake")
+find_package(DCMTK QUIET NO_MODULE)
+if(DCMTK_FOUND
+ AND NOT "x" STREQUAL "x${DCMTK_LIBRARIES}"
+ AND NOT "x" STREQUAL "x${DCMTK_INCLUDE_DIRS}")
+ message(STATUS "Trying to find DCMTK expecting DCMTKConfig.cmake - ok")
+ return()
+else()
+ message(STATUS "Trying to find DCMTK expecting DCMTKConfig.cmake - failed")
+endif()
+
+message(STATUS "Trying to find DCMTK relying on FindDCMTK.cmake")
+
+# Restore the value reset by the previous call to 'find_package(DCMTK QUIET NO_MODULE)'
+set(DCMTK_DIR ${_SAVED_DCMTK_DIR} CACHE PATH ${_dcmtk_dir_description} FORCE)
+
+
+#
+# Step2: Attempt to find a version of DCMTK that does NOT provide a DCMTKConfig.cmake file.
+#
+
+# prefer DCMTK_DIR over default system paths like /usr/lib
+if(DCMTK_DIR)
+ set(CMAKE_PREFIX_PATH ${DCMTK_DIR}/lib ${CMAKE_PREFIX_PATH}) # this is given to FIND_LIBRARY or FIND_PATH
+endif()
+
+# Find all libraries, store debug and release separately
foreach(lib
- dcmdata
- dcmimage
- dcmimgle
- dcmjpeg
- dcmnet
dcmpstat
- dcmqrdb
- dcmsign
dcmsr
+ dcmsign
dcmtls
+ dcmqrdb
+ dcmnet
+ dcmjpeg
+ dcmimage
+ dcmimgle
+ dcmdata
+ oflog
+ ofstd
ijg12
ijg16
ijg8
- ofstd)
+ )
- find_library(DCMTK_${lib}_LIBRARY
+ # Find Release libraries
+ find_library(DCMTK_${lib}_LIBRARY_RELEASE
${lib}
PATHS
${DCMTK_DIR}/${lib}/libsrc
${DCMTK_DIR}/${lib}/libsrc/Release
- ${DCMTK_DIR}/${lib}/libsrc/Debug
${DCMTK_DIR}/${lib}/Release
+ ${DCMTK_DIR}/lib
+ ${DCMTK_DIR}/lib/Release
+ ${DCMTK_DIR}/dcmjpeg/lib${lib}/Release
+ NO_DEFAULT_PATH
+ )
+
+ # Find Debug libraries
+ find_library(DCMTK_${lib}_LIBRARY_DEBUG
+ ${lib}${DCMTK_CMAKE_DEBUG_POSTFIX}
+ PATHS
+ ${DCMTK_DIR}/${lib}/libsrc
+ ${DCMTK_DIR}/${lib}/libsrc/Debug
${DCMTK_DIR}/${lib}/Debug
- ${DCMTK_DIR}/lib)
+ ${DCMTK_DIR}/lib
+ ${DCMTK_DIR}/lib/Debug
+ ${DCMTK_DIR}/dcmjpeg/lib${lib}/Debug
+ NO_DEFAULT_PATH
+ )
+
+ mark_as_advanced(DCMTK_${lib}_LIBRARY_RELEASE)
+ mark_as_advanced(DCMTK_${lib}_LIBRARY_DEBUG)
- mark_as_advanced(DCMTK_${lib}_LIBRARY)
+ # Add libraries to variable according to build type
+ if(DCMTK_${lib}_LIBRARY_RELEASE)
+ list(APPEND DCMTK_LIBRARIES optimized ${DCMTK_${lib}_LIBRARY_RELEASE})
+ endif()
- if(DCMTK_${lib}_LIBRARY)
- list(APPEND DCMTK_LIBRARIES ${DCMTK_${lib}_LIBRARY})
+ if(DCMTK_${lib}_LIBRARY_DEBUG)
+ list(APPEND DCMTK_LIBRARIES debug ${DCMTK_${lib}_LIBRARY_DEBUG})
endif()
endforeach()
+set(CMAKE_THREAD_LIBS_INIT)
+if(DCMTK_oflog_LIBRARY_RELEASE OR DCMTK_oflog_LIBRARY_DEBUG)
+ # Hack - Not having a DCMTKConfig.cmake file to read the settings from, we will attempt to
+ # find the library in all cases.
+ # Ideally, pthread library should be discovered only if DCMTK_WITH_THREADS is enabled.
+ set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
+ find_package(Threads)
+endif()
+
+if(CMAKE_THREAD_LIBS_INIT)
+ list(APPEND DCMTK_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
+endif()
+
+#
+# SPECIFIC CASE FOR DCMTK BUILD DIR as DCMTK_DIR
+# (as opposed to a DCMTK install dir)
+# Have to find the source directory.
+if(EXISTS ${DCMTK_DIR}/CMakeCache.txt)
+ load_cache(${DCMTK_DIR} READ_WITH_PREFIX "EXT"
+ DCMTK_SOURCE_DIR)
+ if(NOT EXISTS ${EXTDCMTK_SOURCE_DIR})
+ message(FATAL_ERROR
+ "DCMTK build directory references
+nonexistant DCMTK source directory ${EXTDCMTK_SOURCE_DIR}")
+ endif()
+endif()
set(DCMTK_config_TEST_HEADER osconfig.h)
set(DCMTK_dcmdata_TEST_HEADER dctypes.h)
@@ -92,6 +259,10 @@ set(DCMTK_dcmsign_TEST_HEADER sicert.h)
set(DCMTK_dcmsr_TEST_HEADER dsrtree.h)
set(DCMTK_dcmtls_TEST_HEADER tlslayer.h)
set(DCMTK_ofstd_TEST_HEADER ofstdinc.h)
+set(DCMTK_oflog_TEST_HEADER oflog.h)
+set(DCMTK_dcmjpls_TEST_HEADER djlsutil.h)
+
+set(DCMTK_INCLUDE_DIR_NAMES)
foreach(dir
config
@@ -99,31 +270,47 @@ foreach(dir
dcmimage
dcmimgle
dcmjpeg
+ dcmjpls
dcmnet
dcmpstat
dcmqrdb
dcmsign
dcmsr
dcmtls
- ofstd)
+ ofstd
+ oflog)
+ if(EXTDCMTK_SOURCE_DIR)
+ set(SOURCE_DIR_PATH
+ ${EXTDCMTK_SOURCE_DIR}/${dir}/include/dcmtk/${dir})
+ endif()
find_path(DCMTK_${dir}_INCLUDE_DIR
${DCMTK_${dir}_TEST_HEADER}
PATHS
${DCMTK_DIR}/${dir}/include
${DCMTK_DIR}/${dir}
- ${DCMTK_DIR}/include/${dir}
${DCMTK_DIR}/include/dcmtk/${dir}
${DCMTK_DIR}/${dir}/include/dcmtk/${dir}
+ ${DCMTK_DIR}/include/${dir}
+ ${SOURCE_DIR_PATH}
)
mark_as_advanced(DCMTK_${dir}_INCLUDE_DIR)
+ list(APPEND DCMTK_INCLUDE_DIR_NAMES DCMTK_${dir}_INCLUDE_DIR)
if(DCMTK_${dir}_INCLUDE_DIR)
+ # add the 'include' path so eg
+ #include "dcmtk/dcmimgle/dcmimage.h"
+ # works
+ get_filename_component(_include ${DCMTK_${dir}_INCLUDE_DIR} PATH)
+ get_filename_component(_include ${_include} PATH)
list(APPEND
DCMTK_INCLUDE_DIRS
- ${DCMTK_${dir}_INCLUDE_DIR})
+ ${DCMTK_${dir}_INCLUDE_DIR}
+ ${_include})
endif()
endforeach()
+list(APPEND DCMTK_INCLUDE_DIRS ${DCMTK_DIR}/include)
+
if(WIN32)
list(APPEND DCMTK_LIBRARIES netapi32 wsock32)
endif()
@@ -137,21 +324,28 @@ if(DCMTK_ofstd_INCLUDE_DIR)
mark_as_advanced(DCMTK_dcmtk_INCLUDE_DIR)
endif()
-include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
-find_package_handle_standard_args(DCMTK DEFAULT_MSG
- DCMTK_config_INCLUDE_DIR
- DCMTK_ofstd_INCLUDE_DIR
- DCMTK_ofstd_LIBRARY
- DCMTK_dcmdata_INCLUDE_DIR
- DCMTK_dcmdata_LIBRARY
- DCMTK_dcmimgle_INCLUDE_DIR
- DCMTK_dcmimgle_LIBRARY)
-
# Compatibility: This variable is deprecated
set(DCMTK_INCLUDE_DIR ${DCMTK_INCLUDE_DIRS})
-foreach(executable dcmdump dcmdjpeg dcmdrle)
- string(TOUPPER ${executable} EXECUTABLE)
- find_program(DCMTK_${EXECUTABLE}_EXECUTABLE ${executable} ${DCMTK_DIR}/bin)
- mark_as_advanced(DCMTK_${EXECUTABLE}_EXECUTABLE)
-endforeach()
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(DCMTK
+ REQUIRED_VARS ${DCMTK_INCLUDE_DIR_NAMES} DCMTK_LIBRARIES
+ FAIL_MESSAGE "Please set DCMTK_DIR and re-run configure")
+
+# Workaround bug in packaging of DCMTK 3.6.0 on Debian.
+# See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=637687
+if(DCMTK_FOUND AND UNIX AND NOT APPLE)
+ include(CheckCXXSourceCompiles)
+ set(CMAKE_REQUIRED_FLAGS )
+ set(CMAKE_REQUIRED_DEFINITIONS )
+ set(CMAKE_REQUIRED_INCLUDES ${DCMTK_INCLUDE_DIRS})
+ set(CMAKE_REQUIRED_LIBRARIES ${DCMTK_LIBRARIES})
+ check_cxx_source_compiles("#include <dcmtk/config/osconfig.h>\n#include <dcmtk/ofstd/ofstream.h>\nint main(int,char*[]){return 0;}"
+ DCMTK_HAVE_CONFIG_H_OPTIONAL
+ )
+ if(NOT DCMTK_HAVE_CONFIG_H_OPTIONAL)
+ set(DCMTK_DEFINITIONS "HAVE_CONFIG_H")
+ endif()
+endif()
+
+message(STATUS "Trying to find DCMTK relying on FindDCMTK.cmake - ok")