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