find_program( MYSQLD_EXECUTABLE NAMES mysqld
              PATHS /usr/sbin /usr/local/sbin /usr/libexec /usr/local/libexec /opt/mysql/libexec /usr/mysql/bin /opt/mysql/sbin
              DOC "The mysqld executable path. ONLY needed at runtime"
            )
if( MYSQLD_EXECUTABLE )
   message( STATUS "MySQL Server found: ${MYSQLD_EXECUTABLE}" )
else()
   message( STATUS "MySQL Server wasn't found. it is required to use the MySQL backend." )
endif()

find_path( POSTGRES_PATH NAMES pg_ctl
              HINTS /usr/lib${LIB_SUFFIX}/postgresql/8.4/bin
                    /usr/lib${LIB_SUFFIX}/postgresql/9.0/bin
                    /usr/lib${LIB_SUFFIX}/postgresql/9.1/bin
              DOC "The pg_ctl executable path. ONLY needed at runtime by the PostgreSQL backend"
         )

if( POSTGRES_PATH )
   message( STATUS "PostgreSQL Server found." )
else ()
   message( STATUS "PostgreSQL wasn't found. it is required to use the Postgres backend." )
endif()

include_directories( ${Boost_INCLUDE_DIR} )
include_directories( ${Akonadi_SOURCE_DIR}/libs )
include_directories( ${Akonadi_BINARY_DIR}/libs )
include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/src )
include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/src/handler )
include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/src/nepomuk )
include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/tests )
include_directories( ${Akonadi_SOURCE_DIR}/shared )
if (Soprano_FOUND)
  include_directories( ${SOPRANO_INCLUDE_DIR} )
endif (Soprano_FOUND)
include_directories( BEFORE ${CMAKE_CURRENT_SOURCE_DIR} )
include_directories( BEFORE ${CMAKE_CURRENT_BINARY_DIR} )

add_subdirectory( akonadictl )
add_subdirectory( control )
add_subdirectory( src )
add_subdirectory( tests )

set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_ENABLE_EXCEPTIONS}" )
if ( MYSQLD_EXECUTABLE )
  set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMYSQLD_EXECUTABLE=\"\\\"${MYSQLD_EXECUTABLE}\\\"\"" )
endif()

if ( POSTGRES_PATH )
  set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DPOSTGRES_PATH=\"\\\"${POSTGRES_PATH}\\\"\"" )
endif()

########### next target ###############

if(NOT WINCE)
   set (AKONADI_DB_SCHEME ${CMAKE_CURRENT_SOURCE_DIR}/src/storage/akonadidb.xml)
else(NOT WINCE)
   set (AKONADI_DB_SCHEME ${CMAKE_CURRENT_SOURCE_DIR}/src/storage/akonadidb-mobile.xml)
endif(NOT WINCE)

add_custom_command(
  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/entities.h
         ${CMAKE_CURRENT_BINARY_DIR}/entities.cpp
  COMMAND ${XSLTPROC_EXECUTABLE} --stringparam code header
          ${CMAKE_CURRENT_SOURCE_DIR}/src/storage/entities.xsl
          ${AKONADI_DB_SCHEME}
          > ${CMAKE_CURRENT_BINARY_DIR}/entities.h
  COMMAND ${XSLTPROC_EXECUTABLE} --stringparam code source
          ${CMAKE_CURRENT_SOURCE_DIR}/src/storage/entities.xsl
          ${AKONADI_DB_SCHEME}
          > ${CMAKE_CURRENT_BINARY_DIR}/entities.cpp
  DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/storage/entities.xsl
          ${CMAKE_CURRENT_SOURCE_DIR}/src/storage/entities-header.xsl
          ${CMAKE_CURRENT_SOURCE_DIR}/src/storage/entities-source.xsl
          ${AKONADI_DB_SCHEME}
)

