cmake_minimum_required(VERSION 3.0)

if(HAVE_TRANSLATIONS)
  include(../cmake/Translations.cmake)
endif()

set(SOURCES
  core/mainwindow.cpp
  core/application.cpp
  core/appearance.cpp
  core/player.cpp
  core/commandlineoptions.cpp
  core/database.cpp
  core/sqlquery.cpp
  core/sqlrow.cpp
  core/metatypes.cpp
  core/deletefiles.cpp
  core/filesystemmusicstorage.cpp
  core/filesystemwatcherinterface.cpp
  core/mergedproxymodel.cpp
  core/multisortfilterproxy.cpp
  core/musicstorage.cpp
  core/networkaccessmanager.cpp
  core/threadsafenetworkdiskcache.cpp
  core/networktimeouts.cpp
  core/networkproxyfactory.cpp
  core/qtfslistener.cpp
  core/settingsprovider.cpp
  core/signalchecker.cpp
  core/song.cpp
  core/songloader.cpp
  core/stylehelper.cpp
  core/stylesheetloader.cpp
  core/tagreaderclient.cpp
  core/taskmanager.cpp
  core/thread.cpp
  core/urlhandler.cpp
  core/utilities.cpp
  core/imageutils.cpp
  core/iconloader.cpp
  core/standarditemiconloader.cpp
  core/scopedtransaction.cpp
  core/translations.cpp
  core/systemtrayicon.cpp

  engine/enginetype.cpp
  engine/enginebase.cpp
  engine/devicefinders.cpp
  engine/devicefinder.cpp

  analyzer/fht.cpp
  analyzer/analyzerbase.cpp
  analyzer/analyzercontainer.cpp
  analyzer/blockanalyzer.cpp
  analyzer/boomanalyzer.cpp
  analyzer/rainbowanalyzer.cpp

  equalizer/equalizer.cpp
  equalizer/equalizerslider.cpp

  context/contextview.cpp
  context/contextalbum.cpp

  collection/collection.cpp
  collection/collectionmodel.cpp
  collection/collectionbackend.cpp
  collection/collectionwatcher.cpp
  collection/collectionview.cpp
  collection/collectionitemdelegate.cpp
  collection/collectionviewcontainer.cpp
  collection/collectiondirectorymodel.cpp
  collection/collectionfilterwidget.cpp
  collection/collectionplaylistitem.cpp
  collection/collectionquery.cpp
  collection/savedgroupingmanager.cpp
  collection/groupbydialog.cpp
  collection/collectiontask.cpp

  playlist/playlist.cpp
  playlist/playlistbackend.cpp
  playlist/playlistcontainer.cpp
  playlist/playlistdelegates.cpp
  playlist/playlistfilter.cpp
  playlist/playlistfilterparser.cpp
  playlist/playlistheader.cpp
  playlist/playlistitem.cpp
  playlist/playlistlistcontainer.cpp
  playlist/playlistlistmodel.cpp
  playlist/playlistlistview.cpp
  playlist/playlistmanager.cpp
  playlist/playlistsaveoptionsdialog.cpp
  playlist/playlistsequence.cpp
  playlist/playlisttabbar.cpp
  playlist/playlistundocommands.cpp
  playlist/playlistview.cpp
  playlist/songloaderinserter.cpp
  playlist/songplaylistitem.cpp
  playlist/dynamicplaylistcontrols.cpp

  queue/queue.cpp
  queue/queueview.cpp

  playlistparsers/asxiniparser.cpp
  playlistparsers/asxparser.cpp
  playlistparsers/cueparser.cpp
  playlistparsers/m3uparser.cpp
  playlistparsers/parserbase.cpp
  playlistparsers/playlistparser.cpp
  playlistparsers/plsparser.cpp
  playlistparsers/wplparser.cpp
  playlistparsers/xmlparser.cpp
  playlistparsers/xspfparser.cpp

  smartplaylists/playlistgenerator.cpp
  smartplaylists/playlistgeneratorinserter.cpp
  smartplaylists/playlistquerygenerator.cpp
  smartplaylists/smartplaylistquerywizardplugin.cpp
  smartplaylists/smartplaylistsearch.cpp
  smartplaylists/smartplaylistsearchpreview.cpp
  smartplaylists/smartplaylistsearchterm.cpp
  smartplaylists/smartplaylistsearchtermwidget.cpp
  smartplaylists/smartplaylistsmodel.cpp
  smartplaylists/smartplaylistsviewcontainer.cpp
  smartplaylists/smartplaylistsview.cpp
  smartplaylists/smartplaylistwizard.cpp
  smartplaylists/smartplaylistwizardplugin.cpp

  covermanager/albumcovermanager.cpp
  covermanager/albumcovermanagerlist.cpp
  covermanager/albumcoverloader.cpp
  covermanager/albumcoverfetcher.cpp
  covermanager/albumcoverfetchersearch.cpp
  covermanager/albumcoversearcher.cpp
  covermanager/albumcoverexport.cpp
  covermanager/albumcoverexporter.cpp
  covermanager/albumcoverchoicecontroller.cpp
  covermanager/coverprovider.cpp
  covermanager/coverproviders.cpp
  covermanager/coversearchstatistics.cpp
  covermanager/coversearchstatisticsdialog.cpp
  covermanager/coverexportrunnable.cpp
  covermanager/currentalbumcoverloader.cpp
  covermanager/coverfromurldialog.cpp
  covermanager/jsoncoverprovider.cpp
  covermanager/lastfmcoverprovider.cpp
  covermanager/musicbrainzcoverprovider.cpp
  covermanager/discogscoverprovider.cpp
  covermanager/deezercoverprovider.cpp
  covermanager/qobuzcoverprovider.cpp
  covermanager/musixmatchcoverprovider.cpp
  covermanager/spotifycoverprovider.cpp

  lyrics/lyricsproviders.cpp
  lyrics/lyricsprovider.cpp
  lyrics/lyricsfetcher.cpp
  lyrics/lyricsfetchersearch.cpp
  lyrics/jsonlyricsprovider.cpp
  lyrics/auddlyricsprovider.cpp
  lyrics/ovhlyricsprovider.cpp
  lyrics/lololyricsprovider.cpp
  lyrics/geniuslyricsprovider.cpp
  lyrics/musixmatchlyricsprovider.cpp
  lyrics/chartlyricsprovider.cpp

  settings/settingsdialog.cpp
  settings/settingspage.cpp
  settings/behavioursettingspage.cpp
  settings/collectionsettingspage.cpp
  settings/backendsettingspage.cpp
  settings/playlistsettingspage.cpp
  settings/scrobblersettingspage.cpp
  settings/coverssettingspage.cpp
  settings/lyricssettingspage.cpp
  settings/networkproxysettingspage.cpp
  settings/appearancesettingspage.cpp
  settings/contextsettingspage.cpp
  settings/notificationssettingspage.cpp

  dialogs/about.cpp
  dialogs/console.cpp
  dialogs/errordialog.cpp
  dialogs/edittagdialog.cpp
  dialogs/trackselectiondialog.cpp
  dialogs/addstreamdialog.cpp
  dialogs/userpassdialog.cpp
  dialogs/deleteconfirmationdialog.cpp
  dialogs/lastfmimportdialog.cpp
  dialogs/snapdialog.cpp
  dialogs/saveplaylistsdialog.cpp

  widgets/autoexpandingtreeview.cpp
  widgets/busyindicator.cpp
  widgets/clickablelabel.cpp
  widgets/fancytabwidget.cpp
  widgets/favoritewidget.cpp
  widgets/fileview.cpp
  widgets/fileviewlist.cpp
  widgets/forcescrollperpixel.cpp
  widgets/freespacebar.cpp
  widgets/groupediconview.cpp
  widgets/lineedit.cpp
  widgets/linetextedit.cpp
  widgets/multiloadingindicator.cpp
  widgets/playingwidget.cpp
  widgets/renametablineedit.cpp
  widgets/volumeslider.cpp
  widgets/stickyslider.cpp
  widgets/stretchheaderview.cpp
  widgets/trackslider.cpp
  widgets/tracksliderpopup.cpp
  widgets/tracksliderslider.cpp
  widgets/loginstatewidget.cpp
  widgets/ratingwidget.cpp
  widgets/resizabletextedit.cpp

  osd/osdbase.cpp
  osd/osdpretty.cpp

  internet/internetservices.cpp
  internet/internetservice.cpp
  internet/internetplaylistitem.cpp
  internet/internetsearchview.cpp
  internet/internetsearchmodel.cpp
  internet/internetsearchsortmodel.cpp
  internet/internetsearchitemdelegate.cpp
  internet/localredirectserver.cpp
  internet/internetsongsview.cpp
  internet/internettabsview.cpp
  internet/internetcollectionview.cpp
  internet/internetcollectionviewcontainer.cpp
  internet/internetsearchview.cpp

  radios/radioservices.cpp
  radios/radiobackend.cpp
  radios/radiomodel.cpp
  radios/radioview.cpp
  radios/radioviewcontainer.cpp
  radios/radioservice.cpp
  radios/radioplaylistitem.cpp
  radios/radiochannel.cpp
  radios/somafmservice.cpp
  radios/radioparadiseservice.cpp

  scrobbler/audioscrobbler.cpp
  scrobbler/scrobblerservices.cpp
  scrobbler/scrobblerservice.cpp
  scrobbler/scrobblercache.cpp
  scrobbler/scrobblercacheitem.cpp
  scrobbler/scrobblingapi20.cpp
  scrobbler/lastfmscrobbler.cpp
  scrobbler/librefmscrobbler.cpp
  scrobbler/listenbrainzscrobbler.cpp
  scrobbler/lastfmimport.cpp

  organize/organize.cpp
  organize/organizeformat.cpp
  organize/organizedialog.cpp
  organize/organizeerrordialog.cpp

)

