Skip to content
Snippets Groups Projects
Select Git revision
  • 463b45ecaeaaedda2ac9efb1bb6a40e65beaf6dd
  • master default protected
  • release/202005
  • release/202001
  • release/201912
  • release/201911
  • release/releaseWindowsTestOne
  • release/releaseTest
  • release/releaseWindowsTest
  • release/windowsReleaseTest
  • release/201910
  • release/qt/201910
  • release/windows-test/201910
  • release/201908
  • release/201906
  • release/201905
  • release/201904
  • release/201903
  • release/201902
  • release/201901
  • release/201812
  • 1.0.0
  • 0.3.0
  • 0.2.1
  • 0.2.0
  • 0.1.0
26 results

CMakeLists.txt

Blame
  • user avatar
    Stepan Salenikovich authored and Guillaume Roguez committed
    Move the function implementations to the .cpp file; otherwise each
    small change to the implementation causes very long lrc compilation
    time.
    
    Change-Id: I97aa4e36d72392600700220d5461c0dc0c5d4828
    Reviewed-by: default avatarGuillaume Roguez <guillaume.roguez@savoirfairelinux.com>
    3cd006d4
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    CMakeLists.txt 21.09 KiB
    CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
    
    IF(POLICY CMP0022)
       CMAKE_POLICY(SET CMP0022 NEW)
    ENDIF(POLICY CMP0022)
    
    IF(POLICY CMP0043)
       CMAKE_POLICY(SET CMP0043 NEW)
    ENDIF(POLICY CMP0043)
    
    IF(POLICY CMP0020)
       CMAKE_POLICY(SET CMP0020 NEW)
    ENDIF(POLICY CMP0020)
    
    IF(POLICY CMP0063)
       CMAKE_POLICY(SET CMP0063 NEW)
    ENDIF(POLICY CMP0063)
    
    INCLUDE(GNUInstallDirs)
    INCLUDE(CMakePackageConfigHelpers)
    INCLUDE(GenerateExportHeader)
    
    ADD_DEFINITIONS("-std=c++1y")
    ADD_DEFINITIONS(
       ${QT_DEFINITIONS}
       -fexceptions
       -O2
    )
    
    PROJECT(ringclient)
    
    # First, check is the compiler is new enough, most version of Clang are fine
    # until problems arise, checking for GCC is enough
    IF (CMAKE_COMPILER_IS_GNUCC)
       EXECUTE_PROCESS(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
       IF (GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)
          MESSAGE(STATUS "Found GCC version >= 4.8: " ${GCC_VERSION})
       ELSE()
          MESSAGE(FATAL_ERROR "Your version of GCC is too old, please install GCC 4.8 or later")
       ENDIF()
    ENDIF()
    
    SET(CMAKE_AUTOMOC TRUE)
    
    SET(LOCAL_CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/")
    SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${LOCAL_CMAKE_MODULE_PATH})
    
    SET(QT5_MODULE_PATH ${QT5_PATH}/lib/cmake)
    
    FIND_PACKAGE(Ring REQUIRED)
    FIND_PACKAGE(Qt5Core REQUIRED)
    FIND_PACKAGE(Qt5LinguistTools) # translations
    
    IF(${CMAKE_SYSTEM_NAME} MATCHES "Linux" AND NOT ENABLE_LIBWRAP)
       FIND_PACKAGE(Qt5DBus)
    ELSE()
       SET(ENABLE_LIBWRAP true)
    ENDIF()
    
    # Enable some useful warnings
    ADD_DEFINITIONS(
       -Wall
       -Wextra
       -Wmissing-declarations
       -Wmissing-noreturn
       -Wpointer-arith
       -Wcast-align
       -Wwrite-strings
       -Wformat-nonliteral
       -Wformat-security
       -Wswitch-enum
       -Winit-self
       -Wmissing-include-dirs
       -Wundef
       -Wmissing-format-attribute
       -Wno-reorder
       -Wunused
       -Wuninitialized
       -Woverloaded-virtual
       -Wunused-value
       -pedantic
       -Wnonnull
       -Wsequence-point
       #-Wsystem-headers
       -Wsizeof-pointer-memaccess
       #-Wuseless-cast
       -Wvarargs
    
       #See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55578
       -Wno-unused-function
       -Wno-attributes
    )
    
    #Add more warnings for compilers that support it. I used this command:
    #curl https://gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/Warning-Options.html | \
    #grep -E "^[\t ]+<br><dt><code>-W[a-zA-Z=-]*" -o | grep -E "\-W[a-zA-Z=-]*" -o >
    #cat /tmp/48 /tmp/49 | sort | uniq -u
    # IF (CMAKE_COMPILER_IS_GNUCC)
    
    IF (CMAKE_COMPILER_IS_GNUCC)
       IF (GCC_VERSION VERSION_GREATER 4.9 OR GCC_VERSION VERSION_EQUAL 4.9)
          ADD_DEFINITIONS(
             -Wunused-but-set-parameter
             -Wconditionally-supported
             #-Wsuggest-attribute=const
             -Wno-cpp
             -Wdouble-promotion
             -Wdate-time
             -Wdelete-incomplete
             -Wfloat-conversion
          )
       ENDIF()
    
       if (GCC_VERSION VERSION_GREATER 5.1 OR GCC_VERSION VERSION_EQUAL 5.1)
          ADD_DEFINITIONS(
             #-Wsuggest-override
             #-Wsuggest-final-types
             #-Wsuggest-final-methods
             -Wbool-compare
             -Wformat-signedness
             -Wlogical-not-parentheses
             -Wnormalized
             -Wshift-count-negative
             -Wshift-count-overflow
             -Wsized-deallocation
             -Wsizeof-array-argument
          )
       ENDIF()
    
       IF (GCC_VERSION VERSION_GREATER 6.0 OR GCC_VERSION VERSION_EQUAL 6.0)
          ADD_DEFINITIONS(
             -Wnull-dereference
             -Wshift-negative-value
             -Wshift-overflow
             -Wduplicated-cond
             -Wmisleading-indentation
          )
       ENDIF()
    ENDIF()
    
    if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
       ADD_DEFINITIONS(
          -Wno-c++98-compat
          -Wno-c++98-compat-pedantic
          -Wno-unknown-pragmas
          -Wno-documentation-unknown-command
          -Wno-padded
          -Wno-old-style-cast
          -Wno-sign-conversion
          -Wno-exit-time-destructors
          -Wno-global-constructors
          -Wno-shorten-64-to-32
          #-Weverything
       )
    endif()
    
    # OS X
    IF(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
    
       SET(CMAKE_MACOSX_RPATH ON)
       SET(CMAKE_SKIP_BUILD_RPATH FALSE)
       SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
       SET(CMAKE_INSTALL_RPATH "${CMAKE_CURRENT_SOURCE_DIR}")
       SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
    ENDIF(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
    
    IF(${ENABLE_LIBWRAP} MATCHES true)
       # The daemon is only required for when using direct linking
       IF (${RING_FOUND} MATCHES "false")
          MESSAGE(FATAL_ERROR "The daemon is required")
       ENDIF()
    
       ADD_SUBDIRECTORY(${CMAKE_SOURCE_DIR}/src/qtwrapper)
       ADD_DEFINITIONS(-DENABLE_LIBWRAP=true) # Use native calls (no dbus)
       ADD_DEFINITIONS(-Wno-unknown-pragmas)
       SET(ENABLE_QT5 true) # Use Qt5
       MESSAGE(STATUS "Compiling with qtwrapper enabled, Qt5 enabled.")
    
       INCLUDE_DIRECTORIES (${CMAKE_SOURCE_DIR}/src/qtwrapper/)
    
       IF(${VERBOSE_IPC} MATCHES true)
          MESSAGE(STATUS "Adding more debug output")
          ADD_DEFINITIONS(-DVERBOSE_IPC=true)
       ENDIF()
    ENDIF()
    
    IF (${RING_FOUND} MATCHES "true")
       INCLUDE_DIRECTORIES(${ring_INCLUDE_DIRS})
    ENDIF()
    
    IF(NOT (${ENABLE_VIDEO} MATCHES false))
       MESSAGE(STATUS "VIDEO enabled")
       SET(ENABLE_VIDEO 1 CACHE BOOLEAN "Enable video")
       add_definitions( -DENABLE_VIDEO=true )
    ENDIF(NOT (${ENABLE_VIDEO} MATCHES false))
    
    # ADD_DEFINITIONS(-DQT_DISABLE_DEPRECATED_BEFORE=1)
    
    SET(GENERIC_LIB_VERSION "1.0.0")
    
    INCLUDE_DIRECTORIES(SYSTEM ${QT_INCLUDES} )
    INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
    INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src)
    INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_BINARY_DIR})
    
    # Build dbus interfaces
    IF(DEFINED RING_XML_INTERFACES_DIR)
        SET (dbus_xml_introspecs_path ${RING_XML_INTERFACES_DIR})
    ELSEIF(EXISTS "${RING_BUILD_DIR}/../bin/dbus")
        SET (dbus_xml_introspecs_path ${RING_BUILD_DIR}/../bin/dbus)
    ELSE()
        SET (dbus_xml_introspecs_path ${CMAKE_INSTALL_PREFIX}/share/dbus-1/interfaces)
    ENDIF()
    
    #File to compile
    SET( libringclient_LIB_SRCS
      #Data objects
      src/call.cpp
      src/uri.cpp
      src/ringdevice.cpp
      src/account.cpp
      src/credential.cpp
      src/person.cpp
      src/contactmethod.cpp
      src/numbercategory.cpp
      src/macro.cpp
      src/collectionextensioninterface.cpp
      src/video/rate.cpp
      src/video/device.cpp
      src/video/renderer.cpp
      src/certificate.cpp
      src/securityflaw.cpp
      src/ringtone.cpp
      src/profile.cpp
      src/contactrequest.cpp
      src/media/media.cpp
      src/media/audio.cpp
      src/media/video.cpp
      src/media/text.cpp
      src/media/file.cpp
      src/media/recording.cpp
      src/media/avrecording.cpp
      src/media/textrecording.cpp
    
      #Models
      src/bootstrapmodel.cpp
      src/ringdevicemodel.cpp
      src/accountmodel.cpp
      src/availableaccountmodel.cpp
      src/callmodel.cpp
      src/categorizedhistorymodel.cpp
      src/categorizedbookmarkmodel.cpp
      src/credentialmodel.cpp
      src/categorizedcontactmodel.cpp
      src/useractionmodel.cpp
      src/presencestatusmodel.cpp
      src/phonedirectorymodel.cpp
      src/historytimecategorymodel.cpp
      src/numbercategorymodel.cpp
      src/macromodel.cpp
      src/keyexchangemodel.cpp
      src/tlsmethodmodel.cpp
      src/protocolmodel.cpp
      src/numbercompletionmodel.cpp
      src/profilemodel.cpp
      src/ringtonemodel.cpp
      src/lastusednumbermodel.cpp
      src/securityevaluationmodel.cpp
      src/personmodel.cpp
      src/collectionmodel.cpp
      src/collectionextensionmodel.cpp
      src/collectionmanagerinterface.cpp
      src/networkinterfacemodel.cpp
      src/certificatemodel.cpp
      src/ciphermodel.cpp
      src/accountstatusmodel.cpp
      src/codecmodel.cpp
      src/recentmodel.cpp
      src/chainoftrustmodel.cpp
      src/pendingcontactrequestmodel.cpp
      src/video/devicemodel.cpp
      src/video/sourcemodel.cpp
      src/video/channel.cpp
      src/video/resolution.cpp
      src/video/configurationproxy.cpp
      src/audio/alsapluginmodel.cpp
      src/audio/inputdevicemodel.cpp
      src/audio/managermodel.cpp
      src/audio/outputdevicemodel.cpp
      src/audio/ringtonedevicemodel.cpp
      src/audio/settings.cpp
      src/media/recordingmodel.cpp
    
      #Data collections
      src/transitionalpersonbackend.cpp
      src/collectioninterface.cpp
      src/collectioneditor.cpp
      src/fallbackpersoncollection.cpp
      src/daemoncertificatecollection.cpp
      src/foldercertificatecollection.cpp
      src/localrecordingcollection.cpp
      src/localtextrecordingcollection.cpp
      src/localhistorycollection.cpp
      src/localprofilecollection.cpp
      src/localmacrocollection.cpp
      src/localbookmarkcollection.cpp
      src/localringtonecollection.cpp
      src/peerprofilecollection.cpp
    
      #Communication
      src/dbus/configurationmanager.cpp
      src/dbus/callmanager.cpp
      src/dbus/instancemanager.cpp
      src/dbus/videomanager.cpp
      src/dbus/presencemanager.cpp
    
      #Default interface implementations
      src/globalinstances.cpp
      src/accountlistcolorizerdefault.cpp
      src/presenceserializerdefault.cpp
      src/pixmapmanipulatordefault.cpp
      src/shortcutcreatordefault.cpp
      src/actionextenderdefault.cpp
      src/dbuserrorhandlerdefault.cpp
    
      #Other
      src/hookmanager.cpp
      src/namedirectory.cpp
      src/itembase.cpp
      src/private/vcardutils.cpp
      src/private/videorenderermanager.cpp
      src/video/previewmanager.cpp
      src/private/sortproxies.cpp
      src/private/threadworker.cpp
      src/mime.cpp
      src/smartinfohub.cpp
      src/usage_statistics.cpp
    
      #Extension
      src/extensions/presencecollectionextension.cpp
      src/extensions/securityevaluationextension.cpp
    )
    
    IF(${ENABLE_LIBWRAP} MATCHES true)
       SET(libringclient_LIB_SRCS ${libringclient_LIB_SRCS}
          src/private/directrenderer.cpp
       )
    ELSE()
       SET(libringclient_LIB_SRCS ${libringclient_LIB_SRCS}
          src/private/shmrenderer.cpp
       )
    ENDIF(${ENABLE_LIBWRAP} MATCHES true)
    
    # Public API
    SET( libringclient_LIB_HDRS
      src/account.h
      src/ringdevice.h
      src/credential.h
      src/accountmodel.h
      src/availableaccountmodel.h
      src/call.h
      src/call.hpp
      src/callmodel.h
      src/categorizedhistorymodel.h
      src/person.h
      src/bootstrapmodel.h
      src/ringdevicemodel.h
      src/collectioninterface.h
      src/collectioninterface.hpp
      src/categorizedbookmarkmodel.h
      src/credentialmodel.h
      src/categorizedcontactmodel.h
      src/useractionmodel.h
      src/presencestatusmodel.h
      src/contactmethod.h
      src/phonedirectorymodel.h
      src/historytimecategorymodel.h
      src/numbercategorymodel.h
      src/keyexchangemodel.h
      src/codecmodel.h
      src/tlsmethodmodel.h
      src/protocolmodel.h
      src/numbercompletionmodel.h
      src/profilemodel.h
      src/numbercategory.h
      src/ringtonemodel.h
      src/localrecordingcollection.h
      src/localbookmarkcollection.h
      src/localringtonecollection.h
      src/localmacrocollection.h
      src/localhistorycollection.h
      src/localprofilecollection.h
      src/localtextrecordingcollection.h
      src/peerprofilecollection.h
      src/lastusednumbermodel.h
      src/securityevaluationmodel.h
      src/certificate.h
      src/personmodel.h
      src/transitionalpersonbackend.h
      src/collectionmodel.h
      src/collectionextensionmodel.h
      src/collectionextensionmodel.hpp
      src/macromodel.h
      src/hookmanager.h
      src/namedirectory.h
      src/uri.h
      src/macro.h
      src/ringtone.h
      src/profile.h
      src/itembase.h
      src/itembase.hpp
      src/mime.h
      src/collectionextensioninterface.h
      src/collectionmanagerinterface.h
      src/collectionmanagerinterface.hpp
      src/networkinterfacemodel.h
      src/certificatemodel.h
      src/ciphermodel.h
      src/accountstatusmodel.h
      src/collectionmediator.h
      src/collectionmediator.hpp
      src/collectioneditor.h
      src/collectioneditor.hpp
      src/fallbackpersoncollection.h
      src/daemoncertificatecollection.h
      src/foldercertificatecollection.h
      src/securityflaw.h
      src/collectioncreationinterface.h
      src/collectionconfigurationinterface.h
      src/recentmodel.h
      src/chainoftrustmodel.h
      src/pendingcontactrequestmodel.h
      src/contactrequest.h
      src/globalinstances.h
      src/accountlistcolorizerdefault.h
      src/presenceserializerdefault.h
      src/pixmapmanipulatordefault.h
      src/shortcutcreatordefault.h
      src/dbuserrorhandlerdefault.h
      src/itemdataroles.h
      src/smartinfohub.h
      src/usage_statistics.h
    )
    
    SET(libringclient_video_LIB_HDRS
      src/video/device.h
      src/video/devicemodel.h
      src/video/sourcemodel.h
      src/video/renderer.h
      src/video/resolution.h
      src/video/channel.h
      src/video/rate.h
      src/video/previewmanager.h
      src/video/configurationproxy.h
      #The renderer implementations are not exported on purpose
    )
    
    SET(libringclient_audio_LIB_HDRS
      src/audio/alsapluginmodel.h
      src/audio/inputdevicemodel.h
      src/audio/managermodel.h
      src/audio/outputdevicemodel.h
      src/audio/ringtonedevicemodel.h
      src/audio/settings.h
    )
    
    SET(libringclient_extensions_LIB_HDRS
      src/extensions/presencecollectionextension.h
      src/extensions/securityevaluationextension.h
    )
    
    SET(libringclient_media_LIB_HDRS
      src/media/media.h
      src/media/audio.h
      src/media/video.h
      src/media/text.h
      src/media/file.h
      src/media/recording.h
      src/media/avrecording.h
      src/media/textrecording.h
      src/media/recordingmodel.h
    )
    
    SET(libringclient_interface_LIB_HDRS
      src/interfaces/accountlistcolorizeri.h
      src/interfaces/contactmethodselectori.h
      src/interfaces/presenceserializeri.h
      src/interfaces/itemmodelstateserializeri.h
      src/interfaces/pixmapmanipulatori.h
      src/interfaces/shortcutcreatori.h
      src/interfaces/actionextenderi.h
      src/interfaces/dbuserrorhandleri.h
    )
    
    SET( libringclient_extra_LIB_HDRS
      src/typedefs.h
    )
    
    IF(${ENABLE_LIBWRAP} MATCHES true)
       # done this way because of bug in cmake 2.8
       # (not necessary in 3.0+)
    ELSE()
       # presence manager interface
       SET ( presencemanager_xml  ${dbus_xml_introspecs_path}/cx.ring.Ring.PresenceManager.xml )
    
       SET( dbus_metatype_path "${CMAKE_CURRENT_SOURCE_DIR}/src/dbus/metatypes.h")
    
       SET_SOURCE_FILES_PROPERTIES(
          ${presencemanager_xml}
          PROPERTIES
          CLASSNAME PresenceManagerInterface
          INCLUDE ${dbus_metatype_path}
       )
    
       QT5_ADD_DBUS_INTERFACE(
          libringclient_LIB_SRCS
          ${presencemanager_xml}
          presencemanager_dbus_interface
       )
    
       # configuration manager interface
       SET ( configurationmanager_xml  ${dbus_xml_introspecs_path}/cx.ring.Ring.ConfigurationManager.xml )
    
       SET_SOURCE_FILES_PROPERTIES(
          ${configurationmanager_xml}
          PROPERTIES
          CLASSNAME ConfigurationManagerInterface
          INCLUDE ${dbus_metatype_path}
       )
    
       QT5_ADD_DBUS_INTERFACE(
          libringclient_LIB_SRCS
          ${configurationmanager_xml}
          configurationmanager_dbus_interface
       )
    
       # call manager interface
       SET ( callmanager_xml  ${dbus_xml_introspecs_path}/cx.ring.Ring.CallManager.xml )
    
       SET_SOURCE_FILES_PROPERTIES(
          ${callmanager_xml}
          PROPERTIES
          CLASSNAME CallManagerInterface
          INCLUDE ${dbus_metatype_path}
       )
    
       QT5_ADD_DBUS_INTERFACE(
          libringclient_LIB_SRCS
          ${callmanager_xml}
          callmanager_dbus_interface
       )
    
       # video manager interface
       SET ( video_xml  ${dbus_xml_introspecs_path}/cx.ring.Ring.VideoManager.xml )
    
       SET_SOURCE_FILES_PROPERTIES(
          ${video_xml}
          PROPERTIES
          CLASSNAME VideoManagerInterface
          INCLUDE ${dbus_metatype_path}
       )
    
       QT5_ADD_DBUS_INTERFACE(
          libringclient_LIB_SRCS
          ${video_xml}
          video_dbus_interface
       )
    
    
       # instance interface
       SET ( instance_xml  ${dbus_xml_introspecs_path}/cx.ring.Ring.Instance.xml )
    
       SET_SOURCE_FILES_PROPERTIES(
          ${instance_xml}
          PROPERTIES
          CLASSNAME InstanceManagerInterface
          INCLUDE ${dbus_metatype_path}
       )
    
       QT5_ADD_DBUS_INTERFACE(
          libringclient_LIB_SRCS
          ${instance_xml}
          instance_dbus_interface
       )
    
    ENDIF()
    
    # Manually wrap private files and interfaces
    SET(libringclient_PRIVATE_HDRS
       src/private/call_p.h
       src/private/ringdevicemodel_p.h
       src/private/namedirectory_p.h
       src/private/account_p.h
       src/private/sortproxies.h
       src/private/accountmodel_p.h
       src/private/phonedirectorymodel_p.h
       src/private/videorenderer_p.h
       src/private/textrecording_p.h
       src/private/videodevice_p.h
       src/private/collectionmodel_p.h
       src/private/securityflaw_p.h
       src/private/macromodel_p.h
       src/private/person_p.h
       src/collectioncreationinterface.h
       src/private/securityevaluationmodel_p.h
       src/collectionconfigurationinterface.h
       src/private/imconversationmanagerprivate.h
       src/private/smartInfoHub_p.h
       src/private/certificatemodel_p.h
    )
    
    IF(${ENABLE_LIBWRAP} MATCHES true)
       SET(libringclient_PRIVATE_HDRS
          ${libringclient_PRIVATE_HDRS}
    
          src/qtwrapper/callmanager_wrap.h
          src/qtwrapper/configurationmanager_wrap.h
          src/qtwrapper/instancemanager_wrap.h
          src/qtwrapper/presencemanager_wrap.h
          src/qtwrapper/videomanager_wrap.h
       )
    ENDIF()
    
    QT5_WRAP_CPP(LIB_HEADER_MOC ${libringclient_PRIVATE_HDRS})
    
    
    ADD_LIBRARY( ringclient SHARED ${libringclient_LIB_SRCS} ${LIB_HEADER_MOC} )
    
    IF(NOT ${ENABLE_STATIC} MATCHES false)
       ADD_LIBRARY( ringclient_static  STATIC ${libringclient_LIB_SRCS} ${LIB_HEADER_MOC} )
       QT5_USE_MODULES(ringclient_static Core)
       TARGET_LINK_LIBRARIES( ringclient_static
          -lpthread
          ${QT_QTDBUS_LIBRARY}
          ${QT_QTCORE_LIBRARY}
          )
       SET_TARGET_PROPERTIES( ringclient_static
          PROPERTIES VERSION ${GENERIC_LIB_VERSION}
       )
    ENDIF()
    
    QT5_USE_MODULES(ringclient Core)
    
    IF(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
      QT5_USE_MODULES(ringclient DBus)
      IF(NOT ${ENABLE_STATIC} MATCHES false)
          QT5_USE_MODULES(ringclient_static DBus)
      ENDIF()
    ELSEIF(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
       FIND_PACKAGE(Qt5Concurrent)
    
       #For some reason, QSemaphore wont compile on Windows without QtConcurrent
       QT5_USE_MODULES(ringclient Concurrent)
    ENDIF()
    
    
    TARGET_LINK_LIBRARIES( ringclient
       -lpthread
       ${QT_QTCORE_LIBRARY}
    )
    
    IF(${ENABLE_LIBWRAP} MATCHES true)
       IF(NOT ${ring_BIN} MATCHES "ring_BIN-NOTFOUND")
          TARGET_LINK_LIBRARIES( ringclient
             qtwrapper
             ${ring_BIN}
          )
       ELSE()
          # Allow building with undefined symbols when only the daemon headers are provided
          # It speeds up our CI builds
          IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
             SET_TARGET_PROPERTIES( ringclient PROPERTIES LINK_FLAGS "-undefined dynamic_lookup" )
          ENDIF()
       ENDIF()
       IF(NOT ${ENABLE_STATIC} MATCHES false)
          TARGET_LINK_LIBRARIES( ringclient_static
             qtwrapper
             ${ring_BIN}
          )
       ENDIF()
    ELSE()
       TARGET_LINK_LIBRARIES( ringclient
          ${QT_QTDBUS_LIBRARY}
       )
    ENDIF()
    
    IF(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
       TARGET_LINK_LIBRARIES( ringclient
          -lrt
       )
    
       IF(NOT ${ENABLE_STATIC} MATCHES false)
          TARGET_LINK_LIBRARIES( ringclient_static
             -lrt
          )
       ENDIF()
    ENDIF()
    
    SET_TARGET_PROPERTIES( ringclient
      PROPERTIES VERSION ${GENERIC_LIB_VERSION} SOVERSION ${GENERIC_LIB_VERSION}
    )
    
    SET(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/include)
    
    INSTALL( FILES ${libringclient_LIB_HDRS} ${libringclient_extra_LIB_HDRS}
      DESTINATION ${INCLUDE_INSTALL_DIR}/libringclient
      COMPONENT Devel
    )
    
    INSTALL( FILES ${libringclient_video_LIB_HDRS}
      DESTINATION ${INCLUDE_INSTALL_DIR}/libringclient/video
      COMPONENT Devel
    )
    
    INSTALL( FILES ${libringclient_audio_LIB_HDRS}
      DESTINATION ${INCLUDE_INSTALL_DIR}/libringclient/audio
      COMPONENT Devel
    )
    
    INSTALL( FILES ${libringclient_media_LIB_HDRS}
      DESTINATION ${INCLUDE_INSTALL_DIR}/libringclient/media
      COMPONENT Devel
    )
    
    INSTALL( FILES ${libringclient_extensions_LIB_HDRS}
      DESTINATION ${INCLUDE_INSTALL_DIR}/libringclient/extensions
      COMPONENT Devel
    )
    
    INSTALL( FILES ${libringclient_interface_LIB_HDRS}
      DESTINATION ${INCLUDE_INSTALL_DIR}/libringclient/interfaces
      COMPONENT Devel
    )
    
    #This hack force Debian based system to return a non multi-arch path
    #this is required to prevent the .deb libringclient.so from having an
    #higher priority than the prefixed one.
    STRING(REPLACE "${CMAKE_LIBRARY_ARCHITECTURE}" "" SANE_LIBRARY_PATH "${CMAKE_INSTALL_FULL_LIBDIR}" )
    
    INSTALL( TARGETS ringclient
      ARCHIVE DESTINATION ${SANE_LIBRARY_PATH}
      RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
      LIBRARY DESTINATION ${SANE_LIBRARY_PATH}
      DESTINATION ${SANE_LIBRARY_PATH}
    )
    
    IF(NOT ${ENABLE_STATIC} MATCHES false)
       INSTALL( TARGETS ringclient_static
          ARCHIVE DESTINATION ${SANE_LIBRARY_PATH}
          LIBRARY DESTINATION ${SANE_LIBRARY_PATH}
          DESTINATION ${SANE_LIBRARY_PATH}
       )
    ENDIF()
    
    
    SET(LIB_INSTALL_DIR ${SANE_LIBRARY_PATH})
    
    # Create a CMake config file
    
    # TARGET_INCLUDE_DIRECTORIES(ringclient PUBLIC
    # "$<INSTALL_INTERFACE:$<CMAKE_INSTALL_PREFIX>/${INCLUDE_INSTALL_DIR}/libringclient>"
    # )
    SET(libringclient_CONFIG_PATH "${CMAKE_CURRENT_BINARY_DIR}/LibRingClientConfig.cmake")
    
    CONFIGURE_PACKAGE_CONFIG_FILE(
       "${CMAKE_SOURCE_DIR}/cmake/LibRingClientConfig.cmake.in" ${libringclient_CONFIG_PATH}
       INSTALL_DESTINATION ${LIB_INSTALL_DIR}/libringclient/cmake
       PATH_VARS INCLUDE_INSTALL_DIR
    )
    
    INSTALL( FILES ${libringclient_CONFIG_PATH}
      DESTINATION ${SANE_LIBRARY_PATH}/cmake/LibRingClient
      COMPONENT Devel
    )
    
    # WRITE_BASIC_PACKAGE_VERSION_FILE(
    #    ${libringclient_CONFIG_PATH}
    #    VERSION ${GENERIC_LIB_VERSION}
    #    COMPATIBILITY SameMajorVersion
    # )
    
    # translations
    IF( Qt5LinguistTools_FOUND )
       # translation template file
       SET(TS_TEMPLATE ${CMAKE_SOURCE_DIR}/translations/lrc_en.ts)
    
       # get all translation files except the template
       FILE(GLOB TS_FILES ${CMAKE_SOURCE_DIR}/translations/*.ts)
       LIST(REMOVE_ITEM TS_FILES ${TS_TEMPLATE})
    
       # compiled .qm files
       QT5_ADD_TRANSLATION(QM_FILES ${TS_FILES})
    
       ADD_CUSTOM_TARGET(translations ALL DEPENDS ${QM_FILES})
    
       INSTALL(FILES ${QM_FILES} DESTINATION "${CMAKE_INSTALL_PREFIX}/share/libringclient/translations")
    ENDIF()
    
    # uninstall target
    CONFIGURE_FILE(
        "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
        "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
        IMMEDIATE @ONLY)
    
    ADD_CUSTOM_TARGET(uninstall
        COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)