set(libakonadiprivate_SRCS
  src/akonadi.cpp
  src/akonadiconnection.cpp
  src/handler.cpp
  src/handlerhelper.cpp
  src/intervalcheck.cpp
  src/response.cpp
  src/handler/akappend.cpp
  src/handler/append.cpp
  src/handler/copy.cpp
  src/handler/colcopy.cpp
  src/handler/colmove.cpp
  src/handler/create.cpp
  src/handler/capability.cpp
  src/handler/delete.cpp
  src/handler/expunge.cpp
  src/handler/fetch.cpp
  src/handler/fetchhelper.cpp
  src/handler/link.cpp
  src/handler/list.cpp
  src/handler/login.cpp
  src/handler/logout.cpp
  src/handler/modify.cpp
  src/handler/move.cpp
  src/handler/remove.cpp
  src/handler/resourceselect.cpp
  src/handler/scope.cpp
  src/handler/search.cpp
  src/handler/searchhelper.cpp
  src/handler/searchpersistent.cpp
  src/handler/select.cpp
  src/handler/subscribe.cpp
  src/handler/status.cpp
  src/handler/store.cpp
  src/handler/transaction.cpp

  src/search/agentsearchengine.cpp
  src/search/searchmanager.cpp
  src/search/xesamsearchengine.cpp

  src/storage/collectionqueryhelper.cpp
  src/storage/entity.cpp
  ${CMAKE_CURRENT_BINARY_DIR}/entities.cpp
  src/storage/datastore.cpp
  src/storage/dbconfig.cpp
  src/storage/dbconfigmysql.cpp
  src/storage/dbconfigmysqlembedded.cpp
  src/storage/dbconfigpostgresql.cpp
  src/storage/dbconfigsqlite.cpp
  src/storage/dbconfigvirtuoso.cpp
  src/storage/dbinitializer.cpp
  src/storage/dbinitializer_p.cpp
  src/storage/dbupdater.cpp
  src/storage/itemqueryhelper.cpp
  src/storage/itemretriever.cpp
  src/storage/itemretrievalmanager.cpp
  src/storage/itemretrievalthread.cpp
  src/storage/itemretrievaljob.cpp
  src/storage/notificationcollector.cpp
  src/storage/query.cpp
  src/storage/querybuilder.cpp
  src/storage/queryhelper.cpp
  src/storage/transaction.cpp
  src/storage/parthelper.cpp
  src/tracer.cpp
  src/utils.cpp
  src/dbustracer.cpp
  src/filetracer.cpp
  src/notificationmanager.cpp
  src/notificationsource.cpp
  src/resourcemanager.cpp
  src/cachecleaner.cpp
  src/xesamsearch.cpp
  src/debuginterface.cpp
  src/imapstreamparser.cpp
  src/preprocessorinstance.cpp
  src/preprocessormanager.cpp
  src/storagejanitor.cpp
)

if (Soprano_FOUND)
  set(libakonadiprivate_SRCS
    ${libakonadiprivate_SRCS}
    src/nepomuksearch.cpp
    src/search/nepomuksearchengine.cpp
    src/nepomuk/dbusoperators.cpp
    src/nepomuk/queryserviceclient.cpp
    src/nepomuk/dbusconnectionpool.cpp
    src/nepomuk/result.cpp
  )

  set_source_files_properties(src/nepomuk/org.kde.nepomuk.QueryService.xml PROPERTIES INCLUDE "dbusoperators.h")
  set_source_files_properties(src/nepomuk/org.kde.nepomuk.Query.xml PROPERTIES INCLUDE "result.h")

  qt4_add_dbus_interface(libakonadiprivate_SRCS src/nepomuk/org.kde.nepomuk.QueryService.xml queryserviceinterface)
  qt4_add_dbus_interface(libakonadiprivate_SRCS src/nepomuk/org.kde.nepomuk.Query.xml queryinterface)
endif (Soprano_FOUND)

qt4_generate_dbus_interface( src/debuginterface.h org.freedesktop.Akonadi.DebugInterface.xml )