set(HEADERS
  core/mainwindow.h
  core/application.h
  core/appearance.h
  core/player.h
  core/database.h
  core/deletefiles.h
  core/filesystemwatcherinterface.h
  core/mergedproxymodel.h
  core/multisortfilterproxy.h
  core/networkaccessmanager.h
  core/threadsafenetworkdiskcache.h
  core/networktimeouts.h
  core/qtfslistener.h
  core/songloader.h
  core/tagreaderclient.h
  core/taskmanager.h
  core/thread.h
  core/urlhandler.h
  core/standarditemiconloader.h
  core/translations.h
  core/potranslator.h
  core/mimedata.h
  core/stylesheetloader.h

  engine/enginebase.h
  engine/devicefinders.h

  analyzer/analyzerbase.h
  analyzer/analyzercontainer.h
  analyzer/blockanalyzer.h
  analyzer/boomanalyzer.h
  analyzer/rainbowanalyzer.h

  equalizer/equalizer.h
  equalizer/equalizerslider.h

  context/contextview.h
  context/contextalbum.h

  collection/collection.h
  collection/collectionmodel.h
  collection/collectionbackend.h
  collection/collectionwatcher.h
  collection/collectionview.h
  collection/collectionitemdelegate.h
  collection/collectionviewcontainer.h
  collection/collectiondirectorymodel.h
  collection/collectionfilterwidget.h
  collection/savedgroupingmanager.h
  collection/groupbydialog.h

  playlist/playlist.h
  playlist/playlistbackend.h
  playlist/playlistcontainer.h
  playlist/playlistdelegates.h
  playlist/playlistfilter.h
  playlist/playlistheader.h
  playlist/playlistlistcontainer.h
  playlist/playlistlistmodel.h
  playlist/playlistlistview.h
  playlist/playlistlistsortfiltermodel.h
  playlist/playlistmanager.h
  playlist/playlistsaveoptionsdialog.h
  playlist/playlistsequence.h
  playlist/playlisttabbar.h
  playlist/playlistview.h
  playlist/playlistitemmimedata.h
  playlist/songloaderinserter.h
  playlist/songmimedata.h
  playlist/dynamicplaylistcontrols.h

  queue/queue.h
  queue/queueview.h

  playlistparsers/asxiniparser.h
  playlistparsers/asxparser.h
  playlistparsers/cueparser.h
  playlistparsers/m3uparser.h
  playlistparsers/parserbase.h
  playlistparsers/playlistparser.h
  playlistparsers/plsparser.h
  playlistparsers/wplparser.h
  playlistparsers/xmlparser.h
  playlistparsers/xspfparser.h

  smartplaylists/playlistgenerator.h
  smartplaylists/playlistgeneratorinserter.h
  smartplaylists/playlistquerygenerator.h
  smartplaylists/playlistgeneratormimedata.h
  smartplaylists/smartplaylistquerywizardplugin.h
  smartplaylists/smartplaylistsearchpreview.h
  smartplaylists/smartplaylistsearchtermwidget.h
  smartplaylists/smartplaylistsmodel.h
  smartplaylists/smartplaylistsviewcontainer.h
  smartplaylists/smartplaylistsview.h
  smartplaylists/smartplaylistwizard.h
  smartplaylists/smartplaylistwizardplugin.h

  covermanager/albumcovermanager.h
  covermanager/albumcovermanagerlist.h
  covermanager/albumcoverloader.h
  covermanager/albumcoverfetcher.h
  covermanager/albumcoverfetchersearch.h
  covermanager/albumcoversearcher.h
  covermanager/albumcoverexport.h
  covermanager/albumcoverexporter.h
  covermanager/albumcoverchoicecontroller.h
  covermanager/coverprovider.h
  covermanager/coverproviders.h
  covermanager/coversearchstatisticsdialog.h
  covermanager/coverexportrunnable.h
  covermanager/currentalbumcoverloader.h
  covermanager/coverfromurldialog.h
  covermanager/jsoncoverprovider.h
  covermanager/lastfmcoverprovider.h
  covermanager/musicbrainzcoverprovider.h
  covermanager/discogscoverprovider.h
  covermanager/deezercoverprovider.h
  covermanager/qobuzcoverprovider.h
  covermanager/musixmatchcoverprovider.h
  covermanager/spotifycoverprovider.h

  lyrics/lyricsproviders.h
  lyrics/lyricsprovider.h
  lyrics/lyricsfetcher.h
  lyrics/lyricsfetchersearch.h
  lyrics/jsonlyricsprovider.h
  lyrics/auddlyricsprovider.h
  lyrics/ovhlyricsprovider.h
  lyrics/lololyricsprovider.h
  lyrics/geniuslyricsprovider.h
  lyrics/musixmatchlyricsprovider.h
  lyrics/chartlyricsprovider.h

  settings/settingsdialog.h
  settings/settingspage.h
  settings/behavioursettingspage.h
  settings/collectionsettingspage.h
  settings/backendsettingspage.h
  settings/playlistsettingspage.h
  settings/scrobblersettingspage.h
  settings/coverssettingspage.h
  settings/lyricssettingspage.h
  settings/networkproxysettingspage.h
  settings/appearancesettingspage.h
  settings/contextsettingspage.h
  settings/notificationssettingspage.h

  dialogs/about.h
  dialogs/errordialog.h
  dialogs/console.h
  dialogs/edittagdialog.h
  dialogs/trackselectiondialog.h
  dialogs/addstreamdialog.h
  dialogs/userpassdialog.h
  dialogs/deleteconfirmationdialog.h
  dialogs/lastfmimportdialog.h
  dialogs/snapdialog.h
  dialogs/saveplaylistsdialog.h

  widgets/autoexpandingtreeview.h
  widgets/busyindicator.h
  widgets/clickablelabel.h
  widgets/fancytabwidget.h
  widgets/favoritewidget.h
  widgets/fileview.h
  widgets/fileviewlist.h
  widgets/freespacebar.h
  widgets/groupediconview.h
  widgets/lineedit.h
  widgets/linetextedit.h
  widgets/multiloadingindicator.h
  widgets/playingwidget.h
  widgets/renametablineedit.h
  widgets/volumeslider.h
  widgets/stickyslider.h
  widgets/stretchheaderview.h
  widgets/trackslider.h
  widgets/tracksliderpopup.h
  widgets/tracksliderslider.h
  widgets/loginstatewidget.h
  widgets/qsearchfield.h
  widgets/ratingwidget.h
  widgets/forcescrollperpixel.h
  widgets/resizabletextedit.h

  osd/osdbase.h
  osd/osdpretty.h

  internet/internetservices.h
  internet/internetservice.h
  internet/internetsongmimedata.h
  internet/internetsearchmodel.h
  internet/internetsearchsortmodel.h
  internet/internetsearchitemdelegate.h
  internet/internetsearchview.h
  internet/localredirectserver.h
  internet/internetsongsview.h
  internet/internettabsview.h
  internet/internetcollectionview.h
  internet/internetcollectionviewcontainer.h

  radios/radioservices.h
  radios/radiobackend.h
  radios/radiomodel.h
  radios/radioview.h
  radios/radioviewcontainer.h
  radios/radioservice.h
  radios/radiomimedata.h
  radios/somafmservice.h
  radios/radioparadiseservice.h

  scrobbler/audioscrobbler.h
  scrobbler/scrobblerservices.h
  scrobbler/scrobblerservice.h
  scrobbler/scrobblercache.h
  scrobbler/scrobblercacheitem.h
  scrobbler/scrobblingapi20.h
  scrobbler/lastfmscrobbler.h
  scrobbler/librefmscrobbler.h
  scrobbler/listenbrainzscrobbler.h
  scrobbler/lastfmimport.h

  organize/organize.h
  organize/organizedialog.h
  organize/organizeerrordialog.h

)

