FindDCMTK.cmake 10 KB

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