INCLUDE(MacroOptionalFindPackage)
INCLUDE(MacroLogFeature)

add_subdirectory( ifaces )
include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}  ${QTINCLUDES})

file(MAKE_DIRECTORY
   ${CMAKE_CURRENT_BINARY_DIR}/backends/hal
   ${CMAKE_CURRENT_BINARY_DIR}/backends/udev
   ${CMAKE_CURRENT_BINARY_DIR}/backends/wmi
)

set(solidlite_LIB_SRCS
   solidnamespace.cpp
   managerbase.cpp
   device.cpp
   devicemanager.cpp
   deviceinterface.cpp
   genericinterface.cpp
   block.cpp
   storagedrive.cpp
   opticaldrive.cpp
   storagevolume.cpp
   opticaldisc.cpp
   storageaccess.cpp
   portablemediaplayer.cpp
   predicate.cpp
   predicateparse.cpp
   predicate_lexer.c
   predicate_parser.c
   xdgbasedirs.cpp

   ifaces/block.cpp
   ifaces/opticaldrive.cpp
   ifaces/device.cpp
   ifaces/deviceinterface.cpp
   ifaces/devicemanager.cpp
   ifaces/genericinterface.cpp
   ifaces/opticaldisc.cpp
   ifaces/portablemediaplayer.cpp
   ifaces/storagedrive.cpp
   ifaces/storagevolume.cpp
   ifaces/storageaccess.cpp

   backends/shared/rootdevice.cpp
)

   if (NOT WIN32 AND NOT APPLE AND WITH_SOLID_UDISKS2)
     find_package( UDev REQUIRED)
     macro_log_feature( UDEV_FOUND "UDev" "UDev support for Solid" "http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html" FALSE "" "Allows Solid to use UDev to provide information about devices on Linux" )
   endif()
   configure_file( config-solid.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-solid.h )


   if ( UDEV_FOUND )
      message(STATUS "Building Solid UDev backend." )
      set(solidlite_LIB_SRCS ${solidlite_LIB_SRCS}
      backends/udev/udevdevice.cpp
      backends/udev/udevmanager.cpp
      backends/udev/udevdeviceinterface.cpp
      backends/udev/udevgenericinterface.cpp
      backends/udev/udevportablemediaplayer.cpp
      backends/udev/udevblock.cpp
      backends/shared/udevqtclient.cpp
      backends/shared/udevqtdevice.cpp
      )

      # check for media-player-info (runtime-only optional dependency)
      set(XDG_DATA_DIRS_ENV $ENV{XDG_DATA_DIRS})  # if(ENV{..}) does not work for me
      if(XDG_DATA_DIRS_ENV)
         find_path(MEDIAPLAYERINFO_PATH sony_psp.mpi
            PATHS ENV XDG_DATA_DIRS
            PATH_SUFFIXES "media-player-info" NO_DEFAULT_PATH
         )
      else()
         set(XDG_DATA_DIRS "/usr/share")
         message(STATUS "Warning: environment variable XDG_DATA_DIRS not set, falling back to ${XDG_DATA_DIRS}")
         find_path(MEDIAPLAYERINFO_PATH sony_psp.mpi
            PATHS "${XDG_DATA_DIRS}"
            PATH_SUFFIXES "media-player-info" NO_DEFAULT_PATH
         )
      endif()

      macro_log_feature(MEDIAPLAYERINFO_PATH
         "media-player-info"
         "Enables identification and querying of portable media players"
         "http://www.freedesktop.org/wiki/Software/media-player-info"
         FALSE
         ""
         "Runtime-only dependency of the udev solid backend. Support for m-p-i is included even if not found during build"
      )
   endif( )


   message(STATUS "Building Solid HAL backend." )
   set(solidlite_LIB_SRCS ${solidlite_LIB_SRCS}
   backends/hal/halblock.cpp
   backends/hal/halcdrom.cpp
   backends/hal/haldeviceinterface.cpp
   backends/hal/halfstabhandling.cpp
   backends/hal/halgenericinterface.cpp
   backends/hal/haldevice.cpp
   backends/hal/halmanager.cpp
   backends/hal/halopticaldisc.cpp
   backends/hal/halportablemediaplayer.cpp
   backends/hal/halstorageaccess.cpp
   backends/hal/halstorage.cpp
   backends/hal/halvolume.cpp
   )

    # FIXME: this should work on more Unix systems
    if (CMAKE_SYSTEM_NAME MATCHES Linux)
        if ( WITH_SOLID_UDISKS2 )
            message(STATUS "Building Solid UDisks2 backend." )
            add_definitions(-DWITH_SOLID_UDISKS2)
            set(solidlite_LIB_SRCS ${solidlite_LIB_SRCS}
            backends/udisks2/udisksmanager.cpp
            backends/udisks2/udisksdevice.cpp
            backends/udisks2/udisksdevicebackend.cpp
            backends/udisks2/udisksblock.cpp
            backends/udisks2/udisksstoragevolume.cpp
            backends/udisks2/udisksdeviceinterface.cpp
            backends/udisks2/udisksopticaldisc.cpp
            backends/udisks2/udisksopticaldrive.cpp
            backends/udisks2/udisksstoragedrive.cpp
            backends/udisks2/udisksstorageaccess.cpp
            backends/udisks2/udisksgenericinterface.cpp
            backends/udisks2/dbus/manager.cpp
            )
        else ( )
            message(STATUS "Building Solid UDisks backend." )
            set(solidlite_LIB_SRCS ${solidlite_LIB_SRCS}
            backends/udisks/udisksmanager.cpp
            backends/udisks/udisksdevice.cpp
            backends/udisks/udisksblock.cpp
            backends/udisks/udisksstoragevolume.cpp
            backends/udisks/udisksdeviceinterface.cpp
            backends/udisks/udisksopticaldisc.cpp
            backends/udisks/udisksopticaldrive.cpp
            backends/udisks/udisksstoragedrive.cpp
            backends/udisks/udisksstorageaccess.cpp
            backends/udisks/udisksgenericinterface.cpp
            )
        endif ( )
   endif ()

