diff OrthancStone/Resources/CMake/OrthancStoneConfiguration.cmake @ 1512:244ad1e4e76a

reorganization of folders
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 07 Jul 2020 16:21:02 +0200
parents Resources/CMake/OrthancStoneConfiguration.cmake@b7210c688ca7
children 3eca4f9c2827
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancStone/Resources/CMake/OrthancStoneConfiguration.cmake	Tue Jul 07 16:21:02 2020 +0200
@@ -0,0 +1,639 @@
+# Stone of Orthanc
+# Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
+# Department, University Hospital of Liege, Belgium
+# Copyright (C) 2017-2020 Osimis S.A., Belgium
+#
+# This program is free software: you can redistribute it and/or
+# modify it under the terms of the GNU Affero General Public License
+# as published by the Free Software Foundation, either version 3 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Affero General Public License for more details.
+# 
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+#####################################################################
+## Configure the Orthanc Framework
+#####################################################################
+
+if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "system")
+  include(${CMAKE_CURRENT_LIST_DIR}/../Orthanc/CMake/DownloadOrthancFramework.cmake)
+  link_libraries(${ORTHANC_FRAMEWORK_LIBRARIES})
+
+  # Switch to the C++11 standard if the version of JsonCpp is 1.y.z
+  if (EXISTS ${JSONCPP_INCLUDE_DIR}/json/version.h)
+    file(STRINGS
+      "${JSONCPP_INCLUDE_DIR}/json/version.h" 
+      JSONCPP_VERSION_MAJOR1 REGEX
+      ".*define JSONCPP_VERSION_MAJOR.*")
+
+    if (NOT JSONCPP_VERSION_MAJOR1)
+      message(FATAL_ERROR "Unable to extract the major version of JsonCpp")
+    endif()
+    
+    string(REGEX REPLACE
+      ".*JSONCPP_VERSION_MAJOR.*([0-9]+)$" "\\1" 
+      JSONCPP_VERSION_MAJOR ${JSONCPP_VERSION_MAJOR1})
+    message("JsonCpp major version: ${JSONCPP_VERSION_MAJOR}")
+
+    if (JSONCPP_VERSION_MAJOR GREATER 0)
+      message("Switching to C++11 standard")
+      if (CMAKE_COMPILER_IS_GNUCXX)
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
+      elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
+      endif()
+    endif()
+  endif()
+  
+else()
+  if (ENABLE_DCMTK)
+    set(ENABLE_LOCALE ON)
+  else()
+    if (NOT DEFINED ENABLE_LOCALE)
+      set(ENABLE_LOCALE OFF)  # Disable support for locales (notably in Boost)
+    endif()
+  endif()
+  
+  include(${ORTHANC_FRAMEWORK_ROOT}/Resources/CMake/OrthancFrameworkConfiguration.cmake)
+  include_directories(
+    ${ORTHANC_FRAMEWORK_ROOT}/Sources/
+    )
+endif()
+
+
+#####################################################################
+## Sanity check of the configuration
+#####################################################################
+
+if (ORTHANC_SANDBOXED)
+  if (ENABLE_CURL)
+    message(FATAL_ERROR "Cannot enable curl in sandboxed environments")
+  endif()
+
+  if (ENABLE_SDL)
+    message(FATAL_ERROR "Cannot enable SDL in sandboxed environments")
+  endif()
+
+  if (ENABLE_SSL)
+    message(FATAL_ERROR "Cannot enable SSL in sandboxed environments")
+  endif()
+endif()
+
+if (ENABLE_OPENGL)
+  if (NOT ENABLE_SDL AND NOT ENABLE_WASM)
+    message(FATAL_ERROR "Cannot enable OpenGL if WebAssembly and SDL are both disabled")
+  endif()
+endif()
+
+if (ENABLE_WASM)
+  if (NOT ORTHANC_SANDBOXED)
+    message(FATAL_ERROR "WebAssembly target must me configured as sandboxed")
+  endif()
+
+  if (NOT CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
+    message(FATAL_ERROR "WebAssembly target requires the emscripten compiler")    
+  endif()
+
+  set(ENABLE_THREADS OFF)
+  add_definitions(-DORTHANC_ENABLE_WASM=1)
+else()
+  if (CMAKE_SYSTEM_NAME STREQUAL "Emscripten" OR
+      CMAKE_SYSTEM_NAME STREQUAL "PNaCl" OR
+      CMAKE_SYSTEM_NAME STREQUAL "NaCl32" OR
+      CMAKE_SYSTEM_NAME STREQUAL "NaCl64")
+    message(FATAL_ERROR "Trying to use a Web compiler for a native build")
+  endif()
+
+  set(ENABLE_THREADS ON)
+  add_definitions(-DORTHANC_ENABLE_WASM=0)
+endif()
+  
+
+#####################################################################
+## Configure mandatory third-party components
+#####################################################################
+
+include(FindPkgConfig)
+include(${CMAKE_CURRENT_LIST_DIR}/CairoConfiguration.cmake)
+include(${CMAKE_CURRENT_LIST_DIR}/FreetypeConfiguration.cmake)
+include(${CMAKE_CURRENT_LIST_DIR}/PixmanConfiguration.cmake)
+
+
+
+#####################################################################
+## Configure optional third-party components
+#####################################################################
+
+if (NOT ORTHANC_SANDBOXED)
+  list(APPEND ORTHANC_STONE_SOURCES
+    ${ORTHANC_STONE_ROOT}/Sources/Toolbox/OrthancDatasets/OrthancHttpConnection.cpp
+    )
+endif()
+
+
+if(ENABLE_SDL)
+  message("SDL is enabled")
+  include(${CMAKE_CURRENT_LIST_DIR}/SdlConfiguration.cmake)
+  add_definitions(
+    -DORTHANC_ENABLE_SDL=1
+    )
+else()
+  message("SDL is disabled")
+  unset(USE_SYSTEM_SDL CACHE)
+  add_definitions(
+    -DORTHANC_ENABLE_SDL=0
+    )
+endif()
+
+
+if (ENABLE_THREADS)
+  add_definitions(-DORTHANC_ENABLE_THREADS=1)
+else()
+  add_definitions(-DORTHANC_ENABLE_THREADS=0)
+endif()
+
+
+if (ENABLE_OPENGL AND CMAKE_SYSTEM_NAME STREQUAL "Windows")
+  include(${CMAKE_CURRENT_LIST_DIR}/GlewConfiguration.cmake)
+  add_definitions(
+    -DORTHANC_ENABLE_GLEW=1
+    )
+else()
+  add_definitions(
+    -DORTHANC_ENABLE_GLEW=0
+    )
+endif()
+
+
+if (ENABLE_OPENGL)
+  if (NOT CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
+    # If including "FindOpenGL.cmake" using Emscripten (targeting
+    # WebAssembly), the "OPENGL_LIBRARIES" value incorrectly includes
+    # the "nul" library, which leads to warning message in Emscripten:
+    # 'shared:WARNING: emcc: cannot find library "nul"'.
+    include(FindOpenGL)
+    if (NOT OPENGL_FOUND)
+      message(FATAL_ERROR "Cannot find OpenGL on your system")
+    endif()
+
+    link_libraries(${OPENGL_LIBRARIES})
+  endif()
+
+  add_definitions(
+    -DORTHANC_ENABLE_OPENGL=1
+    )
+else()
+  add_definitions(-DORTHANC_ENABLE_OPENGL=0)  
+endif()
+
+
+
+#####################################################################
+## Configuration of the C/C++ macros
+#####################################################################
+
+if (MSVC)
+  # Remove some warnings on Visual Studio 2015
+  add_definitions(-D_SCL_SECURE_NO_WARNINGS=1) 
+endif()
+
+add_definitions(
+  -DHAS_ORTHANC_EXCEPTION=1
+  )
+
+if (CMAKE_BUILD_TYPE STREQUAL "Debug")
+  add_definitions(-DCHECK_OBSERVERS_MESSAGES)
+endif()
+
+
+
+#####################################################################
+## System-specific patches
+#####################################################################
+
+if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows" AND
+    NOT MSVC AND
+    ENABLE_SDL)
+  # This is necessary when compiling EXE for Windows using MinGW
+  link_libraries(mingw32)
+endif()
+
+if (ORTHANC_SANDBOXED)
+  # Remove functions not suitable for a sandboxed environment
+  list(REMOVE_ITEM ORTHANC_CORE_SOURCES
+    ${ZLIB_SOURCES_DIR}/gzlib.c
+    ${ZLIB_SOURCES_DIR}/gzwrite.c
+    ${ZLIB_SOURCES_DIR}/gzread.c
+    )
+endif()
+
+
+
+#####################################################################
+## All the source files required to build Stone of Orthanc
+#####################################################################
+
+if (NOT ORTHANC_SANDBOXED)
+  set(PLATFORM_SOURCES
+    ${ORTHANC_STONE_ROOT}/Sources/Loaders/GenericLoadersContext.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Loaders/GenericLoadersContext.h
+    )
+
+  if (ENABLE_SDL)
+    list(APPEND ORTHANC_STONE_SOURCES
+      ${ORTHANC_STONE_ROOT}/Sources/Viewport/SdlWindow.cpp
+      ${ORTHANC_STONE_ROOT}/Sources/Viewport/SdlWindow.h
+      )
+  endif()
+
+  if (ENABLE_SDL)
+    if (ENABLE_OPENGL)
+      list(APPEND ORTHANC_STONE_SOURCES
+        ${ORTHANC_STONE_ROOT}/Sources/OpenGL/SdlOpenGLContext.cpp
+        ${ORTHANC_STONE_ROOT}/Sources/OpenGL/SdlOpenGLContext.h
+        ${ORTHANC_STONE_ROOT}/Sources/Viewport/SdlViewport.cpp
+        ${ORTHANC_STONE_ROOT}/Sources/Viewport/SdlViewport.h
+        )
+    endif()
+  endif()
+endif()
+
+
+if (ENABLE_DCMTK)
+  list(APPEND ORTHANC_STONE_SOURCES
+    ${ORTHANC_STONE_ROOT}/Sources/Oracle/ParseDicomSuccessMessage.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Toolbox/ParsedDicomCache.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Toolbox/ParsedDicomDataset.cpp
+    )
+endif()
+
+if (ENABLE_THREADS)
+  list(APPEND ORTHANC_STONE_SOURCES
+    ${ORTHANC_STONE_ROOT}/Sources/Oracle/ThreadedOracle.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Oracle/GenericOracleRunner.cpp
+    )
+endif()
+
+
+if (ENABLE_WASM)
+  list(APPEND ORTHANC_STONE_SOURCES
+    ${ORTHANC_STONE_ROOT}/Sources/Loaders/WebAssemblyLoadersContext.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Oracle/WebAssemblyOracle.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Viewport/WebAssemblyCairoViewport.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Viewport/WebAssemblyViewport.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Viewport/WebAssemblyViewport.h
+    )
+endif()
+
+if ((ENABLE_SDL OR ENABLE_WASM) AND ENABLE_GUIADAPTER)
+  list(APPEND APPLICATIONS_SOURCES
+    ${ORTHANC_STONE_ROOT}/Sources/Deprecated/GuiAdapter.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Deprecated/GuiAdapter.h
+    )
+endif()
+
+
+list(APPEND ORTHANC_STONE_SOURCES
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/OrthancDatasets/DicomDatasetReader.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/OrthancDatasets/DicomPath.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/OrthancDatasets/FullOrthancDataset.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/OrthancDatasets/IOrthancConnection.cpp
+
+  ${ORTHANC_STONE_ROOT}/Sources/Fonts/FontRenderer.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Fonts/Glyph.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Fonts/GlyphAlphabet.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Fonts/GlyphBitmapAlphabet.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Fonts/GlyphTextureAlphabet.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Fonts/TextBoundingBox.cpp
+
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/BasicFetchingItemsSorter.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/BasicFetchingItemsSorter.h
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/BasicFetchingStrategy.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/BasicFetchingStrategy.h
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/DicomResourcesLoader.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/DicomSource.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/DicomStructureSetLoader.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/DicomStructureSetLoader.h
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/DicomVolumeLoader.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/IFetchingItemsSorter.h
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/IFetchingStrategy.h
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/LoadedDicomResources.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/LoaderCache.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/LoaderCache.h
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/LoaderStateMachine.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/LoaderStateMachine.h
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/OrthancMultiframeVolumeLoader.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/OrthancMultiframeVolumeLoader.h
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/OracleScheduler.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/OrthancSeriesVolumeProgressiveLoader.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/OrthancSeriesVolumeProgressiveLoader.h
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/SeriesFramesLoader.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/SeriesMetadataLoader.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/SeriesOrderedFrames.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Loaders/SeriesThumbnailsLoader.cpp
+
+  ${ORTHANC_STONE_ROOT}/Sources/Messages/ICallable.h
+  ${ORTHANC_STONE_ROOT}/Sources/Messages/IMessage.h
+  ${ORTHANC_STONE_ROOT}/Sources/Messages/IMessageEmitter.h
+  ${ORTHANC_STONE_ROOT}/Sources/Messages/IObservable.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Messages/IObservable.h
+  ${ORTHANC_STONE_ROOT}/Sources/Messages/IObserver.h
+  ${ORTHANC_STONE_ROOT}/Sources/Messages/ObserverBase.h
+
+  ${ORTHANC_STONE_ROOT}/Sources/Oracle/GetOrthancImageCommand.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Oracle/GetOrthancWebViewerJpegCommand.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Oracle/HttpCommand.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Oracle/OracleCommandBase.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Oracle/OrthancRestApiCommand.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Oracle/ParseDicomFromFileCommand.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Oracle/ParseDicomFromWadoCommand.cpp
+
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/CairoCompositor.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/CairoCompositor.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Color.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/ColorSceneLayer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/ColorTextureSceneLayer.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/ColorTextureSceneLayer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/FloatTextureSceneLayer.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/FloatTextureSceneLayer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/GrayscaleStyleConfigurator.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/GrayscaleStyleConfigurator.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/ICompositor.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/ILayerStyleConfigurator.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/InfoPanelSceneLayer.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/InfoPanelSceneLayer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/IPointerTracker.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/ISceneLayer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/LookupTableStyleConfigurator.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/LookupTableStyleConfigurator.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/LookupTableTextureSceneLayer.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/LookupTableTextureSceneLayer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/NullLayer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/PanSceneTracker.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/PanSceneTracker.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/PointerEvent.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/PointerEvent.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/PolylineSceneLayer.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/PolylineSceneLayer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/RotateSceneTracker.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/RotateSceneTracker.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Scene2D.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Scene2D.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/ScenePoint2D.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/TextSceneLayer.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/TextSceneLayer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/TextureBaseSceneLayer.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/TextureBaseSceneLayer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/ZoomSceneTracker.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/ZoomSceneTracker.h
+
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoBaseRenderer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoColorTextureRenderer.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoColorTextureRenderer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoFloatTextureRenderer.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoFloatTextureRenderer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoInfoPanelRenderer.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoInfoPanelRenderer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoLookupTableTextureRenderer.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoLookupTableTextureRenderer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoPolylineRenderer.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoPolylineRenderer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoTextRenderer.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CairoTextRenderer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CompositorHelper.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/CompositorHelper.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/FixedPointAligner.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/FixedPointAligner.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/ICairoContextProvider.h
+  
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/AngleMeasureTool.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/AngleMeasureTool.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateAngleMeasureCommand.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateAngleMeasureCommand.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateAngleMeasureTracker.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateAngleMeasureTracker.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateCircleMeasureTracker.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateCircleMeasureTracker.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateLineMeasureCommand.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateLineMeasureCommand.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateLineMeasureTracker.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateLineMeasureTracker.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateMeasureTracker.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateMeasureTracker.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/CreateSimpleTrackerAdapter.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/EditAngleMeasureCommand.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/EditAngleMeasureCommand.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/EditAngleMeasureTracker.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/EditAngleMeasureTracker.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/EditLineMeasureCommand.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/EditLineMeasureCommand.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/EditLineMeasureTracker.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/EditLineMeasureTracker.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/IFlexiblePointerTracker.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/LayerHolder.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/LayerHolder.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/LineMeasureTool.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/LineMeasureTool.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/MeasureCommands.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/MeasureCommands.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/MeasureTool.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/MeasureTool.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/MeasureToolsToolbox.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/MeasureToolsToolbox.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/MeasureTrackers.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/MeasureTrackers.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/OneGesturePointerTracker.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/OneGesturePointerTracker.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/PredeclaredTypes.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/UndoStack.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/UndoStack.h
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/ViewportController.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Scene2DViewport/ViewportController.h
+  ${ORTHANC_STONE_ROOT}/Sources/StoneEnumerations.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/StoneException.h
+  ${ORTHANC_STONE_ROOT}/Sources/StoneInitialization.cpp
+
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/AffineTransform2D.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/AffineTransform2D.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/CoordinateSystem3D.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/CoordinateSystem3D.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomInstanceParameters.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomInstanceParameters.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomStructure2.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomStructure2.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomStructurePolygon2.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomStructurePolygon2.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomStructureSet.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomStructureSet.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomStructureSet2.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomStructureSet2.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomStructureSetUtils.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DicomStructureSetUtils.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DisjointDataSet.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DynamicBitmap.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/DynamicBitmap.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/Extent2D.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/Extent2D.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/FiniteProjectiveCamera.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/FiniteProjectiveCamera.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/GenericToolbox.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/GenericToolbox.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/GeometryToolbox.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/GeometryToolbox.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/ImageGeometry.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/ImageGeometry.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/ImageToolbox.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/ImageToolbox.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/LinearAlgebra.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/LinearAlgebra.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/PixelTestPatterns.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/ShearWarpProjectiveTransform.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/ShearWarpProjectiveTransform.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/SlicesSorter.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/SlicesSorter.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/SortedFrames.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/SortedFrames.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/SubpixelReader.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/SubvoxelReader.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/TextRenderer.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/TextRenderer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/UndoRedoStack.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Toolbox/UndoRedoStack.h
+  
+  ${ORTHANC_STONE_ROOT}/Sources/Viewport/IViewport.h
+  
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/IGeometryProvider.h
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/IVolumeSlicer.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/IVolumeSlicer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/OrientedVolumeBoundingBox.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/OrientedVolumeBoundingBox.h
+
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/VolumeImageGeometry.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/VolumeImageGeometry.h
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/VolumeReslicer.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/VolumeReslicer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/VolumeSceneLayerSource.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/VolumeSceneLayerSource.h
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/DicomStructureSetSlicer2.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/DicomStructureSetSlicer2.h
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/DicomVolumeImage.h
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/DicomVolumeImage.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/DicomVolumeImage.h
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/DicomVolumeImageMPRSlicer.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/DicomVolumeImageMPRSlicer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/DicomVolumeImageReslicer.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/DicomVolumeImageReslicer.h
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/ImageBuffer3D.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Volumes/ImageBuffer3D.h
+
+  ${ORTHANC_STONE_ROOT}/Sources/Wrappers/CairoContext.cpp
+  ${ORTHANC_STONE_ROOT}/Sources/Wrappers/CairoSurface.cpp
+
+  ${PLATFORM_SOURCES}
+  ${APPLICATIONS_SOURCES}
+  ${ORTHANC_CORE_SOURCES}
+  ${ORTHANC_DICOM_SOURCES}
+
+  # Mandatory components
+  ${CAIRO_SOURCES}
+  ${FREETYPE_SOURCES}
+  ${PIXMAN_SOURCES}
+
+  # Optional components
+  ${SDL_SOURCES}
+  ${QT_SOURCES}
+  ${GLEW_SOURCES}
+  )
+
+
+if (ENABLE_OPENGL)
+  list(APPEND ORTHANC_STONE_SOURCES
+    ${ORTHANC_STONE_ROOT}/Sources/Fonts/OpenGLTextCoordinates.h
+    ${ORTHANC_STONE_ROOT}/Sources/Fonts/OpenGLTextCoordinates.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/OpenGL/OpenGLProgram.h
+    ${ORTHANC_STONE_ROOT}/Sources/OpenGL/OpenGLProgram.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/OpenGL/OpenGLShader.h
+    ${ORTHANC_STONE_ROOT}/Sources/OpenGL/OpenGLShader.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/OpenGL/OpenGLTexture.h
+    ${ORTHANC_STONE_ROOT}/Sources/OpenGL/OpenGLTexture.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/OpenGLCompositor.h
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/OpenGLCompositor.cpp
+
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLAdvancedPolylineRenderer.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLAdvancedPolylineRenderer.h
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLBasicPolylineRenderer.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLBasicPolylineRenderer.h
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLColorTextureProgram.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLColorTextureProgram.h
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLColorTextureRenderer.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLColorTextureRenderer.h
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLFloatTextureProgram.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLFloatTextureProgram.h
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLFloatTextureRenderer.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLFloatTextureRenderer.h
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLInfoPanelRenderer.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLInfoPanelRenderer.h
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLLinesProgram.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLLinesProgram.h
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLLookupTableTextureRenderer.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLLookupTableTextureRenderer.h
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLShaderVersionDirective.h
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLTextProgram.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLTextProgram.h
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLTextRenderer.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLTextRenderer.h
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLTextureProgram.cpp
+    ${ORTHANC_STONE_ROOT}/Sources/Scene2D/Internals/OpenGLTextureProgram.h
+    )
+
+  if (ENABLE_WASM)
+    list(APPEND ORTHANC_STONE_SOURCES
+      ${ORTHANC_STONE_ROOT}/Sources/OpenGL/WebAssemblyOpenGLContext.cpp
+      ${ORTHANC_STONE_ROOT}/Sources/OpenGL/WebAssemblyOpenGLContext.h
+      ${ORTHANC_STONE_ROOT}/Sources/Viewport/WebGLViewport.cpp
+      ${ORTHANC_STONE_ROOT}/Sources/Viewport/WebGLViewportsRegistry.cpp
+      )
+  endif()
+endif()
+
+##
+## TEST - Automatically add all ".h" headers to the list of sources
+##
+
+macro(AutodetectHeaderFiles SOURCES_VAR)
+  set(TMP)
+  
+  foreach(f IN LISTS ${SOURCES_VAR})
+    get_filename_component(_base ${f} NAME_WE)
+    get_filename_component(_dir ${f} DIRECTORY)
+    get_filename_component(_extension ${f} EXT)
+    set(_header ${_dir}/${_base}.h)
+    
+    if ((_extension STREQUAL ".cpp" OR
+          _extension STREQUAL ".cc" OR
+          _extension STREQUAL ".h") AND
+        EXISTS ${_header} AND
+        NOT IS_DIRECTORY ${_header} AND
+        NOT IS_SYMLINK ${_header})
+
+      # Prevent adding the header twice if it is already manually
+      # specified in the sources
+      list (FIND SOURCES_VAR ${_header} _index)
+      if (${_index} EQUAL -1)
+        list(APPEND TMP ${_header})
+      endif()
+    endif()
+  endforeach()
+
+  list(APPEND ${SOURCES_VAR} ${TMP})
+endmacro()
+
+
+AutodetectHeaderFiles(ORTHANC_STONE_SOURCES)