view CMakeLists.txt @ 540:eaca3d38b2aa laaw

many fixes
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 12 Sep 2013 12:55:07 +0200
parents ff8bee6459cd
children fe796b053863
line wrap: on
line source

cmake_minimum_required(VERSION 2.8)

project(Orthanc)

# Version of the build, should always be "mainline" except in release branches
add_definitions(
  -DORTHANC_VERSION="mainline"
  )


#####################################################################
## CMake parameters tunable at the command line
#####################################################################

# Parameters of the build
SET(STATIC_BUILD ON CACHE BOOL "Static build of the third-party libraries (necessary for Windows)")
SET(STANDALONE_BUILD ON CACHE BOOL "Standalone build (all the resources are embedded, necessary for releases)")
SET(ENABLE_SSL ON CACHE BOOL "Include support for SSL")
SET(BUILD_UNIT_TESTS ON CACHE BOOL "Build the unit tests")
SET(DCMTK_DICTIONARY_DIR "/usr/share/dcmtk" CACHE PATH "Directory containing the DCMTK dictionaries \"dicom.dic\" and \"private.dic\" (ignored in standalone builds)") 

# Advanced parameters (for Debian packaging)
SET(USE_DYNAMIC_JSONCPP OFF CACHE BOOL "Use the dynamic version of JsonCpp (only for Debian sid)")
SET(USE_DYNAMIC_GOOGLE_LOG ON CACHE BOOL "Use the dynamic version of Google Log")
SET(USE_DYNAMIC_GOOGLE_TEST ON CACHE BOOL "Use the dynamic version of Google Test (not for Debian sid)")
SET(USE_DYNAMIC_SQLITE ON CACHE BOOL "Use the dynamic version of SQLite")
SET(USE_DYNAMIC_MONGOOSE OFF CACHE BOOL "Use the dynamic version of Mongoose")
SET(USE_DYNAMIC_LUA OFF CACHE BOOL "Use the dynamic version of Lua")
SET(DEBIAN_FORCE_HARDENING OFF CACHE BOOL "Force the injection of Debian hardening flags (unrecommended)")
SET(DEBIAN_USE_GTEST_SOURCE_PACKAGE OFF CACHE BOOL "Use the sources of Google Test shipped with libgtest-dev (only for Debian sid)")
SET(ONLY_CORE_LIBRARY OFF CACHE BOOL "Only build the core library")

mark_as_advanced(USE_DYNAMIC_JSONCPP)
mark_as_advanced(USE_DYNAMIC_GOOGLE_LOG)
mark_as_advanced(USE_DYNAMIC_GOOGLE_TEST)
mark_as_advanced(USE_DYNAMIC_SQLITE)
mark_as_advanced(DEBIAN_FORCE_HARDENING)
mark_as_advanced(DEBIAN_USE_STATIC_GOOGLE_TEST)
mark_as_advanced(ONLY_CORE_LIBRARY)

# Some basic inclusions
include(CheckIncludeFiles)
include(CheckIncludeFileCXX)
include(CheckLibraryExists)
include(${CMAKE_SOURCE_DIR}/Resources/CMake/AutoGeneratedCode.cmake)
include(${CMAKE_SOURCE_DIR}/Resources/CMake/DownloadPackage.cmake)
include(${CMAKE_SOURCE_DIR}/Resources/CMake/Compiler.cmake)

set(ORTHANC_ROOT ${CMAKE_SOURCE_DIR})




#####################################################################
## Inclusion of third-party dependencies
#####################################################################

# Configuration of the standalone builds
if (${CMAKE_CROSSCOMPILING})
  # Cross-compilation implies the standalone build
  SET(STANDALONE_BUILD ON)
endif()

# Prepare the third-party dependencies
SET(THIRD_PARTY_SOURCES
  ${CMAKE_SOURCE_DIR}/Resources/md5/md5.c
  ${CMAKE_SOURCE_DIR}/Resources/base64/base64.cpp
  ${CMAKE_SOURCE_DIR}/Resources/sha1/sha1.cpp
  )

include(${CMAKE_SOURCE_DIR}/Resources/CMake/GoogleLogConfiguration.cmake)