set(UI

  core/mainwindow.ui

  collection/groupbydialog.ui
  collection/collectionfilterwidget.ui
  collection/collectionviewcontainer.ui
  collection/savedgroupingmanager.ui

  playlist/playlistcontainer.ui
  playlist/playlistlistcontainer.ui
  playlist/playlistsaveoptionsdialog.ui
  playlist/playlistsequence.ui
  playlist/dynamicplaylistcontrols.ui

  queue/queueview.ui

  smartplaylists/smartplaylistquerysearchpage.ui
  smartplaylists/smartplaylistquerysortpage.ui
  smartplaylists/smartplaylistsearchpreview.ui
  smartplaylists/smartplaylistsearchtermwidget.ui
  smartplaylists/smartplaylistsviewcontainer.ui
  smartplaylists/smartplaylistwizardfinishpage.ui

  covermanager/albumcoverexport.ui
  covermanager/albumcovermanager.ui
  covermanager/albumcoversearcher.ui
  covermanager/coversearchstatisticsdialog.ui
  covermanager/coverfromurldialog.ui

  settings/settingsdialog.ui
  settings/behavioursettingspage.ui
  settings/collectionsettingspage.ui
  settings/backendsettingspage.ui
  settings/contextsettingspage.ui
  settings/playlistsettingspage.ui
  settings/scrobblersettingspage.ui
  settings/coverssettingspage.ui
  settings/lyricssettingspage.ui
  settings/networkproxysettingspage.ui
  settings/appearancesettingspage.ui
  settings/notificationssettingspage.ui

  equalizer/equalizer.ui
  equalizer/equalizerslider.ui

  dialogs/about.ui
  dialogs/errordialog.ui
  dialogs/console.ui
  dialogs/edittagdialog.ui
  dialogs/trackselectiondialog.ui
  dialogs/addstreamdialog.ui
  dialogs/userpassdialog.ui
  dialogs/lastfmimportdialog.ui
  dialogs/snapdialog.ui
  dialogs/saveplaylistsdialog.ui

  widgets/trackslider.ui
  widgets/fileview.ui
  widgets/loginstatewidget.ui

  osd/osdpretty.ui

  internet/internettabsview.ui
  internet/internetcollectionviewcontainer.ui
  internet/internetsearchview.ui

  radios/radioviewcontainer.ui

  organize/organizedialog.ui
  organize/organizeerrordialog.ui

)

