if(QT_VERSION_MAJOR GREATER_EQUAL 6)
    set(LSF_PROVIDER_NAME lomiri-storage-framework-qt${QT_VERSION_MAJOR}-provider-${LSF_PROVIDER_API_VERSION})
    set(LSF_PROVIDER_INCLUDE_NAME ${LSF_PROVIDER_NAME})
else()
    set(LSF_PROVIDER_NAME lomiri-storage-framework-provider)
    set(LSF_PROVIDER_INCLUDE_NAME ${LSF_PROVIDER_NAME}-${LSF_PROVIDER_API_VERSION})
endif()

include_directories(${CMAKE_CURRENT_BINARY_DIR})

qt_add_dbus_adaptor(generated_files ${CMAKE_SOURCE_DIR}/data/provider.xml lomiri/storage/provider/internal/ProviderInterface.h
    lomiri::storage::provider::internal::ProviderInterface
)

set_source_files_properties(bus.xml PROPERTIES CLASSNAME BusInterface)
qt_add_dbus_interface(generated_files bus.xml businterface)

set_source_files_properties(${generated_files} PROPERTIES
  COMPILE_FLAGS "-Wno-ctor-dtor-privacy -Wno-missing-field-initializers"
  GENERATED TRUE
)

add_custom_target(sf-provider-generated-files DEPENDS ${generated_files})

add_library(lsf-provider-objects OBJECT
  DownloadJob.cpp
  Exceptions.cpp
  ProviderBase.cpp
  Server.cpp
  TempfileUploadJob.cpp
  UploadJob.cpp
  testing/TestServer.cpp
  internal/AccountData.cpp
  internal/DBusPeerCache.cpp
  internal/DownloadJobImpl.cpp
  internal/FixedAccountData.cpp
  internal/Handler.cpp
  internal/MainLoopExecutor.cpp
  internal/OnlineAccountData.cpp
  internal/PendingJobs.cpp
  internal/ProviderInterface.cpp
  internal/ServerImpl.cpp
  internal/TempfileUploadJobImpl.cpp
  internal/TestServerImpl.cpp
  internal/UploadJobImpl.cpp
  internal/dbusmarshal.cpp
  ${CMAKE_SOURCE_DIR}/include/lomiri/storage/provider/internal/AccountData.h
  ${CMAKE_SOURCE_DIR}/include/lomiri/storage/provider/internal/DownloadJobImpl.h
  ${CMAKE_SOURCE_DIR}/include/lomiri/storage/provider/internal/FixedAccountData.h
  ${CMAKE_SOURCE_DIR}/include/lomiri/storage/provider/internal/Handler.h
  ${CMAKE_SOURCE_DIR}/include/lomiri/storage/provider/internal/MainLoopExecutor.h
  ${CMAKE_SOURCE_DIR}/include/lomiri/storage/provider/internal/OnlineAccountData.h
  ${CMAKE_SOURCE_DIR}/include/lomiri/storage/provider/internal/PendingJobs.h
  ${CMAKE_SOURCE_DIR}/include/lomiri/storage/provider/internal/ProviderInterface.h
  ${CMAKE_SOURCE_DIR}/include/lomiri/storage/provider/internal/ServerImpl.h
  ${CMAKE_SOURCE_DIR}/include/lomiri/storage/provider/internal/TempfileUploadJobImpl.h
  ${CMAKE_SOURCE_DIR}/include/lomiri/storage/provider/internal/UploadJobImpl.h
)

set_source_files_properties(internal/ProviderInterface.cpp PROPERTIES
  COMPILE_FLAGS "-Wno-missing-field-initializers"
)

add_dependencies(lsf-provider-objects sf-provider-generated-files)
set_target_properties(lsf-provider-objects PROPERTIES
  AUTOMOC TRUE
)
target_compile_options(lsf-provider-objects PUBLIC
  -DBOOST_THREAD_VERSION=4
  -DBOOST_THREAD_PROVIDES_EXECUTORS)
target_link_libraries(lsf-provider-objects PUBLIC
  lomiri-storage-framework-common-internal
  Qt${QT_VERSION_MAJOR}::Core
  Qt${QT_VERSION_MAJOR}::DBus
  Qt${QT_VERSION_MAJOR}::Network
  ${Boost_LIBRARIES}
  PkgConfig::APPARMOR_DEPS
  PkgConfig::ONLINEACCOUNTS_DEPS
)

add_library(lomiri-storage-framework-provider SHARED
  ${generated_files})

set_target_properties(lomiri-storage-framework-provider PROPERTIES
  AUTOMOC TRUE
  LINK_FLAGS "-Wl,--no-undefined"
  OUTPUT_NAME ${LSF_PROVIDER_NAME}
  SOVERSION ${LSF_PROVIDER_SOVERSION}
  VERSION ${LSF_PROVIDER_LIBVERSION}
)
target_compile_options(lomiri-storage-framework-provider PUBLIC
  $<TARGET_PROPERTY:lsf-provider-objects,COMPILE_OPTIONS>)
target_link_libraries(lomiri-storage-framework-provider PUBLIC
  lsf-provider-objects)

install(
  TARGETS lomiri-storage-framework-provider
  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)

# Build a static version of the library so that tests have access to
# hidden visibility symbols.
add_library(lomiri-storage-framework-provider-static STATIC
  ${generated_files})
set_target_properties(lomiri-storage-framework-provider-static PROPERTIES
  AUTOMOC TRUE
  )
target_compile_options(lomiri-storage-framework-provider-static PUBLIC
  $<TARGET_PROPERTY:lsf-provider-objects,COMPILE_OPTIONS>)
target_link_libraries(lomiri-storage-framework-provider-static PUBLIC
  lsf-provider-objects)

configure_file(
  lomiri-storage-framework-provider.pc.in
  ${LSF_PROVIDER_NAME}.pc
)
install(
  FILES ${CMAKE_CURRENT_BINARY_DIR}/${LSF_PROVIDER_NAME}.pc
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
)