if (${ENABLE_SSL})
  add_definitions(-DORTHANC_SSL_ENABLED=1)
  include(${CMAKE_SOURCE_DIR}/Resources/CMake/OpenSslConfiguration.cmake)
else()
  add_definitions(-DORTHANC_SSL_ENABLED=0)
endif()

include(${CMAKE_SOURCE_DIR}/Resources/CMake/BoostConfiguration.cmake)

if(NOT ONLY_CORE_LIBRARY)
  include(${CMAKE_SOURCE_DIR}/Resources/CMake/DcmtkConfiguration.cmake)
endif()

include(${CMAKE_SOURCE_DIR}/Resources/CMake/MongooseConfiguration.cmake)
include(${CMAKE_SOURCE_DIR}/Resources/CMake/ZlibConfiguration.cmake)
include(${CMAKE_SOURCE_DIR}/Resources/CMake/SQLiteConfiguration.cmake)
include(${CMAKE_SOURCE_DIR}/Resources/CMake/JsonCppConfiguration.cmake)
include(${CMAKE_SOURCE_DIR}/Resources/CMake/LibCurlConfiguration.cmake)
include(${CMAKE_SOURCE_DIR}/Resources/CMake/LibPngConfiguration.cmake)
include(${CMAKE_SOURCE_DIR}/Resources/CMake/LuaConfiguration.cmake)



#####################################################################
## Autogeneration of files
#####################################################################

# Prepare the embedded files
set(EMBEDDED_FILES
  PREPARE_DATABASE ${CMAKE_CURRENT_SOURCE_DIR}/OrthancServer/PrepareDatabase.sql
  CONFIGURATION_SAMPLE ${CMAKE_CURRENT_SOURCE_DIR}/Resources/Configuration.json
  LUA_TOOLBOX ${CMAKE_CURRENT_SOURCE_DIR}/Resources/Toolbox.lua
  )

if (${STANDALONE_BUILD})
  # We embed all the resources in the binaries for standalone builds
  add_definitions(-DORTHANC_STANDALONE=1)
  EmbedResources(
    ${EMBEDDED_FILES}
    ORTHANC_EXPLORER ${CMAKE_CURRENT_SOURCE_DIR}/OrthancExplorer
    ${DCMTK_DICTIONARIES}
    )
else()
  add_definitions(
    -DORTHANC_STANDALONE=0
    -DORTHANC_PATH=\"${CMAKE_SOURCE_DIR}\"
    )
  EmbedResources(
    ${EMBEDDED_FILES}
    )
endif()



#####################################################################
## Build the core of Orthanc
#####################################################################

list(LENGTH OPENSSL_SOURCES OPENSSL_SOURCES_LENGTH)
if (${OPENSSL_SOURCES_LENGTH} GREATER 0)
  add_library(OpenSSL STATIC ${OPENSSL_SOURCES})
endif()