set(RESOURCES ../data/data.qrc ../data/icons.qrc)
set(OTHER_SOURCES)

option(USE_INSTALL_PREFIX "Look for data in CMAKE_INSTALL_PREFIX" ON)

if(NOT APPLE)
  set(NOT_APPLE ON)
  optional_source(NOT_APPLE SOURCES widgets/qsearchfield_nonmac.cpp core/qtsystemtrayicon.cpp HEADERS core/qtsystemtrayicon.h)
endif()

if(HAVE_GLOBALSHORTCUTS)
  optional_source(HAVE_GLOBALSHORTCUTS
    SOURCES globalshortcuts/globalshortcutsmanager.cpp globalshortcuts/globalshortcutsbackend.cpp globalshortcuts/globalshortcutgrabber.cpp settings/globalshortcutssettingspage.cpp
    HEADERS globalshortcuts/globalshortcutsmanager.h globalshortcuts/globalshortcutsbackend.h globalshortcuts/globalshortcutgrabber.h settings/globalshortcutssettingspage.h
    UI globalshortcuts/globalshortcutgrabber.ui settings/globalshortcutssettingspage.ui
  )
  optional_source(HAVE_DBUS
    SOURCES globalshortcuts/globalshortcutsbackend-kde.cpp globalshortcuts/globalshortcutsbackend-gnome.cpp globalshortcuts/globalshortcutsbackend-mate.cpp
    HEADERS globalshortcuts/globalshortcutsbackend-kde.h globalshortcuts/globalshortcutsbackend-gnome.h globalshortcuts/globalshortcutsbackend-mate.h
  )
  optional_source(HAVE_X11_GLOBALSHORTCUTS
    SOURCES globalshortcuts/globalshortcutsbackend-x11.cpp globalshortcuts/globalshortcut.cpp globalshortcuts/globalshortcut-x11.cpp
    HEADERS globalshortcuts/globalshortcutsbackend-x11.h globalshortcuts/globalshortcut.h
  )
  optional_source(WIN32
    SOURCES globalshortcuts/globalshortcutsbackend-win.cpp globalshortcuts/globalshortcut.cpp globalshortcuts/globalshortcut-win.cpp
    HEADERS globalshortcuts/globalshortcutsbackend-win.h globalshortcuts/globalshortcut.h
  )
endif(HAVE_GLOBALSHORTCUTS)

# ALSA
optional_source(HAVE_ALSA SOURCES engine/alsadevicefinder.cpp engine/alsapcmdevicefinder.cpp)

# DBUS
optional_source(HAVE_DBUS SOURCES osd/osddbus.cpp HEADERS osd/osddbus.h)

# GStreamer
optional_source(HAVE_GSTREAMER
  SOURCES engine/gststartup.cpp engine/gstengine.cpp engine/gstenginepipeline.cpp
  HEADERS engine/gststartup.h engine/gstengine.h engine/gstenginepipeline.h
)

# VLC
optional_source(HAVE_VLC SOURCES engine/vlcengine.cpp HEADERS engine/vlcengine.h)

