diff OrthancFramework/Resources/CMake/DownloadOrthancFramework.cmake @ 4496:9ea70ccf0c21

Possibility to generate a static library containing the Orthanc Framework
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 08 Feb 2021 18:34:40 +0100
parents cf44052fdf60
children e40148c916b8
line wrap: on
line diff
--- a/OrthancFramework/Resources/CMake/DownloadOrthancFramework.cmake	Thu Feb 04 18:01:07 2021 +0100
+++ b/OrthancFramework/Resources/CMake/DownloadOrthancFramework.cmake	Mon Feb 08 18:34:40 2021 +0100
@@ -428,6 +428,7 @@
 
 if (ORTHANC_FRAMEWORK_SOURCE STREQUAL "system")
   set(ORTHANC_FRAMEWORK_LIBDIR "" CACHE PATH "")
+  set(ORTHANC_FRAMEWORK_USE_SHARED ON CACHE BOOL "Whether to use the shared library or the static library")
 
   if (CMAKE_SYSTEM_NAME STREQUAL "Windows" AND
       CMAKE_COMPILER_IS_GNUCXX) # MinGW
@@ -444,6 +445,21 @@
   include(${CMAKE_CURRENT_LIST_DIR}/AutoGeneratedCode.cmake)
   set(EMBED_RESOURCES_PYTHON ${CMAKE_CURRENT_LIST_DIR}/EmbedResources.py)
 
+  # The "OrthancFramework" library must be the first one to be included
+  if ("${ORTHANC_FRAMEWORK_LIBDIR}" STREQUAL "")
+    set(ORTHANC_FRAMEWORK_LIBRARIES OrthancFramework)
+  else()
+    if(ORTHANC_FRAMEWORK_USE_SHARED)
+      list(GET CMAKE_FIND_LIBRARY_PREFIXES 0 Prefix)
+      list(GET CMAKE_FIND_LIBRARY_SUFFIXES 0 Suffix)
+    else()
+      list(GET CMAKE_FIND_LIBRARY_PREFIXES 0 Prefix)
+      list(GET CMAKE_FIND_LIBRARY_SUFFIXES 1 Suffix)
+    endif()
+    set(ORTHANC_FRAMEWORK_LIBRARIES
+      ${ORTHANC_FRAMEWORK_LIBDIR}/${Prefix}OrthancFramework${Suffix})
+  endif()
+
   if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows" OR
       ORTHANC_FRAMEWORK_STATIC)
     include_directories(${ORTHANC_FRAMEWORK_ROOT}/..)
@@ -456,7 +472,7 @@
 
     message("JsonCpp include dir: ${JSONCPP_INCLUDE_DIR}")
     include_directories(${JSONCPP_INCLUDE_DIR})
-    link_libraries(jsoncpp)
+    list(APPEND ORTHANC_FRAMEWORK_LIBRARIES jsoncpp)
 
     CHECK_INCLUDE_FILE_CXX(${JSONCPP_INCLUDE_DIR}/json/reader.h HAVE_JSONCPP_H)
     if (NOT HAVE_JSONCPP_H)
@@ -493,15 +509,17 @@
     endif()
 
     # Look for mandatory dependency Boost (cf. BoostConfiguration.cmake)
+    # NB: "locale" and "iostreams" are not required if using the shared library
     include(FindBoost)
-    find_package(Boost COMPONENTS filesystem thread system date_time regex ${ORTHANC_BOOST_COMPONENTS})
+    find_package(Boost COMPONENTS filesystem thread system date_time
+      iostreams locale regex ${ORTHANC_BOOST_COMPONENTS})
 
     if (NOT Boost_FOUND)
       message(FATAL_ERROR "Unable to locate Boost on this system")
     endif()
     
     include_directories(${Boost_INCLUDE_DIRS})
-    link_libraries(${Boost_LIBRARIES})
+    list(APPEND ORTHANC_FRAMEWORK_LIBRARIES ${Boost_LIBRARIES})
 
     # Optional component - Lua
     if (ENABLE_LUA)
@@ -512,7 +530,7 @@
       endif()
 
       include_directories(${LUA_INCLUDE_DIR})