add_library(CoreLibrary
  STATIC
  ${AUTOGENERATED_SOURCES}
  ${THIRD_PARTY_SOURCES}
  ${CURL_SOURCES}

  Core/Cache/MemoryCache.cpp
  Core/ChunkedBuffer.cpp
  Core/Compression/BufferCompressor.cpp
  Core/Compression/ZlibCompressor.cpp
  Core/Compression/ZipWriter.cpp
  Core/Compression/HierarchicalZipWriter.cpp
  Core/OrthancException.cpp
  Core/DicomFormat/DicomArray.cpp
  Core/DicomFormat/DicomMap.cpp
  Core/DicomFormat/DicomTag.cpp
  Core/DicomFormat/DicomIntegerPixelAccessor.cpp
  Core/DicomFormat/DicomInstanceHasher.cpp
  Core/Enumerations.cpp
  Core/FileStorage/FileStorage.cpp
  Core/FileStorage/StorageAccessor.cpp
  Core/FileStorage/CompressedFileStorageAccessor.cpp
  Core/FileStorage/FileStorageAccessor.cpp
  Core/HttpClient.cpp
  Core/HttpServer/EmbeddedResourceHttpHandler.cpp
  Core/HttpServer/FilesystemHttpHandler.cpp
  Core/HttpServer/HttpHandler.cpp
  Core/HttpServer/HttpOutput.cpp
  Core/HttpServer/MongooseServer.cpp
  Core/HttpServer/HttpFileSender.cpp
  Core/HttpServer/FilesystemHttpSender.cpp
  Core/RestApi/RestApiPath.cpp
  Core/RestApi/RestApiOutput.cpp
  Core/RestApi/RestApi.cpp
  Core/MultiThreading/BagOfRunnablesBySteps.cpp
  Core/MultiThreading/SharedMessageQueue.cpp
  Core/MultiThreading/ThreadedCommandProcessor.cpp
  Core/MultiThreading/ArrayFilledByThreads.cpp
  Core/FileFormats/PngReader.cpp
  Core/FileFormats/PngWriter.cpp
  Core/SQLite/Connection.cpp
  Core/SQLite/FunctionContext.cpp
  Core/SQLite/Statement.cpp
  Core/SQLite/StatementId.cpp
  Core/SQLite/StatementReference.cpp
  Core/SQLite/Transaction.cpp
  Core/Toolbox.cpp
  Core/Uuid.cpp
  Core/Lua/LuaContext.cpp
  Core/Lua/LuaFunctionCall.cpp

  OrthancCppClient/OrthancConnection.cpp
  OrthancCppClient/Study.cpp
  OrthancCppClient/Series.cpp
  OrthancCppClient/Instance.cpp
  OrthancCppClient/Patient.cpp
  )  



if(NOT ONLY_CORE_LIBRARY)
  #####################################################################
  ## Build the Orthanc server
  #####################################################################

  add_library(ServerLibrary
    STATIC
    ${DCMTK_SOURCES}
    OrthancServer/DicomProtocol/DicomFindAnswers.cpp
    OrthancServer/DicomProtocol/DicomServer.cpp
    OrthancServer/DicomProtocol/DicomUserConnection.cpp
    OrthancServer/FromDcmtkBridge.cpp
    OrthancServer/Internals/CommandDispatcher.cpp
    OrthancServer/Internals/FindScp.cpp
    OrthancServer/Internals/MoveScp.cpp
    OrthancServer/Internals/StoreScp.cpp
    OrthancServer/OrthancInitialization.cpp
    OrthancServer/OrthancRestApi.cpp
    OrthancServer/ServerIndex.cpp
    OrthancServer/ToDcmtkBridge.cpp
    OrthancServer/DatabaseWrapper.cpp
    OrthancServer/ServerContext.cpp
    OrthancServer/ServerEnumerations.cpp
    OrthancServer/ServerToolbox.cpp
    )

  # Ensure autogenerated code is built before building ServerLibrary
  add_dependencies(ServerLibrary CoreLibrary)

  add_executable(Orthanc
    OrthancServer/main.cpp
    )

  target_link_libraries(Orthanc ServerLibrary CoreLibrary)

  if (${OPENSSL_SOURCES_LENGTH} GREATER 0)
    target_link_libraries(Orthanc OpenSSL)
  endif()

  install(
    TARGETS Orthanc
    RUNTIME DESTINATION bin
    )


  #####################################################################
  ## Build the unit tests if required
  #####################################################################

  if (BUILD_UNIT_TESTS)
    add_definitions(-DORTHANC_BUILD_UNIT_TESTS=1)
    include(${CMAKE_SOURCE_DIR}/Resources/CMake/GoogleTestConfiguration.cmake)
    add_executable(UnitTests
      ${GTEST_SOURCES}
      UnitTests/FileStorage.cpp
      UnitTests/MemoryCache.cpp
      UnitTests/Png.cpp
      UnitTests/RestApi.cpp
      UnitTests/SQLite.cpp
      UnitTests/SQLiteChromium.cpp
      UnitTests/ServerIndex.cpp
      UnitTests/Versions.cpp
      UnitTests/Zip.cpp
      UnitTests/Lua.cpp
      UnitTests/main.cpp
      )
    target_link_libraries(UnitTests ServerLibrary CoreLibrary)

    if (${OPENSSL_SOURCES_LENGTH} GREATER 0)
      target_link_libraries(UnitTests OpenSSL)
    endif()

  endif()