if(APPLE)
   find_package(IOKit REQUIRED)

   message(STATUS "-- Building Solid IOKit backend." )
   set(solidlite_LIB_SRCS ${solidlite_LIB_SRCS}
   backends/iokit/iokitmanager.cpp
   backends/iokit/iokitdevice.cpp
   backends/iokit/cfhelper.cpp
   backends/iokit/iokitdeviceinterface.cpp
   backends/iokit/iokitgenericinterface.cpp
   )
endif(APPLE)

if(WIN32)
   include(CheckIncludeFileCXX)
   check_include_file_cxx(wbemidl.h HAVE_WBEM)
   FIND_LIBRARY(WBEM_LIBRARIES NAMES wbemuuid wbemuuidd)
   if(HAVE_WBEM AND WBEM_LIBRARIES)
      set(HAVE_WBEM True)
      message(STATUS "Found wbemuuid library: ${WBEM_LIBRARIES}")
   else()
      set(HAVE_WBEM False)
   endif()
   if(HAVE_WBEM AND NOT WINCE)
       set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_WBEM")
       message(STATUS "-- Building Solid WMI backend." )

       set(solidlite_LIB_SRCS ${solidlite_LIB_SRCS}
       backends/wmi/wmiblock.cpp
       backends/wmi/wmicdrom.cpp
       backends/wmi/wmideviceinterface.cpp
       backends/wmi/wmigenericinterface.cpp
       backends/wmi/wmidevice.cpp
       backends/wmi/wmimanager.cpp
       backends/wmi/wmiopticaldisc.cpp
       backends/wmi/wmiportablemediaplayer.cpp
       backends/wmi/wmiquery.cpp
       backends/wmi/wmistorageaccess.cpp
       backends/wmi/wmistorage.cpp
       backends/wmi/wmivolume.cpp

       )
    endif()
