FindDCMTK.cmake 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. # file LICENSE.rst or https://cmake.org/licensing for details.
  3. #[=======================================================================[.rst:
  4. FindDCMTK
  5. ---------
  6. Finds the DICOM ToolKit (DCMTK) libraries and applications:
  7. .. code-block:: cmake
  8. find_package(DCMTK [...])
  9. DCMTK is a set of libraries and applications implementing large parts of
  10. the DICOM Standard (Digital Imaging and Communications in Medicine).
  11. The module defines the following variables::
  12. DCMTK_INCLUDE_DIRS - Directories to include to use DCMTK
  13. DCMTK_LIBRARIES - Files to link against to use DCMTK
  14. DCMTK_FOUND - If false, don't try to use DCMTK
  15. DCMTK_DIR - (optional) Source directory for DCMTK
  16. Compatibility
  17. ^^^^^^^^^^^^^
  18. This module is able to find a version of DCMTK that does or does not export
  19. a ``DCMTKConfig.cmake`` file. It applies a two step process:
  20. * Step 1: Attempt to find DCMTK version providing a ``DCMTKConfig.cmake`` file.
  21. * Step 2: If step 1 failed, rely on ``FindDCMTK.cmake`` to set ``DCMTK_*``
  22. variables details below.
  23. `Recent DCMTK
  24. <https://git.dcmtk.org/?p=dcmtk.git;a=commit;h=662ae187c493c6b9a73dd5e3875372cebd0c11fe>`_
  25. provides a ``DCMTKConfig.cmake`` :manual:`package configuration file
  26. <cmake-packages(7)>`. To exclusively use the package configuration file
  27. (recommended when possible), pass the `NO_MODULE` option to
  28. :command:`find_package`. For example, `find_package(DCMTK NO_MODULE)`.
  29. This requires official DCMTK snapshot *3.6.1_20140617* or newer.
  30. Until all clients update to the more recent DCMTK, build systems will need
  31. to support different versions of DCMTK.
  32. On any given system, the following combinations of DCMTK versions could be
  33. considered:
  34. +--------+---------------------+-----------------------+-------------------+
  35. | | SYSTEM DCMTK | LOCAL DCMTK | Supported ? |
  36. +--------+---------------------+-----------------------+-------------------+
  37. | Case A | NA | [ ] DCMTKConfig | YES |
  38. +--------+---------------------+-----------------------+-------------------+
  39. | Case B | NA | [X] DCMTKConfig | YES |
  40. +--------+---------------------+-----------------------+-------------------+
  41. | Case C | [ ] DCMTKConfig | NA | YES |
  42. +--------+---------------------+-----------------------+-------------------+
  43. | Case D | [X] DCMTKConfig | NA | YES |
  44. +--------+---------------------+-----------------------+-------------------+
  45. | Case E | [ ] DCMTKConfig | [ ] DCMTKConfig | YES (*) |
  46. +--------+---------------------+-----------------------+-------------------+
  47. | Case F | [X] DCMTKConfig | [ ] DCMTKConfig | NO |
  48. +--------+---------------------+-----------------------+-------------------+
  49. | Case G | [ ] DCMTKConfig | [X] DCMTKConfig | YES |
  50. +--------+---------------------+-----------------------+-------------------+
  51. | Case H | [X] DCMTKConfig | [X] DCMTKConfig | YES |
  52. +--------+---------------------+-----------------------+-------------------+
  53. (*) See Troubleshooting section.
  54. Legend:
  55. NA ...............: Means that no System or Local DCMTK is available
  56. [ ] DCMTKConfig ..: Means that the version of DCMTK does NOT export a DCMTKConfig.cmake file.
  57. [X] DCMTKConfig ..: Means that the version of DCMTK exports a DCMTKConfig.cmake file.
  58. Troubleshooting
  59. ^^^^^^^^^^^^^^^
  60. What to do if my project finds a different version of DCMTK?
  61. Remove DCMTK entry from the CMake cache per :command:`find_package`
  62. documentation.
  63. #]=======================================================================]
  64. #
  65. # Written for VXL by Amitha Perera.
  66. # Upgraded for GDCM by Mathieu Malaterre.
  67. # Modified for EasyViz by Thomas Sondergaard.
  68. #
  69. set(_dcmtk_dir_description "The directory of DCMTK build or install tree.")
  70. # Ensure that DCMTK_DIR is set to a reasonable default value
  71. # so that DCMTK libraries can be found on a standard Unix distribution.
  72. # It also overwrite the value of DCMTK_DIR after this one has been
  73. # set by a successful discovery of DCMTK by the unpatched FindDCMTK.cmake module
  74. # distributed with CMake (as of 0167cea)
  75. if(NOT DCMTK_DIR OR DCMTK_DIR STREQUAL "/usr/include/dcmtk")
  76. set(DCMTK_DIR "/usr" CACHE PATH ${_dcmtk_dir_description} FORCE)
  77. endif()
  78. set(_SAVED_DCMTK_DIR ${DCMTK_DIR})
  79. #
  80. # Step1: Attempt to find a version of DCMTK providing a DCMTKConfig.cmake file.
  81. #
  82. if(NOT DCMTK_FIND_QUIETLY)
  83. message(CHECK_START "Trying to find DCMTK expecting DCMTKConfig.cmake")
  84. endif()
  85. find_package(DCMTK QUIET NO_MODULE)
  86. if(DCMTK_FOUND
  87. AND NOT "x" STREQUAL "x${DCMTK_LIBRARIES}"
  88. AND NOT "x" STREQUAL "x${DCMTK_INCLUDE_DIRS}")
  89. if(NOT DCMTK_FIND_QUIETLY)
  90. message(CHECK_PASS "ok")
  91. endif()
  92. return()
  93. else()
  94. if(NOT DCMTK_FIND_QUIETLY)
  95. message(CHECK_FAIL "failed")
  96. endif()
  97. endif()
  98. if(NOT DCMTK_FIND_QUIETLY)
  99. message(STATUS "Trying to find DCMTK relying on FindDCMTK.cmake")
  100. endif()
  101. # Restore the value reset by the previous call to 'find_package(DCMTK QUIET NO_MODULE)'
  102. set(DCMTK_DIR ${_SAVED_DCMTK_DIR} CACHE PATH ${_dcmtk_dir_description} FORCE)
  103. #
  104. # Step2: Attempt to find a version of DCMTK that does NOT provide a DCMTKConfig.cmake file.
  105. #
  106. # prefer DCMTK_DIR over default system paths like /usr/lib
  107. if(DCMTK_DIR)
  108. set(CMAKE_PREFIX_PATH ${DCMTK_DIR}/lib ${CMAKE_PREFIX_PATH}) # this is given to FIND_LIBRARY or FIND_PATH
  109. endif()
  110. # Find all libraries, store debug and release separately
  111. foreach(lib
  112. dcmpstat
  113. dcmsr
  114. dcmsign
  115. dcmtls
  116. dcmqrdb
  117. dcmnet
  118. dcmjpeg
  119. dcmimage
  120. dcmimgle
  121. dcmdata
  122. oflog
  123. ofstd
  124. ijg12
  125. ijg16
  126. ijg8
  127. )
  128. # Find Release libraries
  129. find_library(DCMTK_${lib}_LIBRARY_RELEASE
  130. ${lib}
  131. PATHS
  132. ${DCMTK_DIR}/${lib}/libsrc
  133. ${DCMTK_DIR}/${lib}/libsrc/Release
  134. ${DCMTK_DIR}/${lib}/Release
  135. ${DCMTK_DIR}/lib
  136. ${DCMTK_DIR}/lib/Release
  137. ${DCMTK_DIR}/dcmjpeg/lib${lib}/Release
  138. NO_DEFAULT_PATH
  139. )
  140. # Find Debug libraries
  141. find_library(DCMTK_${lib}_LIBRARY_DEBUG
  142. ${lib}${DCMTK_CMAKE_DEBUG_POSTFIX}
  143. PATHS
  144. ${DCMTK_DIR}/${lib}/libsrc
  145. ${DCMTK_DIR}/${lib}/libsrc/Debug
  146. ${DCMTK_DIR}/${lib}/Debug
  147. ${DCMTK_DIR}/lib
  148. ${DCMTK_DIR}/lib/Debug
  149. ${DCMTK_DIR}/dcmjpeg/lib${lib}/Debug
  150. NO_DEFAULT_PATH
  151. )
  152. mark_as_advanced(DCMTK_${lib}_LIBRARY_RELEASE)
  153. mark_as_advanced(DCMTK_${lib}_LIBRARY_DEBUG)
  154. # Add libraries to variable according to build type
  155. if(DCMTK_${lib}_LIBRARY_RELEASE)
  156. list(APPEND DCMTK_LIBRARIES optimized ${DCMTK_${lib}_LIBRARY_RELEASE})
  157. endif()
  158. if(DCMTK_${lib}_LIBRARY_DEBUG)
  159. list(APPEND DCMTK_LIBRARIES debug ${DCMTK_${lib}_LIBRARY_DEBUG})
  160. endif()
  161. endforeach()
  162. set(CMAKE_THREAD_LIBS_INIT)
  163. if(DCMTK_oflog_LIBRARY_RELEASE OR DCMTK_oflog_LIBRARY_DEBUG)
  164. # Hack - Not having a DCMTKConfig.cmake file to read the settings from, we will attempt to
  165. # find the library in all cases.
  166. # Ideally, pthread library should be discovered only if DCMTK_WITH_THREADS is enabled.
  167. find_package(Threads)
  168. endif()
  169. if(CMAKE_THREAD_LIBS_INIT)
  170. list(APPEND DCMTK_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
  171. endif()
  172. #
  173. # SPECIFIC CASE FOR DCMTK BUILD DIR as DCMTK_DIR
  174. # (as opposed to a DCMTK install dir)
  175. # Have to find the source directory.
  176. if(EXISTS ${DCMTK_DIR}/CMakeCache.txt)
  177. load_cache(${DCMTK_DIR} READ_WITH_PREFIX "EXT"
  178. DCMTK_SOURCE_DIR)
  179. if(NOT EXISTS ${EXTDCMTK_SOURCE_DIR})
  180. message(FATAL_ERROR
  181. "DCMTK build directory references
  182. nonexistent DCMTK source directory ${EXTDCMTK_SOURCE_DIR}")
  183. endif()
  184. endif()
  185. set(DCMTK_config_TEST_HEADER osconfig.h)
  186. set(DCMTK_dcmdata_TEST_HEADER dctypes.h)
  187. set(DCMTK_dcmimage_TEST_HEADER dicoimg.h)
  188. set(DCMTK_dcmimgle_TEST_HEADER dcmimage.h)
  189. set(DCMTK_dcmjpeg_TEST_HEADER djdecode.h)
  190. set(DCMTK_dcmnet_TEST_HEADER assoc.h)
  191. set(DCMTK_dcmpstat_TEST_HEADER dcmpstat.h)
  192. set(DCMTK_dcmqrdb_TEST_HEADER dcmqrdba.h)
  193. set(DCMTK_dcmsign_TEST_HEADER sicert.h)
  194. set(DCMTK_dcmsr_TEST_HEADER dsrtree.h)
  195. set(DCMTK_dcmtls_TEST_HEADER tlslayer.h)
  196. set(DCMTK_ofstd_TEST_HEADER ofstdinc.h)
  197. set(DCMTK_oflog_TEST_HEADER oflog.h)
  198. set(DCMTK_dcmjpls_TEST_HEADER djlsutil.h)
  199. set(DCMTK_INCLUDE_DIR_NAMES)
  200. foreach(dir
  201. config
  202. dcmdata
  203. dcmimage
  204. dcmimgle
  205. dcmjpeg
  206. dcmjpls
  207. dcmnet
  208. dcmpstat
  209. dcmqrdb
  210. dcmsign
  211. dcmsr
  212. dcmtls
  213. ofstd
  214. oflog)
  215. if(EXTDCMTK_SOURCE_DIR)
  216. set(SOURCE_DIR_PATH
  217. ${EXTDCMTK_SOURCE_DIR}/${dir}/include/dcmtk/${dir})
  218. endif()
  219. find_path(DCMTK_${dir}_INCLUDE_DIR
  220. ${DCMTK_${dir}_TEST_HEADER}
  221. PATHS
  222. ${DCMTK_DIR}/${dir}/include
  223. ${DCMTK_DIR}/${dir}
  224. ${DCMTK_DIR}/include/dcmtk/${dir}
  225. ${DCMTK_DIR}/${dir}/include/dcmtk/${dir}
  226. ${DCMTK_DIR}/include/${dir}
  227. ${SOURCE_DIR_PATH}
  228. )
  229. mark_as_advanced(DCMTK_${dir}_INCLUDE_DIR)
  230. list(APPEND DCMTK_INCLUDE_DIR_NAMES DCMTK_${dir}_INCLUDE_DIR)
  231. if(DCMTK_${dir}_INCLUDE_DIR)
  232. # add the 'include' path so eg
  233. #include "dcmtk/dcmimgle/dcmimage.h"
  234. # works
  235. get_filename_component(_include ${DCMTK_${dir}_INCLUDE_DIR} PATH)
  236. get_filename_component(_include ${_include} PATH)
  237. list(APPEND
  238. DCMTK_INCLUDE_DIRS
  239. ${DCMTK_${dir}_INCLUDE_DIR}
  240. ${_include})
  241. endif()
  242. endforeach()
  243. list(APPEND DCMTK_INCLUDE_DIRS ${DCMTK_DIR}/include)
  244. if(WIN32)
  245. list(APPEND DCMTK_LIBRARIES netapi32 wsock32)
  246. endif()
  247. if(DCMTK_ofstd_INCLUDE_DIR)
  248. get_filename_component(DCMTK_dcmtk_INCLUDE_DIR
  249. ${DCMTK_ofstd_INCLUDE_DIR}
  250. PATH
  251. CACHE)
  252. list(APPEND DCMTK_INCLUDE_DIRS ${DCMTK_dcmtk_INCLUDE_DIR})
  253. mark_as_advanced(DCMTK_dcmtk_INCLUDE_DIR)
  254. endif()
  255. # Compatibility: This variable is deprecated
  256. set(DCMTK_INCLUDE_DIR ${DCMTK_INCLUDE_DIRS})
  257. include(FindPackageHandleStandardArgs)
  258. find_package_handle_standard_args(DCMTK
  259. REQUIRED_VARS ${DCMTK_INCLUDE_DIR_NAMES} DCMTK_LIBRARIES
  260. FAIL_MESSAGE "Please set DCMTK_DIR and re-run configure")
  261. # Workaround bug in packaging of DCMTK 3.6.0 on Debian.
  262. # See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=637687
  263. if(DCMTK_FOUND AND UNIX AND NOT APPLE)
  264. include(${CMAKE_CURRENT_LIST_DIR}/CheckIncludeFiles.cmake)
  265. set(CMAKE_REQUIRED_FLAGS )
  266. set(CMAKE_REQUIRED_DEFINITIONS )
  267. set(CMAKE_REQUIRED_INCLUDES ${DCMTK_INCLUDE_DIRS})
  268. set(CMAKE_REQUIRED_LIBRARIES ${DCMTK_LIBRARIES})
  269. set(CMAKE_REQUIRED_QUIET ${DCMTK_FIND_QUIETLY})
  270. check_include_files("dcmtk/config/osconfig.h;dcmtk/ofstd/ofstream.h" DCMTK_HAVE_CONFIG_H_OPTIONAL LANGUAGE CXX)
  271. if(NOT DCMTK_HAVE_CONFIG_H_OPTIONAL)
  272. set(DCMTK_DEFINITIONS "HAVE_CONFIG_H")
  273. endif()
  274. endif()