endif()


#####################################################################
## Create the standalone DLL containing the Orthanc Client API
#####################################################################

include_directories(${ORTHANC_ROOT}/OrthancCppClient/Package/Laaw)

if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
  if (${CMAKE_SIZEOF_VOID_P} EQUAL 4)
    set(ORTHANC_CPP_CLIENT_AUX ${ORTHANC_ROOT}/OrthancCppClient/Package/Build/Windows32.def)
  elseif (${CMAKE_SIZEOF_VOID_P} EQUAL 8)
    set(ORTHANC_CPP_CLIENT_AUX ${ORTHANC_ROOT}/OrthancCppClient/Package/Build/Windows64.def)
  else()
    message(FATAL_ERROR "Support your platform here")
  endif()
else()
  set(ORTHANC_CPP_CLIENT_AUX ${OPENSSL_SOURCES})
endif()

add_library(OrthancClient SHARED
  ${ORTHANC_ROOT}/Core/OrthancException.cpp
  ${ORTHANC_ROOT}/Core/Enumerations.cpp
  ${ORTHANC_ROOT}/Core/Toolbox.cpp
  ${ORTHANC_ROOT}/Core/HttpClient.cpp
  ${ORTHANC_ROOT}/Core/MultiThreading/ArrayFilledByThreads.cpp
  ${ORTHANC_ROOT}/Core/MultiThreading/ThreadedCommandProcessor.cpp
  ${ORTHANC_ROOT}/Core/MultiThreading/SharedMessageQueue.cpp
  ${ORTHANC_ROOT}/Core/FileFormats/PngReader.cpp
  ${ORTHANC_ROOT}/OrthancCppClient/OrthancConnection.cpp
  ${ORTHANC_ROOT}/OrthancCppClient/Series.cpp
  ${ORTHANC_ROOT}/OrthancCppClient/Study.cpp
  ${ORTHANC_ROOT}/OrthancCppClient/Instance.cpp
  ${ORTHANC_ROOT}/OrthancCppClient/Patient.cpp
  ${ORTHANC_ROOT}/OrthancCppClient/Package/SharedLibrary.cpp
  ${ORTHANC_ROOT}/Resources/sha1/sha1.cpp
  ${ORTHANC_ROOT}/Resources/md5/md5.c
  ${ORTHANC_ROOT}/Resources/base64/base64.cpp
  ${ORTHANC_CPP_CLIENT_AUX}
  ${THIRD_PARTY_SOURCES}
  ${CURL_SOURCES}
  )

if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
  set_target_properties(OrthancClient
    PROPERTIES LINK_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined -Wl,--as-needed -Wl,--version-script=${ORTHANC_ROOT}/OrthancCppClient/Package/Laaw/VersionScript.map"
    )
  target_link_libraries(OrthancClient pthread)
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
  target_link_libraries(OrthancClient OpenSSL)

  if (${CMAKE_COMPILER_IS_GNUCXX})
    set_target_properties(OrthancClient
      PROPERTIES LINK_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--allow-multiple-definition -static-libgcc -static-libstdc++"
      )
    target_link_libraries(OrthancClient ws2_32)
  else()
    message(FATAL_ERROR "Support Visual Studio here")
  endif()
else()
  message(FATAL_ERROR "Support your platform here")
endif()

# Copy the header file of the client library to the build directory
add_custom_command(
  TARGET OrthancClient PRE_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy
  ${ORTHANC_ROOT}/OrthancCppClient/Package/AUTOGENERATED/OrthancCppClient.h 
  ${CMAKE_BINARY_DIR})


#####################################################################
## Generate the documentation if Doxygen is present
#####################################################################

find_package(Doxygen)
if (DOXYGEN_FOUND)
  configure_file(
    ${CMAKE_SOURCE_DIR}/Resources/Orthanc.doxygen
    ${CMAKE_CURRENT_BINARY_DIR}/Orthanc.doxygen
    @ONLY)
  add_custom_target(doc
    ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Orthanc.doxygen
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    COMMENT "Generating API documentation with Doxygen" VERBATIM
    )
else()
  message("Doxygen not found. The documentation will not be built.")
endif()