# DBUS and MPRIS - Unix specific
if(UNIX AND HAVE_DBUS)
  file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/dbus)

  optional_source(HAVE_DBUS SOURCES core/mpris2.cpp HEADERS core/mpris2.h)
  optional_source(HAVE_UDISKS2 SOURCES device/udisks2lister.cpp HEADERS device/udisks2lister.h)

  # MPRIS 2.0 DBUS interfaces
  qt_add_dbus_adaptor(SOURCES dbus/org.mpris.MediaPlayer2.Player.xml core/mpris2.h mpris::Mpris2 core/mpris2_player Mpris2Player)
  qt_add_dbus_adaptor(SOURCES dbus/org.mpris.MediaPlayer2.xml core/mpris2.h mpris::Mpris2 core/mpris2_root Mpris2Root)
  qt_add_dbus_adaptor(SOURCES dbus/org.mpris.MediaPlayer2.TrackList.xml core/mpris2.h mpris::Mpris2 core/mpris2_tracklist Mpris2TrackList)

  # MPRIS 2.1 DBUS interfaces
  qt_add_dbus_adaptor(SOURCES dbus/org.mpris.MediaPlayer2.Playlists.xml core/mpris2.h mpris::Mpris2 core/mpris2_playlists Mpris2Playlists)

  # org.freedesktop.Notifications DBUS interface
  qt_add_dbus_interface(SOURCES dbus/org.freedesktop.Notifications.xml dbus/notification)

  # org.gnome.SettingsDaemon interface
  qt_add_dbus_interface(SOURCES dbus/org.gnome.SettingsDaemon.MediaKeys.xml dbus/gnomesettingsdaemon)

  # org.mate.SettingsDaemon interface
  qt_add_dbus_interface(SOURCES dbus/org.mate.SettingsDaemon.MediaKeys.xml dbus/matesettingsdaemon)

  # org.kde.KGlobalAccel interface
  qt_add_dbus_interface(SOURCES dbus/org.kde.KGlobalAccel.xml dbus/kglobalaccel)
  qt_add_dbus_interface(SOURCES dbus/org.kde.KGlobalAccel.Component.xml dbus/kglobalaccelcomponent)

  if(HAVE_UDISKS2)
    set_source_files_properties(dbus/org.freedesktop.DBus.ObjectManager.xml PROPERTIES NO_NAMESPACE dbus/objectmanager INCLUDE dbus/metatypes.h)
    set_source_files_properties(dbus/org.freedesktop.UDisks2.Filesystem.xml PROPERTIES NO_NAMESPACE dbus/udisks2filesystem INCLUDE dbus/metatypes.h)
    set_source_files_properties(dbus/org.freedesktop.UDisks2.Block.xml PROPERTIES NO_NAMESPACE dbus/udisks2block INCLUDE dbus/metatypes.h)
    set_source_files_properties(dbus/org.freedesktop.UDisks2.Drive.xml PROPERTIES NO_NAMESPACE dbus/udisks2drive INCLUDE dbus/metatypes.h)
    set_source_files_properties(dbus/org.freedesktop.UDisks2.Job.xml PROPERTIES NO_NAMESPACE dbus/udisks2job INCLUDE dbus/metatypes.h)
    qt_add_dbus_interface(SOURCES dbus/org.freedesktop.DBus.ObjectManager.xml dbus/objectmanager)
    qt_add_dbus_interface(SOURCES dbus/org.freedesktop.UDisks2.Filesystem.xml dbus/udisks2filesystem)
    qt_add_dbus_interface(SOURCES dbus/org.freedesktop.UDisks2.Block.xml dbus/udisks2block)
    qt_add_dbus_interface(SOURCES dbus/org.freedesktop.UDisks2.Drive.xml dbus/udisks2drive)
    qt_add_dbus_interface(SOURCES dbus/org.freedesktop.UDisks2.Job.xml dbus/udisks2job)
  endif(HAVE_UDISKS2)

endif(UNIX AND HAVE_DBUS)

optional_source(UNIX
  SOURCES
    device/connecteddevice.cpp
    device/devicedatabasebackend.cpp
    device/devicelister.cpp
    device/devicemanager.cpp
    device/devicestatefiltermodel.cpp
    device/filesystemdevice.cpp
    device/deviceviewcontainer.cpp
    device/deviceview.cpp
    device/deviceproperties.cpp
    device/deviceinfo.cpp
  HEADERS
    device/connecteddevice.h
    device/devicedatabasebackend.h
    device/devicelister.h
    device/devicemanager.h
    device/devicestatefiltermodel.h
    device/filesystemdevice.h
    device/deviceviewcontainer.h
    device/deviceview.h
    device/deviceproperties.h
  UI
    device/deviceproperties.ui
    device/deviceviewcontainer.ui
)

# Libgpod device backend
optional_source(HAVE_LIBGPOD
  SOURCES
    device/gpoddevice.cpp
    device/gpodloader.cpp
  HEADERS
    device/gpoddevice.h
    device/gpodloader.h
)

# GIO device backend
optional_source(HAVE_GIO SOURCES device/giolister.cpp HEADERS device/giolister.h)

# MTP device
optional_source(HAVE_LIBMTP
  SOURCES
    device/mtpconnection.cpp
    device/mtpdevice.cpp
    device/mtploader.cpp
  HEADERS
    device/mtpconnection.h
    device/mtpdevice.h
    device/mtploader.h
)

# Pulse audio integration
optional_source(HAVE_LIBPULSE SOURCES engine/pulsedevicefinder.cpp)

# Transcoder require GStreamer
optional_source(HAVE_GSTREAMER
SOURCES
  transcoder/transcoder.cpp
  transcoder/transcodedialog.cpp
  transcoder/transcoderoptionsdialog.cpp
  transcoder/transcoderoptionsflac.cpp
  transcoder/transcoderoptionswavpack.cpp
  transcoder/transcoderoptionsvorbis.cpp
  transcoder/transcoderoptionsopus.cpp
  transcoder/transcoderoptionsspeex.cpp
  transcoder/transcoderoptionsaac.cpp
  transcoder/transcoderoptionsasf.cpp
  transcoder/transcoderoptionsmp3.cpp
  settings/transcodersettingspage.cpp
HEADERS
  transcoder/transcoder.h
  transcoder/transcodedialog.h
  transcoder/transcoderoptionsdialog.h
  transcoder/transcoderoptionsinterface.h
  transcoder/transcoderoptionsflac.h
  transcoder/transcoderoptionswavpack.h
  transcoder/transcoderoptionsvorbis.h
  transcoder/transcoderoptionsopus.h
  transcoder/transcoderoptionsspeex.h
  transcoder/transcoderoptionsaac.h
  transcoder/transcoderoptionsasf.h
  transcoder/transcoderoptionsmp3.h
  settings/transcodersettingspage.h
UI
  transcoder/transcodedialog.ui
  transcoder/transcodelogdialog.ui
  transcoder/transcoderoptionsaac.ui
  transcoder/transcoderoptionsdialog.ui
  transcoder/transcoderoptionsflac.ui
  transcoder/transcoderoptionswavpack.ui
  transcoder/transcoderoptionsvorbis.ui
  transcoder/transcoderoptionsopus.ui
  transcoder/transcoderoptionsspeex.ui
  transcoder/transcoderoptionsasf.ui
  transcoder/transcoderoptionsmp3.ui
  settings/transcodersettingspage.ui
)

# CHROMAPRINT
if(HAVE_SONGFINGERPRINTING OR HAVE_MUSICBRAINZ)
  optional_source(CHROMAPRINT_FOUND SOURCES engine/chromaprinter.cpp)