qt4_add_dbus_adaptor( libakonadiprivate_SRCS ${Akonadi_SOURCE_DIR}/interfaces/org.freedesktop.Akonadi.TracerNotification.xml dbustracer.h Akonadi::DBusTracer )
qt4_add_dbus_adaptor( libakonadiprivate_SRCS ${Akonadi_SOURCE_DIR}/interfaces/org.freedesktop.Akonadi.Tracer.xml tracer.h Akonadi::Tracer
)
qt4_add_dbus_adaptor( libakonadiprivate_SRCS ${Akonadi_SOURCE_DIR}/interfaces/org.freedesktop.Akonadi.NotificationManager.xml notificationmanager.h Akonadi::NotificationManager )
qt4_add_dbus_adaptor( libakonadiprivate_SRCS ${Akonadi_SOURCE_DIR}/interfaces/org.freedesktop.Akonadi.Server.xml akonadi.h Akonadi::AkonadiServer )
qt4_add_dbus_adaptor( libakonadiprivate_SRCS ${Akonadi_SOURCE_DIR}/interfaces/org.freedesktop.Akonadi.NotificationSource.xml notificationsource.h Akonadi::NotificationSource )
qt4_add_dbus_adaptor( libakonadiprivate_SRCS ${CMAKE_CURRENT_BINARY_DIR}/org.freedesktop.Akonadi.DebugInterface.xml debuginterface.h DebugInterface )
qt4_add_dbus_adaptor( libakonadiprivate_SRCS ${Akonadi_SOURCE_DIR}/interfaces/org.freedesktop.Akonadi.ResourceManager.xml resourcemanager.h Akonadi::ResourceManager )
qt4_add_dbus_adaptor( libakonadiprivate_SRCS ${Akonadi_SOURCE_DIR}/interfaces/org.freedesktop.Akonadi.PreprocessorManager.xml preprocessormanager.h Akonadi::PreprocessorManager )

qt4_add_dbus_interfaces( libakonadiprivate_SRCS ${Akonadi_SOURCE_DIR}/interfaces/org.freedesktop.Akonadi.AgentManager.xml ${Akonadi_SOURCE_DIR}/interfaces/org.freedesktop.Akonadi.Resource.xml )
qt4_add_dbus_interface( libakonadiprivate_SRCS ${Akonadi_SOURCE_DIR}/interfaces/org.freedesktop.Akonadi.Preprocessor.xml preprocessorinterface )
qt4_add_dbus_interface( libakonadiprivate_SRCS ${Akonadi_SOURCE_DIR}/interfaces/org.freedesktop.Akonadi.Agent.Control.xml agentcontrolinterface )

set(xesam_xml  ${Akonadi_SOURCE_DIR}/interfaces/org.freedesktop.xesam.Search.xml)

set_source_files_properties(${xesam_xml} PROPERTIES INCLUDE "xesamtypes.h")

qt4_add_dbus_interface( libakonadiprivate_SRCS ${xesam_xml} xesaminterface )

if(NOT WINCE)
  qt4_add_resources( libakonadiprivate_SRCS src/storage/akonadidb.qrc )
else(NOT WINCE)
  qt4_add_resources( libakonadiprivate_SRCS src/storage/akonadidb_mobile.qrc )
endif(NOT WINCE)


automoc4_add_library( akonadiprivate STATIC ${libakonadiprivate_SRCS} )

target_link_libraries( akonadiprivate
  akonadi_shared
  ${QT_QTCORE_LIBRARY}
  ${QT_QTNETWORK_LIBRARY}
  ${QT_QTSQL_LIBRARY}
  ${QT_QTDBUS_LIBRARY}
  ${QT_QTXML_LIBRARY}
  ${AKONADI_PROTOCOLINTERNALS_LIBS}
  ${AKONADI_SYSTEM_LIBS}
)
if(Soprano_FOUND)
  target_link_libraries(akonadiprivate ${SOPRANO_LIBRARIES})
endif()
if(NOT WINCE)
    target_link_libraries( akonadiprivate ${Boost_PROGRAM_OPTIONS_LIBRARY})
endif(NOT WINCE)


set( akonadiserver_bin_SRCS src/main.cpp )

if (AKONADI_STATIC_SQLITE)
add_definitions(-DQT_STATICPLUGIN)
endif (AKONADI_STATIC_SQLITE)

add_executable( akonadiserver_bin ${akonadiserver_bin_SRCS} )
set_target_properties( akonadiserver_bin PROPERTIES OUTPUT_NAME akonadiserver )
target_link_libraries( akonadiserver_bin akonadi_shared akonadiprivate ${QT_QTCORE_LIBRARY})
if (AKONADI_STATIC_SQLITE)
target_link_libraries( akonadiserver_bin qsqlite3 )
endif (AKONADI_STATIC_SQLITE)

install( TARGETS akonadiserver_bin DESTINATION ${BIN_INSTALL_DIR} )
install( FILES 
  src/storage/mysql-global.conf
  src/storage/mysql-global-mobile.conf
  DESTINATION ${CONFIG_INSTALL_DIR}/akonadi/ )

## DBus XML files

install( FILES
   ${CMAKE_CURRENT_BINARY_DIR}/org.freedesktop.Akonadi.DebugInterface.xml
DESTINATION ${DBUS_INTERFACES_INSTALL_DIR} )