endif()

set(solidlite_OPTIONAL_LIBS)

if(WIN32)
   set(solidlite_OPTIONAL_LIBS ${solidlite_OPTIONAL_LIBS} ${KDEWIN_LIBRARY})
   if(HAVE_WBEM)
      set(solidlite_OPTIONAL_LIBS ${solidlite_OPTIONAL_LIBS} ${WBEM_LIBRARIES})
   endif()
endif()

if(APPLE)
   set(solidlite_OPTIONAL_LIBS ${IOKIT_LIBRARY})
endif()

add_library(solidlite ${solidlite_LIB_SRCS})

if ( UDEV_FOUND )
   set(solidlite_OPTIONAL_LIBS ${solidlite_OPTIONAL_LIBS} ${UDEV_LIBS})
endif ( )

#target_link_libraries(solidlite ${QT_QTCORE_LIBRARY} ${QT_QTDBUS_LIBRARY} ${QT_QTXML_LIBRARY} ${QT_QTGUI_LIBRARY} ${solidlite_OPTIONAL_LIBS} )
target_link_libraries(solidlite ${QTLIBS} ${solidlite_OPTIONAL_LIBS})
target_link_libraries(solidlite LINK_INTERFACE_LIBRARIES ${QT_CORE_LIBRARY} )

if (WINCE)
   target_link_libraries(solidlite ${WCECOMPAT_LIBRARIES})
endif()

# set_target_properties(solidlite PROPERTIES
#    VERSION ${GENERIC_LIB_VERSION}
#    SOVERSION ${GENERIC_LIB_SOVERSION}
# )

#set(lexer_FILE predicate_lexer)
#set(parser_FILE predicate_parser)

#find_package(Flex)
#macro_log_feature(FLEX_FOUND
#   "Flex"
#   "Allows the Solid predicate parser to be updated"
#   "http://flex.sourceforge.net"
#   FALSE
#   ""
#   "Required by the UpdateSolidPredicateParser target (mainly useful for developers)")

#find_program(BISON_EXECUTABLE bison)
#macro_log_feature(BISON_EXECUTABLE
#   "Bison"
#   "Allows the Solid predicate parser to be updated"
#   "http://www.gnu.org/software/bison"
#   FALSE
#   ""
#   "Required by the UpdateSolidPredicateParser target (mainly useful for developers)")
#mark_as_advanced(BISON_EXECUTABLE)      # don't show it in the simple view in cmake-gui/ccmake

# if (FLEX_EXECUTABLE AND BISON_EXECUTABLE)
#
#    add_custom_target(UpdateSolidPredicateParser
#                      COMMAND ${FLEX_EXECUTABLE} -P Solid -o${lexer_FILE}.c ${lexer_FILE}.l
#                      COMMAND ${BISON_EXECUTABLE} -p Solid -d -b ${parser_FILE} ${parser_FILE}.y
#                      COMMAND ${CMAKE_COMMAND} -E copy ${parser_FILE}.tab.c ${CMAKE_CURRENT_SOURCE_DIR}/${parser_FILE}.c
#                      COMMAND ${CMAKE_COMMAND} -E copy ${parser_FILE}.tab.h ${CMAKE_CURRENT_SOURCE_DIR}/${parser_FILE}.h
#                      COMMAND ${CMAKE_COMMAND} -E remove ${parser_FILE}.tab.c ${parser_FILE}.tab.h
#                      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
#
# else (FLEX_EXECUTABLE AND BISON_EXECUTABLE)
#    add_custom_target(UpdateSolidPredicateParser
#                      COMMAND echo "flex and/or bison not found, so target UpdateSolidPredicateParser inactive")
# endif (FLEX_EXECUTABLE AND BISON_EXECUTABLE)