endif()

# MusicBrainz
optional_source(HAVE_MUSICBRAINZ
  SOURCES
    musicbrainz/acoustidclient.cpp
    musicbrainz/musicbrainzclient.cpp
    musicbrainz/tagfetcher.cpp
  HEADERS
    musicbrainz/acoustidclient.h
    musicbrainz/musicbrainzclient.h
    musicbrainz/tagfetcher.h
)

# CDIO backend and device
optional_source(HAVE_AUDIOCD
  SOURCES
    device/cddadevice.cpp
    device/cddalister.cpp
    device/cddasongloader.cpp
  HEADERS
    device/cddadevice.h
    device/cddalister.h
    device/cddasongloader.h
)

# Platform specific - macOS
optional_source(APPLE
  SOURCES
    core/scoped_nsautorelease_pool.mm
    core/mac_utilities.mm
    core/mac_startup.mm
    core/macsystemtrayicon.mm
    core/macfslistener.mm
    osd/osdmac.mm
    widgets/qsearchfield_mac.mm
    engine/macosdevicefinder.cpp
    globalshortcuts/globalshortcutsbackend-macos.mm
    globalshortcuts/globalshortcutgrabber.mm
    device/macosdevicelister.mm
  HEADERS
    core/macsystemtrayicon.h
    core/macfslistener.h
    osd/osdmac.h
    globalshortcuts/globalshortcutsbackend-macos.h
    device/macosdevicelister.h
)

# Platform specific - Windows
optional_source(WIN32
  SOURCES
    engine/directsounddevicefinder.cpp
    engine/mmdevicefinder.cpp
    core/windows7thumbbar.cpp
  HEADERS
    core/windows7thumbbar.h
)

optional_source(HAVE_SUBSONIC
  SOURCES
    subsonic/subsonicservice.cpp
    subsonic/subsonicurlhandler.cpp
    subsonic/subsonicbaserequest.cpp
    subsonic/subsonicrequest.cpp
    subsonic/subsonicscrobblerequest.cpp
    settings/subsonicsettingspage.cpp
    scrobbler/subsonicscrobbler.cpp
  HEADERS
    subsonic/subsonicservice.h
    subsonic/subsonicurlhandler.h
    subsonic/subsonicbaserequest.h
    subsonic/subsonicrequest.h
    subsonic/subsonicscrobblerequest.h
    settings/subsonicsettingspage.h
    scrobbler/subsonicscrobbler.h
  UI
    settings/subsonicsettingspage.ui
)

optional_source(HAVE_TIDAL
  SOURCES
    tidal/tidalservice.cpp
    tidal/tidalurlhandler.cpp
    tidal/tidalbaserequest.cpp
    tidal/tidalrequest.cpp
    tidal/tidalstreamurlrequest.cpp
    tidal/tidalfavoriterequest.cpp
    settings/tidalsettingspage.cpp
    covermanager/tidalcoverprovider.cpp
  HEADERS
    tidal/tidalservice.h
    tidal/tidalurlhandler.h
    tidal/tidalbaserequest.h
    tidal/tidalrequest.h
    tidal/tidalstreamurlrequest.h
    tidal/tidalfavoriterequest.h
    settings/tidalsettingspage.h
    covermanager/tidalcoverprovider.h
  UI
    settings/tidalsettingspage.ui
)

optional_source(HAVE_QOBUZ
  SOURCES
    qobuz/qobuzservice.cpp
    qobuz/qobuzurlhandler.cpp
    qobuz/qobuzbaserequest.cpp
    qobuz/qobuzrequest.cpp
    qobuz/qobuzstreamurlrequest.cpp
    qobuz/qobuzfavoriterequest.cpp
    settings/qobuzsettingspage.cpp
  HEADERS
    qobuz/qobuzservice.h
    qobuz/qobuzurlhandler.h
    qobuz/qobuzbaserequest.h
    qobuz/qobuzrequest.h
    qobuz/qobuzstreamurlrequest.h
    qobuz/qobuzfavoriterequest.h
    settings/qobuzsettingspage.h
  UI
    settings/qobuzsettingspage.ui
)

# Moodbar
optional_source(HAVE_MOODBAR
  SOURCES
    moodbar/moodbarbuilder.cpp
    moodbar/moodbarcontroller.cpp
    moodbar/moodbaritemdelegate.cpp
    moodbar/moodbarloader.cpp
    moodbar/moodbarpipeline.cpp
    moodbar/moodbarproxystyle.cpp
    moodbar/moodbarrenderer.cpp
    settings/moodbarsettingspage.cpp
  HEADERS
    moodbar/moodbarcontroller.h
    moodbar/moodbaritemdelegate.h
    moodbar/moodbarloader.h
    moodbar/moodbarpipeline.h
    moodbar/moodbarproxystyle.h
    settings/moodbarsettingspage.h
  UI
    settings/moodbarsettingspage.ui
)

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h)

qt_wrap_cpp(MOC ${HEADERS})
qt_wrap_ui(UIC ${UI})
qt_add_resources(QRC ${RESOURCES})