-      link_libraries(${LUA_LIBRARIES})
+      list(APPEND ORTHANC_FRAMEWORK_LIBRARIES ${LUA_LIBRARIES})
     endif()
 
     # Optional component - SQLite
@@ -521,7 +539,7 @@
       if (NOT HAVE_SQLITE_H)
         message(FATAL_ERROR "Please install the libsqlite3-dev package")
       endif()
-      link_libraries(sqlite3)
+      list(APPEND ORTHANC_FRAMEWORK_LIBRARIES sqlite3)
     endif()
 
     # Optional component - Pugixml
@@ -530,14 +548,14 @@
       if (NOT HAVE_PUGIXML_H)
         message(FATAL_ERROR "Please install the libpugixml-dev package")
       endif()      
-      link_libraries(pugixml)
+      list(APPEND ORTHANC_FRAMEWORK_LIBRARIES pugixml)
     endif()
 
     # Optional component - DCMTK
     if (ENABLE_DCMTK)
-      include(FindDCMTK)
+      include(FindDCMTK NO_MODULE)
+      list(APPEND ORTHANC_FRAMEWORK_LIBRARIES ${DCMTK_LIBRARIES})
       include_directories(${DCMTK_INCLUDE_DIRS})
-      link_libraries(${DCMTK_LIBRARIES})
     endif()
 
     # Optional component - OpenSSL
@@ -547,7 +565,38 @@
         message(FATAL_ERROR "Unable to find OpenSSL")
       endif()
       include_directories(${OPENSSL_INCLUDE_DIR})
-      link_libraries(${OPENSSL_LIBRARIES})
+      list(APPEND ORTHANC_FRAMEWORK_LIBRARIES ${OPENSSL_LIBRARIES})
+    endif()
+  endif()
+  
+  if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "Windows" AND
+      NOT ORTHANC_FRAMEWORK_USE_SHARED)
+    # Static library has more dependencies
+
+    # Mandatory dependency: libuuid
+    CHECK_INCLUDE_FILE(uuid/uuid.h HAVE_UUID_H)
+    if (NOT HAVE_UUID_H)
+      message(FATAL_ERROR "Please install uuid-dev, e2fsprogs (OpenBSD) or e2fsprogs-libuuid (FreeBSD)")
+    endif()
+
+    find_library(LIBUUID uuid
+      PATHS
+      /usr/lib
+      /usr/local/lib
+      )
+
+    check_library_exists(${LIBUUID} uuid_generate_random "" HAVE_LIBUUID)
+    if (NOT HAVE_LIBUUID)
+      message(FATAL_ERROR "Unable to find the uuid library")
+    endif()
+
+    list(APPEND ORTHANC_FRAMEWORK_LIBRARIES ${LIBUUID})
+
+    # Optional component - libcurl
+    if (ENABLE_WEB_CLIENT)
+      include(FindCURL)
+      include_directories(${CURL_INCLUDE_DIRS})
+      list(APPEND ORTHANC_FRAMEWORK_LIBRARIES ${CURL_LIBRARIES})
     endif()
   endif()
 
@@ -570,19 +619,6 @@
   
   message("Orthanc framework include dir: ${ORTHANC_FRAMEWORK_INCLUDE_DIR}")
   include_directories(${ORTHANC_FRAMEWORK_INCLUDE_DIR})
-  
-  if ("${ORTHANC_FRAMEWORK_LIBDIR}" STREQUAL "")
-    set(ORTHANC_FRAMEWORK_LIBRARIES OrthancFramework)
-  else()
-    if (MSVC)
-      set(Suffix ".lib")
-      set(Prefix "")
-    else()
-      list(GET CMAKE_FIND_LIBRARY_PREFIXES 0 Prefix)
-      list(GET CMAKE_FIND_LIBRARY_SUFFIXES 0 Suffix)
-    endif()
-    set(ORTHANC_FRAMEWORK_LIBRARIES ${ORTHANC_FRAMEWORK_LIBDIR}/${Prefix}OrthancFramework${Suffix})
-  endif()
 
   set(CMAKE_REQUIRED_INCLUDES "${ORTHANC_FRAMEWORK_INCLUDE_DIR}")
   set(CMAKE_REQUIRED_LIBRARIES "${ORTHANC_FRAMEWORK_LIBRARIES}")