1# Orthanc - A Lightweight, RESTful DICOM Store
2# Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
3# Department, University Hospital of Liege, Belgium
4# Copyright (C) 2017-2020 Osimis S.A., Belgium
5#
6# This program is free software: you can redistribute it and/or
7# modify it under the terms of the GNU Lesser General Public License
8# as published by the Free Software Foundation, either version 3 of
9# the License, or (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful, but
12# WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14# Lesser General Public License for more details.
15#
16# You should have received a copy of the GNU Lesser General Public
17# License along with this program. If not, see
18# <http://www.gnu.org/licenses/>.
19
20
21if (NOT DEFINED ENABLE_DCMTK_NETWORKING)
22  set(ENABLE_DCMTK_NETWORKING ON)
23endif()
24
25if (STATIC_BUILD OR NOT USE_SYSTEM_DCMTK)
26  if (DCMTK_STATIC_VERSION STREQUAL "3.6.0")
27    include(${CMAKE_CURRENT_LIST_DIR}/DcmtkConfigurationStatic-3.6.0.cmake)
28  elseif (DCMTK_STATIC_VERSION STREQUAL "3.6.2")
29    include(${CMAKE_CURRENT_LIST_DIR}/DcmtkConfigurationStatic-3.6.2.cmake)
30  elseif (DCMTK_STATIC_VERSION STREQUAL "3.6.4")
31    include(${CMAKE_CURRENT_LIST_DIR}/DcmtkConfigurationStatic-3.6.4.cmake)
32  elseif (DCMTK_STATIC_VERSION STREQUAL "3.6.5")
33    include(${CMAKE_CURRENT_LIST_DIR}/DcmtkConfigurationStatic-3.6.5.cmake)
34  else()
35    message(FATAL_ERROR "Unsupported version of DCMTK: ${DCMTK_STATIC_VERSION}")
36  endif()
37
38
39  ##
40  ## Commands shared by all versions of DCMTK
41  ##
42
43  AUX_SOURCE_DIRECTORY(${DCMTK_SOURCES_DIR}/dcmdata/libsrc DCMTK_SOURCES)
44  AUX_SOURCE_DIRECTORY(${DCMTK_SOURCES_DIR}/ofstd/libsrc DCMTK_SOURCES)
45
46  LIST(REMOVE_ITEM DCMTK_SOURCES
47    ${DCMTK_SOURCES_DIR}/dcmdata/libsrc/mkdictbi.cc
48    ${DCMTK_SOURCES_DIR}/dcmdata/libsrc/mkdeftag.cc
49    ${DCMTK_SOURCES_DIR}/dcmdata/libsrc/dcdict_orthanc.cc
50    )
51
52  if (CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
53    message(${DCMTK_SOURCES_DIR})
54    list(REMOVE_ITEM DCMTK_SOURCES
55      ${DCMTK_SOURCES_DIR}/ofstd/libsrc/offilsys.cc
56      )
57  endif()
58
59  if (ENABLE_DCMTK_NETWORKING)
60    AUX_SOURCE_DIRECTORY(${DCMTK_SOURCES_DIR}/dcmnet/libsrc DCMTK_SOURCES)
61    include_directories(
62      ${DCMTK_SOURCES_DIR}/dcmnet/include
63      )
64  endif()
65
66  if (ENABLE_DCMTK_TRANSCODING)
67    AUX_SOURCE_DIRECTORY(${DCMTK_SOURCES_DIR}/dcmimgle/libsrc DCMTK_SOURCES)
68    AUX_SOURCE_DIRECTORY(${DCMTK_SOURCES_DIR}/dcmimage/libsrc DCMTK_SOURCES)
69    include_directories(
70      ${DCMTK_SOURCES_DIR}/dcmimage/include
71      )
72  endif()
73
74  if (ENABLE_DCMTK_JPEG)
75    AUX_SOURCE_DIRECTORY(${DCMTK_SOURCES_DIR}/dcmjpeg/libsrc DCMTK_SOURCES)
76    AUX_SOURCE_DIRECTORY(${DCMTK_SOURCES_DIR}/dcmjpeg/libijg8 DCMTK_SOURCES)
77    AUX_SOURCE_DIRECTORY(${DCMTK_SOURCES_DIR}/dcmjpeg/libijg12 DCMTK_SOURCES)
78    AUX_SOURCE_DIRECTORY(${DCMTK_SOURCES_DIR}/dcmjpeg/libijg16 DCMTK_SOURCES)
79    include_directories(
80      ${DCMTK_SOURCES_DIR}/dcmjpeg/include
81      ${DCMTK_SOURCES_DIR}/dcmjpeg/libijg8
82      ${DCMTK_SOURCES_DIR}/dcmjpeg/libijg12
83      ${DCMTK_SOURCES_DIR}/dcmjpeg/libijg16
84      ${DCMTK_SOURCES_DIR}/dcmimgle/include
85      )
86    list(REMOVE_ITEM DCMTK_SOURCES
87      ${DCMTK_SOURCES_DIR}/dcmjpeg/libsrc/ddpiimpl.cc
88
89      # Solves linking problem in WebAssembly: "wasm-ld: error:
90      # duplicate symbol: jaritab" (modification in Orthanc 1.5.9)
91      ${DCMTK_SOURCES_DIR}/dcmjpeg/libijg8/jaricom.c
92      ${DCMTK_SOURCES_DIR}/dcmjpeg/libijg12/jaricom.c
93      ${DCMTK_SOURCES_DIR}/dcmjpeg/libijg24/jaricom.c
94      )
95
96    if (NOT ENABLE_DCMTK_TRANSCODING)
97      list(REMOVE_ITEM DCMTK_SOURCES
98        # Disable support for encoding JPEG (modification in Orthanc 1.0.1)
99        ${DCMTK_SOURCES_DIR}/dcmjpeg/libsrc/djcodece.cc
100        ${DCMTK_SOURCES_DIR}/dcmjpeg/libsrc/djencsv1.cc
101        ${DCMTK_SOURCES_DIR}/dcmjpeg/libsrc/djencbas.cc
102        ${DCMTK_SOURCES_DIR}/dcmjpeg/libsrc/djencpro.cc
103        ${DCMTK_SOURCES_DIR}/dcmjpeg/libsrc/djenclol.cc
104        ${DCMTK_SOURCES_DIR}/dcmjpeg/libsrc/djencode.cc
105        ${DCMTK_SOURCES_DIR}/dcmjpeg/libsrc/djencext.cc
106        ${DCMTK_SOURCES_DIR}/dcmjpeg/libsrc/djencsps.cc
107        )
108    endif()
109  endif()
110
111
112  if (ENABLE_DCMTK_JPEG_LOSSLESS)
113    AUX_SOURCE_DIRECTORY(${DCMTK_SOURCES_DIR}/dcmjpls/libsrc DCMTK_SOURCES)
114    AUX_SOURCE_DIRECTORY(${DCMTK_SOURCES_DIR}/dcmjpls/libcharls DCMTK_SOURCES)
115    include_directories(
116      ${DCMTK_SOURCES_DIR}/dcmjpeg/include
117      ${DCMTK_SOURCES_DIR}/dcmjpls/include
118      ${DCMTK_SOURCES_DIR}/dcmjpls/libcharls
119      )
120    list(APPEND DCMTK_SOURCES
121      ${DCMTK_SOURCES_DIR}/dcmjpeg/libsrc/djrplol.cc
122      )
123
124    if (NOT ENABLE_DCMTK_TRANSCODING)
125      list(REMOVE_ITEM DCMTK_SOURCES
126        ${DCMTK_SOURCES_DIR}/dcmjpls/libsrc/djcodece.cc
127
128        # Disable support for encoding JPEG-LS (modification in Orthanc 1.0.1)
129        ${DCMTK_SOURCES_DIR}/dcmjpls/libsrc/djencode.cc
130        )
131    endif()
132  endif()
133
134
135  # This fixes crashes related to the destruction of the DCMTK OFLogger
136  # http://support.dcmtk.org/docs-snapshot/file_macros.html
137  add_definitions(
138    -DLOG4CPLUS_DISABLE_FATAL=1
139    -DDCMTK_VERSION_NUMBER=${DCMTK_VERSION_NUMBER}
140    )
141
142
143  if (NOT ENABLE_DCMTK_LOG)
144    # Disable logging internal to DCMTK
145    # https://groups.google.com/d/msg/orthanc-users/v2SzzAmY948/VxT1QVGiBAAJ
146    add_definitions(
147      -DDCMTK_LOG4CPLUS_DISABLE_FATAL=1
148      -DDCMTK_LOG4CPLUS_DISABLE_ERROR=1
149      -DDCMTK_LOG4CPLUS_DISABLE_WARN=1
150      -DDCMTK_LOG4CPLUS_DISABLE_INFO=1
151      -DDCMTK_LOG4CPLUS_DISABLE_DEBUG=1
152      )
153  endif()
154
155  include_directories(
156    #${DCMTK_SOURCES_DIR}
157    ${DCMTK_SOURCES_DIR}/config/include
158    ${DCMTK_SOURCES_DIR}/ofstd/include
159    ${DCMTK_SOURCES_DIR}/oflog/include
160    ${DCMTK_SOURCES_DIR}/dcmdata/include
161    )
162
163  source_group(ThirdParty\\Dcmtk REGULAR_EXPRESSION ${DCMTK_SOURCES_DIR}/.*)
164
165  if (STANDALONE_BUILD)
166    set(DCMTK_USE_EMBEDDED_DICTIONARIES 1)
167    set(DCMTK_DICTIONARIES
168      DICTIONARY_DICOM   ${DCMTK_SOURCES_DIR}/dcmdata/data/dicom.dic
169      DICTIONARY_PRIVATE ${DCMTK_SOURCES_DIR}/dcmdata/data/private.dic
170      DICTIONARY_DICONDE ${DCMTK_SOURCES_DIR}/dcmdata/data/diconde.dic
171      )
172  else()
173    set(DCMTK_USE_EMBEDDED_DICTIONARIES 0)
174  endif()
175
176
177else()
178  if (CMAKE_CROSSCOMPILING AND
179      "${CMAKE_SYSTEM_VERSION}" STREQUAL "CrossToolNg")
180
181    CHECK_INCLUDE_FILE_CXX(dcmtk/dcmdata/dcfilefo.h HAVE_DCMTK_H)
182    if (NOT HAVE_DCMTK_H)
183      message(FATAL_ERROR "Please install the libdcmtk-dev package")
184    endif()
185
186    CHECK_LIBRARY_EXISTS(dcmdata "dcmDataDict" "" HAVE_DCMTK_LIB)
187    if (NOT HAVE_DCMTK_LIB)
188      message(FATAL_ERROR "Please install the libdcmtk package")
189    endif()
190
191    find_path(DCMTK_INCLUDE_DIRS dcmtk/config/osconfig.h
192      /usr/include
193      )
194
195    link_libraries(dcmdata dcmnet dcmjpeg oflog ofstd)
196
197  else()
198    # The following line allows one to manually add libraries at the
199    # command-line, which is necessary for Ubuntu/Debian packages
200    set(tmp "${DCMTK_LIBRARIES}")
201    include(FindDCMTK)
202    list(APPEND DCMTK_LIBRARIES "${tmp}")
203
204    include_directories(${DCMTK_INCLUDE_DIRS})
205  endif()
206
207  add_definitions(
208    -DHAVE_CONFIG_H=1
209    )
210
211  if (EXISTS "${DCMTK_config_INCLUDE_DIR}/cfunix.h")
212    set(DCMTK_CONFIGURATION_FILE "${DCMTK_config_INCLUDE_DIR}/cfunix.h")
213  elseif (EXISTS "${DCMTK_config_INCLUDE_DIR}/osconfig.h")  # This is for Arch Linux
214    set(DCMTK_CONFIGURATION_FILE "${DCMTK_config_INCLUDE_DIR}/osconfig.h")
215  elseif (EXISTS "${DCMTK_INCLUDE_DIRS}/dcmtk/config/osconfig.h")  # This is for Debian Buster
216    set(DCMTK_CONFIGURATION_FILE "${DCMTK_INCLUDE_DIRS}/dcmtk/config/osconfig.h")
217  else()
218    message(FATAL_ERROR "Please install libdcmtk*-dev")
219  endif()
220
221  message("DCMTK configuration file: ${DCMTK_CONFIGURATION_FILE}")
222
223  # Autodetection of the version of DCMTK
224  file(STRINGS
225    "${DCMTK_CONFIGURATION_FILE}"
226    DCMTK_VERSION_NUMBER1 REGEX
227    ".*PACKAGE_VERSION .*")
228
229  string(REGEX REPLACE
230    ".*PACKAGE_VERSION.*\"([0-9]*)\\.([0-9]*)\\.([0-9]*)\"$"
231    "\\1\\2\\3"
232    DCMTK_VERSION_NUMBER
233    ${DCMTK_VERSION_NUMBER1})
234
235  set(DCMTK_USE_EMBEDDED_DICTIONARIES 0)
236endif()
237
238
239add_definitions(-DDCMTK_VERSION_NUMBER=${DCMTK_VERSION_NUMBER})
240message("DCMTK version: ${DCMTK_VERSION_NUMBER}")
241
242
243add_definitions(-DDCMTK_USE_EMBEDDED_DICTIONARIES=${DCMTK_USE_EMBEDDED_DICTIONARIES})
244if (NOT DCMTK_USE_EMBEDDED_DICTIONARIES)
245  # Lookup for DICOM dictionaries, if none is specified by the user
246  if (DCMTK_DICTIONARY_DIR STREQUAL "")
247    find_path(DCMTK_DICTIONARY_DIR_AUTO dicom.dic
248      /usr/share/dcmtk
249      /usr/share/libdcmtk1
250      /usr/share/libdcmtk2
251      /usr/share/libdcmtk3
252      /usr/share/libdcmtk4
253      /usr/share/libdcmtk5
254      /usr/share/libdcmtk6
255      /usr/share/libdcmtk7
256      /usr/share/libdcmtk8
257      /usr/share/libdcmtk9
258      /usr/share/libdcmtk10
259      /usr/share/libdcmtk11
260      /usr/share/libdcmtk12
261      /usr/share/libdcmtk13
262      /usr/share/libdcmtk14
263      /usr/share/libdcmtk15
264      /usr/share/libdcmtk16
265      /usr/share/libdcmtk17
266      /usr/share/libdcmtk18
267      /usr/share/libdcmtk19
268      /usr/share/libdcmtk20
269      /usr/local/share/dcmtk
270      )
271
272    if (${DCMTK_DICTIONARY_DIR_AUTO} MATCHES "DCMTK_DICTIONARY_DIR_AUTO-NOTFOUND")
273      message(FATAL_ERROR "Cannot locate the DICOM dictionary on this system")
274    endif()
275
276    if (CMAKE_CROSSCOMPILING AND
277        "${CMAKE_SYSTEM_VERSION}" STREQUAL "CrossToolNg")
278      # Remove the sysroot prefix
279      file(RELATIVE_PATH tmp ${CMAKE_FIND_ROOT_PATH} ${DCMTK_DICTIONARY_DIR_AUTO})
280      set(DCMTK_DICTIONARY_DIR_AUTO /${tmp} CACHE INTERNAL "")
281    endif()
282
283    message("Autodetected path to the DICOM dictionaries: ${DCMTK_DICTIONARY_DIR_AUTO}")
284    add_definitions(-DDCMTK_DICTIONARY_DIR="${DCMTK_DICTIONARY_DIR_AUTO}")
285  else()
286    add_definitions(-DDCMTK_DICTIONARY_DIR="${DCMTK_DICTIONARY_DIR}")
287  endif()
288endif()
289