if(HAVE_TRANSLATIONS)

  set(LINGUAS "All" CACHE STRING "A space-seperated list of translations to compile in to Strawberry, or \"None\".")
  if(LINGUAS STREQUAL "All")
    # build LANGUAGES from all existing .po files
    file(GLOB pofiles translations/*.po)
    foreach(pofile ${pofiles})
      get_filename_component(lang ${pofile} NAME_WE)
      list(APPEND LANGUAGES ${lang})
    endforeach(pofile)
  else(LINGUAS STREQUAL "All")
    if(NOT LINGUAS OR LINGUAS STREQUAL "None")
      set(LANGUAGES "")
    else(NOT LINGUAS OR LINGUAS STREQUAL "None")
      string(REGEX MATCHALL [a-zA-Z_@]+ LANGUAGES ${LINGUAS})
    endif(NOT LINGUAS OR LINGUAS STREQUAL "None")
  endif(LINGUAS STREQUAL "All")

  add_pot(POT
    ${CMAKE_CURRENT_SOURCE_DIR}/translations/header
    ${CMAKE_CURRENT_SOURCE_DIR}/translations/translations.pot
    ${SOURCES}
    ${MOC}
    ${UIC}
    ${OTHER_SOURCES}
    ../data/html/oauthsuccess.html
  )
  add_po(PO strawberry_ LANGUAGES ${LANGUAGES} DIRECTORY translations)

endif(HAVE_TRANSLATIONS)

link_directories(
  ${Boost_LIBRARY_DIRS}
  ${GLIB_LIBRARY_DIRS}
  ${GOBJECT_LIBRARY_DIRS}
  ${GNUTLS_LIBRARY_DIRS}
  ${SQLITE_LIBRARY_DIRS}
  ${SINGLEAPPLICATION_LIBRARY_DIRS}
  ${SINGLECOREAPPLICATION_LIBRARY_DIRS}
  ${Iconv_LIBRARY_DIRS}
)

if(HAVE_ALSA)
  link_directories(${ALSA_LIBRARY_DIRS})
endif()

if(HAVE_LIBPULSE)
  link_directories(${LIBPULSE_LIBRARY_DIRS})
endif()

if(HAVE_GSTREAMER)
  link_directories(
    ${GSTREAMER_LIBRARY_DIRS}
    ${GSTREAMER_BASE_LIBRARY_DIRS}
    ${GSTREAMER_APP_LIBRARY_DIRS}
    ${GSTREAMER_AUDIO_LIBRARY_DIRS}
    ${GSTREAMER_TAG_LIBRARY_DIRS}
    ${GSTREAMER_PBUTILS_LIBRARY_DIRS}
  )
endif()

if(HAVE_VLC)
  link_directories(${LIBVLC_LIBRARY_DIRS})
endif()

if(HAVE_SONGFINGERPRINTING OR HAVE_MUSICBRAINZ)
  link_directories(${CHROMAPRINT_LIBRARY_DIRS})
endif()

if(X11_FOUND)
  link_directories(${X11_LIBRARY_DIRS})
endif()

if(XCB_FOUND)
  link_directories(${XCB_LIBRARY_DIRS})
endif()

if(HAVE_GIO)
  link_directories(${GIO_LIBRARY_DIRS})
endif()

if(HAVE_GIO_UNIX)
  link_directories(${GIO_UNIX_LIBRARY_DIRS})
endif()

if(HAVE_AUDIOCD)
  link_directories(${LIBCDIO_LIBRARY_DIRS})
endif()

if(HAVE_LIBGPOD)
  link_directories(${LIBGPOD_LIBRARY_DIRS} ${GDK_PIXBUF_LIBRARY_DIRS})
endif()

if(HAVE_LIBMTP)
  link_directories(${LIBMTP_LIBRARY_DIRS})
endif()

if(USE_TAGLIB AND TAGLIB_FOUND)
  link_directories(${TAGLIB_LIBRARY_DIRS})
endif()

if(USE_TAGPARSER AND TAGPARSER_FOUND)
  link_directories(${TAGPARSER_LIBRARY_DIRS})
endif()

if(HAVE_QTSPARKLE)
  link_directories(${QTSPARKLE_LIBRARY_DIRS})
endif()

add_library(strawberry_lib STATIC
  ${SOURCES}
  ${MOC}
  ${UIC}
  ${QRC}
  ${POT}
  ${PO}
  ${OTHER_UIC_SOURCES}
)

target_include_directories(strawberry_lib SYSTEM PUBLIC
  ${Boost_INCLUDE_DIRS}
  ${GLIB_INCLUDE_DIRS}
  ${GOBJECT_INCLUDE_DIRS}
  ${GNUTLS_INCLUDE_DIRS}
  ${SQLITE_INCLUDE_DIRS}
  ${PROTOBUF_INCLUDE_DIRS}
)

if(HAVE_QPA_QPLATFORMNATIVEINTERFACE_H)
  target_include_directories(strawberry_lib SYSTEM PUBLIC ${Qt${QT_VERSION_MAJOR}Gui_PRIVATE_INCLUDE_DIRS})
endif()

target_include_directories(strawberry_lib PUBLIC
  ${CMAKE_SOURCE_DIR}
  ${CMAKE_BINARY_DIR}
  ${CMAKE_CURRENT_BINARY_DIR}
  ${CMAKE_CURRENT_SOURCE_DIR}
  ${CMAKE_SOURCE_DIR}/ext/libstrawberry-common
  ${CMAKE_SOURCE_DIR}/ext/libstrawberry-tagreader
  ${CMAKE_BINARY_DIR}/ext/libstrawberry-tagreader
  ${SINGLEAPPLICATION_INCLUDE_DIRS}
  ${SINGLECOREAPPLICATION_INCLUDE_DIRS}
)

target_link_libraries(strawberry_lib PUBLIC
  ${CMAKE_THREAD_LIBS_INIT}
  ${GLIB_LIBRARIES}
  ${GOBJECT_LIBRARIES}
  ${GNUTLS_LIBRARIES}
  ${SQLITE_LIBRARIES}
  ${QT_LIBRARIES}
  ${SINGLEAPPLICATION_LIBRARIES}
  ${SINGLECOREAPPLICATION_LIBRARIES}
  ${Iconv_LIBRARIES}
  libstrawberry-common
  libstrawberry-tagreader
)

if(HAVE_ALSA)
  target_include_directories(strawberry_lib SYSTEM PRIVATE ${ALSA_INCLUDE_DIRS})
  target_link_libraries(strawberry_lib PRIVATE ${ALSA_LIBRARIES})
endif()

if(HAVE_LIBPULSE)
  target_include_directories(strawberry_lib SYSTEM PRIVATE ${LIBPULSE_INCLUDE_DIRS})
  target_link_libraries(strawberry_lib PRIVATE ${LIBPULSE_LIBRARIES})
endif()

if(HAVE_GSTREAMER)
  target_include_directories(strawberry_lib SYSTEM PRIVATE
    ${GSTREAMER_INCLUDE_DIRS}
    ${GSTREAMER_BASE_INCLUDE_DIRS}
    ${GSTREAMER_APP_INCLUDE_DIRS}
    ${GSTREAMER_AUDIO_INCLUDE_DIRS}
    ${GSTREAMER_TAG_INCLUDE_DIRS}
    ${GSTREAMER_PBUTILS_INCLUDE_DIRS}
  )
  target_link_libraries(strawberry_lib PRIVATE
    ${GSTREAMER_LIBRARIES}
    ${GSTREAMER_BASE_LIBRARIES}
    ${GSTREAMER_AUDIO_LIBRARIES}
    ${GSTREAMER_APP_LIBRARIES}
    ${GSTREAMER_TAG_LIBRARIES}
    ${GSTREAMER_PBUTILS_LIBRARIES}
  )
endif()

if(HAVE_MOODBAR)
  target_link_libraries(strawberry_lib PRIVATE gstmoodbar)
endif()

if(HAVE_VLC)
  target_include_directories(strawberry_lib SYSTEM PRIVATE ${LIBVLC_INCLUDE_DIRS})
  target_link_libraries(strawberry_lib PRIVATE ${LIBVLC_LIBRARIES})
endif()

if(HAVE_SONGFINGERPRINTING OR HAVE_MUSICBRAINZ)
  target_include_directories(strawberry_lib SYSTEM PRIVATE ${CHROMAPRINT_INCLUDE_DIRS})
  target_link_libraries(strawberry_lib PRIVATE ${CHROMAPRINT_LIBRARIES})
endif()

if(X11_FOUND)
  target_include_directories(strawberry_lib SYSTEM PRIVATE ${X11_INCLUDE_DIR})
  target_link_libraries(strawberry_lib PRIVATE ${X11_LIBRARIES})
endif()

if(XCB_FOUND)
  target_include_directories(strawberry_lib SYSTEM PRIVATE ${XCB_INCLUDE_DIR})
  target_link_libraries(strawberry_lib PRIVATE ${XCB_LIBRARIES})
endif()

if(HAVE_GIO)
  target_include_directories(strawberry_lib SYSTEM PRIVATE ${GIO_INCLUDE_DIRS})
  target_link_libraries(strawberry_lib PRIVATE ${GIO_LIBRARIES})
endif()

if(HAVE_GIO_UNIX)
  target_include_directories(strawberry_lib SYSTEM PRIVATE ${GIO_UNIX_INCLUDE_DIRS})
  target_link_libraries(strawberry_lib PRIVATE ${GIO_UNIX_LIBRARIES})
endif()

if(HAVE_AUDIOCD)
  target_include_directories(strawberry_lib SYSTEM PRIVATE ${LIBCDIO_INCLUDE_DIRS})
  target_link_libraries(strawberry_lib PRIVATE ${LIBCDIO_LIBRARIES})
endif()

if(HAVE_LIBGPOD)
  target_include_directories(strawberry_lib SYSTEM PRIVATE ${LIBGPOD_INCLUDE_DIRS} ${GDK_PIXBUF_INCLUDE_DIRS})
  target_link_libraries(strawberry_lib PRIVATE ${LIBGPOD_LIBRARIES} ${GDK_PIXBUF_LIBRARIES})
endif()

if(HAVE_LIBMTP)
  target_include_directories(strawberry_lib SYSTEM PRIVATE ${LIBMTP_INCLUDE_DIRS})
  target_link_libraries(strawberry_lib PRIVATE ${LIBMTP_LIBRARIES})
endif()

if(FREEBSD)
  target_link_libraries(strawberry_lib PRIVATE iconv)
endif()

if(APPLE)
  target_link_libraries(strawberry_lib PRIVATE
    "-framework AppKit"
    "-framework Carbon"
    "-framework CoreAudio"
    "-framework DiskArbitration"
    "-framework Foundation"
    "-framework IOKit"
    "-framework ScriptingBridge"
  )
  target_link_libraries(strawberry_lib PRIVATE ${SPMEDIAKEYTAP_LIBRARIES})
endif()

if(WIN32)
  target_link_libraries(strawberry_lib PRIVATE dsound dwmapi)
  if(MSVC)
    target_link_libraries(strawberry_lib PRIVATE sqlite3)
    if (GETOPT_INCLUDE_DIRS)
      target_include_directories(strawberry_lib SYSTEM PRIVATE ${GETOPT_INCLUDE_DIRS})
    endif()
    if(GETOPT_LIBRARIES)
      target_link_libraries(strawberry_lib PRIVATE ${GETOPT_LIBRARIES})
    endif()
  endif()
endif()

if(HAVE_QTSPARKLE)
  target_include_directories(strawberry_lib SYSTEM PRIVATE ${QTSPARKLE_INCLUDE_DIRS})
  target_link_libraries(strawberry_lib PRIVATE ${QTSPARKLE_LIBRARIES})
endif()

###############################################################################

set(EXECUTABLE_OUTPUT_PATH ..)

# Show the console window in debug mode on Windows
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT ENABLE_WIN32_CONSOLE)
  set(STRAWBERRY-WIN32-FLAG WIN32)
endif()

# Resource file for windows
if(WIN32)
  configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../dist/windows/windres.rc.in ${CMAKE_CURRENT_BINARY_DIR}/windres.rc)
  set(STRAWBERRY-WIN32-RESOURCES windres.rc)
endif()

add_executable(strawberry
  MACOSX_BUNDLE
  ${STRAWBERRY-WIN32-FLAG}
  ${STRAWBERRY-WIN32-RESOURCES}
  main.cpp
)

if(FREEBSD)
  target_link_libraries(strawberry PRIVATE execinfo)
endif()

target_link_libraries(strawberry PRIVATE strawberry_lib)

# macdeploy.py relies on the blob being built first.
add_dependencies(strawberry strawberry-tagreader)

if(NOT APPLE)
  install(TARGETS strawberry RUNTIME DESTINATION bin)
endif()

if(HAVE_TRANSLATIONS AND INSTALL_TRANSLATIONS AND INSTALL_TRANSLATIONS_FILES)
  install(FILES ${INSTALL_TRANSLATIONS_FILES} DESTINATION share/strawberry/translations)
endif()

if(APPLE)
  set_target_properties(strawberry PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/../dist/macos/Info.plist")
endif()
