# Distributed under the OSI-approved BSD 3-Clause License. See accompanying | |
# file Copyright.txt or https://cmake.org/licensing for details. | |
#.rst: | |
# FindDCMTK | |
# --------- | |
# | |
# 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 | |
# | |
# Compatibility | |
# ^^^^^^^^^^^^^ | |
# | |
# This module is able to find a version of DCMTK that does or does not export | |
# a *DCMTKConfig.cmake* file. It applies a two step process: | |
# | |
# * Step 1: Attempt to find DCMTK version providing a *DCMTKConfig.cmake* file. | |
# * Step 2: If step 1 failed, rely on *FindDCMTK.cmake* to set `DCMTK_*` variables details below. | |
# | |
# | |
# `Recent DCMTK | |
# <http://git.dcmtk.org/web?p=dcmtk.git;a=commit;h=662ae187c493c6b9a73dd5e3875372cebd0c11fe>`_ | |
# provides a *DCMTKConfig.cmake* :manual:`package configuration file | |
# <cmake-packages(7)>`. To exclusively use the package configuration file | |
# (recommended when possible), pass the `NO_MODULE` option to | |
# :command:`find_package`. For example, `find_package(DCMTK NO_MODULE)`. | |
# This requires official DCMTK snapshot *3.6.1_20140617* or newer. | |
# | |
# | |
# Until all clients update to the more recent DCMTK, build systems will need | |
# to support different versions of DCMTK. | |
# | |
# On any given system, the following combinations of DCMTK versions 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. | |
# | |
# | |
# Troubleshooting | |
# ^^^^^^^^^^^^^^^ | |
# | |
# What to do if my project finds a different version of DCMTK? | |
# | |
# Remove DCMTK entry from the CMake cache per :command:`find_package` | |
# documentation. | |
# | |
# Written for VXL by Amitha Perera. | |
# Upgraded for GDCM by Mathieu Malaterre. | |
# Modified for EasyViz by Thomas Sondergaard. | |
# | |
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. | |
# | |
if(NOT DCMTK_FIND_QUIETLY) | |
message(STATUS "Trying to find DCMTK expecting DCMTKConfig.cmake") | |
endif() | |
find_package(DCMTK QUIET NO_MODULE) | |
if(DCMTK_FOUND | |
AND NOT "x" STREQUAL "x${DCMTK_LIBRARIES}" | |
AND NOT "x" STREQUAL "x${DCMTK_INCLUDE_DIRS}") | |
if(NOT DCMTK_FIND_QUIETLY) | |
message(STATUS "Trying to find DCMTK expecting DCMTKConfig.cmake - ok") | |
endif() | |
return() | |
else() | |
if(NOT DCMTK_FIND_QUIETLY) | |
message(STATUS "Trying to find DCMTK expecting DCMTKConfig.cmake - failed") | |
endif() | |
endif() | |
if(NOT DCMTK_FIND_QUIETLY) | |
message(STATUS "Trying to find DCMTK relying on FindDCMTK.cmake") | |
endif() | |
# 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 | |
dcmpstat | |
dcmsr | |
dcmsign | |
dcmtls | |
dcmqrdb | |
dcmnet | |
dcmjpeg | |
dcmimage | |
dcmimgle | |
dcmdata | |
oflog | |
ofstd | |
ijg12 | |
ijg16 | |
ijg8 | |
) | |
# Find Release libraries | |
find_library(DCMTK_${lib}_LIBRARY_RELEASE | |
${lib} | |
PATHS | |
${DCMTK_DIR}/${lib}/libsrc | |
${DCMTK_DIR}/${lib}/libsrc/Release | |
${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/Debug | |
${DCMTK_DIR}/dcmjpeg/lib${lib}/Debug | |
NO_DEFAULT_PATH | |
) | |
mark_as_advanced(DCMTK_${lib}_LIBRARY_RELEASE) | |
mark_as_advanced(DCMTK_${lib}_LIBRARY_DEBUG) | |
# 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_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) | |
set(DCMTK_dcmimage_TEST_HEADER dicoimg.h) | |
set(DCMTK_dcmimgle_TEST_HEADER dcmimage.h) | |
set(DCMTK_dcmjpeg_TEST_HEADER djdecode.h) | |
set(DCMTK_dcmnet_TEST_HEADER assoc.h) | |
set(DCMTK_dcmpstat_TEST_HEADER dcmpstat.h) | |
set(DCMTK_dcmqrdb_TEST_HEADER dcmqrdba.h) | |
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 | |
dcmdata | |
dcmimage | |
dcmimgle | |
dcmjpeg | |
dcmjpls | |
dcmnet | |
dcmpstat | |
dcmqrdb | |
dcmsign | |
dcmsr | |
dcmtls | |
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/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} | |
${_include}) | |
endif() | |
endforeach() | |
list(APPEND DCMTK_INCLUDE_DIRS ${DCMTK_DIR}/include) | |
if(WIN32) | |
list(APPEND DCMTK_LIBRARIES netapi32 wsock32) | |
endif() | |
if(DCMTK_ofstd_INCLUDE_DIR) | |
get_filename_component(DCMTK_dcmtk_INCLUDE_DIR | |
${DCMTK_ofstd_INCLUDE_DIR} | |
PATH | |
CACHE) | |
list(APPEND DCMTK_INCLUDE_DIRS ${DCMTK_dcmtk_INCLUDE_DIR}) | |
mark_as_advanced(DCMTK_dcmtk_INCLUDE_DIR) | |
endif() | |
# Compatibility: This variable is deprecated | |
set(DCMTK_INCLUDE_DIR ${DCMTK_INCLUDE_DIRS}) | |
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}) | |
set(CMAKE_REQUIRED_QUIET ${DCMTK_FIND_QUIETLY}) | |
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() | |
if(NOT DCMTK_FIND_QUIETLY) | |
message(STATUS "Trying to find DCMTK relying on FindDCMTK.cmake - ok") | |
endif() |