cmake_minimum_required(VERSION 3.5...3.10)

file(READ "src/okjversion.h" vercontents)
string(REGEX MATCH "OKJ_VERSION_MAJOR ([0-9]*)" _ ${vercontents})
set(ver_major ${CMAKE_MATCH_1})
string(REGEX MATCH "OKJ_VERSION_MINOR ([0-9]*)" _ ${vercontents})
set(ver_minor ${CMAKE_MATCH_1})
string(REGEX MATCH "OKJ_VERSION_BUILD ([0-9]*)" _ ${vercontents})
set(ver_build ${CMAKE_MATCH_1})
set(sem_ver "${ver_major}.${ver_minor}.${ver_build}")

message(STATUS "Building OpenKJ ${sem_ver}")

message("Building OpenKJ ${sem_ver}")

project(openkj
        VERSION ${sem_ver}
        LANGUAGES CXX C
        )

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt5 COMPONENTS Widgets REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Gui Sql Network Widgets Concurrent Svg PrintSupport REQUIRED)

include_directories(
        src/
)

if (${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
    find_package(PkgConfig)
    pkg_check_modules(GSTREAMER REQUIRED gstreamer-1.0 gstreamer-app-1.0 gstreamer-audio-1.0 gstreamer-pbutils-1.0 gstreamer-controller-1.0 gstreamer-video-1.0)
    include_directories(
            ${GSTREAMER_INCLUDE_DIRS}
            ${GLIB_LIBRARY_DIRS}
    )
    link_directories(
            ${GSTREAMER_LIBRARY_DIRS}
            ${GLIB_INCLUDE_DIRS}
    )
    pkg_check_modules(TAGLIB IMPORTED_TARGET taglib_openkj_bundled_marker)
    if (TAGLIB_FOUND)
        message(STATUS "Using OS installed taglib")
        include_directories(
                ${TAGLIB_INCLUDE_DIRS}
        )
        link_directories(
                ${TAGLIB_LIBRARY_DIRS}
        )
        set(EXTERNAL_TAGLIB True)
    else ()
        set(STATIC_TAGLIB True)
    endif ()
    if (NOT DEFINED SPDLOG_USE_CPM AND NOT DEFINED SPDLOG_USE_BUNDLED)
        pkg_check_modules(SPDLOG IMPORTED_TARGET spdlog)
        if (SPDLOG_FOUND)
            message(STATUS "Using OS installed spdlog")
            add_definitions(-DSPDLOG_FMT_EXTERNAL)
            link_directories(${SPDLOG_LIBRARY_DIRS})
            include_directories(${SPDLOG_INCLUDE_DIRS})
            set(EXTERNAL_SPDLOG True)
            #        include_directories(
            #                ${SPDLOG_INCLUDE_DIRS}
            #        )
        endif ()
    else ()
        message("SPDLOG_USE_CPM or SPDLOG_USE_BUNDLED defined, ignoring OS packages")
    endif ()
endif ()

if (NOT EXTERNAL_SPDLOG)
    if (CMAKE_VERSION VERSION_LESS 3.14 OR DEFINED SPDLOG_USE_BUNDLED)
        message(STATUS "No spdlog install found, SPDLOG_USE_BUNDLED define, or SPDLOG_USE_CPM defined and cmake too old for CPM, trying git submodule")
        add_subdirectory(
                src/3rdparty/spdlog
        )
        include_directories(
                src/3rdparty/spdlog/include
        )
    else ()
        message(STATUS "No spdlog install found or CPM spdlog forced, pulling it in via CPM")
        include(cmake/CPM.cmake)
        CPMAddPackage("gh:gabime/spdlog@1.8.2")
    endif ()
endif ()


if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
    message("macOS detected")
    set(STATIC_TAGLIB True)

    find_package(PkgConfig REQUIRED)
    pkg_check_modules(GSTREAMER REQUIRED gstreamer-1.0 gstreamer-app-1.0 gstreamer-audio-1.0 gstreamer-pbutils-1.0 gstreamer-controller-1.0 gstreamer-video-1.0)

    include_directories(
            ${GSTREAMER_INCLUDE_DIRS}
    )
    link_directories(
            ${GSTREAMER_LIBRARY_DIRS}
    )
    if (DEFINED BUNDLE_GSTREAMER)
        message("Will bundle GStreamer into the app bundle")
        add_compile_definitions(
                MAC_OVERRIDE_GST
        )
    endif ()
endif ()

if (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
    set(STATIC_TAGLIB True)
    set(WINDOWS_ICON_RC "src/appicon.rc")
    if (CMAKE_SIZEOF_VOID_P EQUAL 4)
	set(GST_BASE_PATH "C:/Program Files/gstreamer/1.0/mingw_x86")
	set(GST_BASE_PATH_NATIVE "C:\\Program Files\\gstreamer\\1.0\\mingw_x86")
    elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
	set(GST_BASE_PATH "C:/Program Files/gstreamer/1.0/mingw_x86_64")
	set(GST_BASE_PATH_NATIVE "C:\\Program Files\\gstreamer\\1.0\\mingw_x86_64")
    endif ()
    message("Using GST_BASE_PATH: ${GST_BASE_PATH}")
    message("Using GST_BASE_PATH_NATIVE: ${GST_BASE_PATH_NATIVE}")
    include_directories(
            ${GST_BASE_PATH}/include/gstreamer-1.0
            ${GST_BASE_PATH}/include/glib-2.0
            ${GST_BASE_PATH}/lib/glib-2.0/include
            ${GST_BASE_PATH}/include/glib-2.0/gobject
    )
    link_directories(
            "${GST_BASE_PATH}/lib"
    )
    add_compile_definitions(
            MINIZ_NO_TIME
    )

    link_libraries(
            gstreamer-1.0
            glib-2.0
            gobject-2.0
            gstbase-1.0
            gstapp-1.0
            gstaudio-1.0
            gstpbutils-1.0
            gstcontroller-1.0
            gstvideo-1.0
            winmm
    )

endif ()

if (STATIC_TAGLIB)
    message("Building using included taglib")
    add_compile_definitions(
            TAGLIB_STATIC
    )
    include_directories(
            src/taglib
            src/taglib/toolkit
            src/taglib/mpeg/id3v2
            src/taglib/mpeg/id3v2/frames
            src/taglib/mpeg/id3v1
            src/taglib/mod
            src/taglib/ogg
            src/taglib/ogg/flac
            src/taglib/ogg/opus
            src/taglib/ogg/speex
            src/taglib/ogg/vorbis
            src/taglib/flac
            src/taglib/ape
            src/taglib/riff
            src/taglib/asf
            src/taglib/mpeg
            src/taglib/riff
            src/taglib/riff/aiff
            src/taglib/riff/wav
            src/taglib/it
            src/taglib/mp4
            src/taglib/mpc
            src/taglib/s3m
            src/taglib/trueaudio
            src/taglib/wavpack
            src/taglib/xm
    )
    set(TAGLIB_SOURCES
            src/taglib/ape/apefile.cpp
            src/taglib/ape/apefooter.cpp
            src/taglib/ape/apeitem.cpp
            src/taglib/ape/apeproperties.cpp
            src/taglib/ape/apetag.cpp
            src/taglib/asf/asfattribute.cpp
            src/taglib/asf/asffile.cpp
            src/taglib/asf/asfpicture.cpp
            src/taglib/asf/asfproperties.cpp
            src/taglib/asf/asftag.cpp
            src/taglib/flac/flacfile.cpp
            src/taglib/flac/flacmetadatablock.cpp
            src/taglib/flac/flacpicture.cpp
            src/taglib/flac/flacproperties.cpp
            src/taglib/flac/flacunknownmetadatablock.cpp
            src/taglib/it/itfile.cpp
            src/taglib/it/itproperties.cpp
            src/taglib/mod/modfile.cpp
            src/taglib/mod/modfilebase.cpp
            src/taglib/mod/modproperties.cpp
            src/taglib/mod/modtag.cpp
            src/taglib/mp4/mp4atom.cpp
            src/taglib/mp4/mp4coverart.cpp
            src/taglib/mp4/mp4file.cpp
            src/taglib/mp4/mp4item.cpp
            src/taglib/mp4/mp4properties.cpp
            src/taglib/mp4/mp4tag.cpp
            src/taglib/mpc/mpcfile.cpp
            src/taglib/mpc/mpcproperties.cpp
            src/taglib/mpeg/id3v1/id3v1genres.cpp
            src/taglib/mpeg/id3v1/id3v1tag.cpp
            src/taglib/mpeg/id3v2/frames/attachedpictureframe.cpp
            src/taglib/mpeg/id3v2/frames/chapterframe.cpp
            src/taglib/mpeg/id3v2/frames/commentsframe.cpp
            src/taglib/mpeg/id3v2/frames/eventtimingcodesframe.cpp
            src/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp
            src/taglib/mpeg/id3v2/frames/ownershipframe.cpp
            src/taglib/mpeg/id3v2/frames/podcastframe.cpp
            src/taglib/mpeg/id3v2/frames/popularimeterframe.cpp
            src/taglib/mpeg/id3v2/frames/privateframe.cpp
            src/taglib/mpeg/id3v2/frames/relativevolumeframe.cpp
            src/taglib/mpeg/id3v2/frames/synchronizedlyricsframe.cpp
            src/taglib/mpeg/id3v2/frames/tableofcontentsframe.cpp
            src/taglib/mpeg/id3v2/frames/textidentificationframe.cpp
            src/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.cpp
            src/taglib/mpeg/id3v2/frames/unknownframe.cpp
            src/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.cpp
            src/taglib/mpeg/id3v2/frames/urllinkframe.cpp
            src/taglib/mpeg/id3v2/id3v2extendedheader.cpp
            src/taglib/mpeg/id3v2/id3v2footer.cpp
            src/taglib/mpeg/id3v2/id3v2frame.cpp
            src/taglib/mpeg/id3v2/id3v2framefactory.cpp
            src/taglib/mpeg/id3v2/id3v2header.cpp
            src/taglib/mpeg/id3v2/id3v2synchdata.cpp
            src/taglib/mpeg/id3v2/id3v2tag.cpp
            src/taglib/mpeg/mpegfile.cpp
            src/taglib/mpeg/mpegheader.cpp
            src/taglib/mpeg/mpegproperties.cpp
            src/taglib/mpeg/xingheader.cpp
            src/taglib/ogg/flac/oggflacfile.cpp
            src/taglib/ogg/opus/opusfile.cpp
            src/taglib/ogg/opus/opusproperties.cpp
            src/taglib/ogg/speex/speexfile.cpp
            src/taglib/ogg/speex/speexproperties.cpp
            src/taglib/ogg/vorbis/vorbisfile.cpp
            src/taglib/ogg/vorbis/vorbisproperties.cpp
            src/taglib/ogg/oggfile.cpp
            src/taglib/ogg/oggpage.cpp
            src/taglib/ogg/oggpageheader.cpp
            src/taglib/ogg/xiphcomment.cpp
            src/taglib/riff/aiff/aifffile.cpp
            src/taglib/riff/aiff/aiffproperties.cpp
            src/taglib/riff/wav/infotag.cpp
            src/taglib/riff/wav/wavfile.cpp
            src/taglib/riff/wav/wavproperties.cpp
            src/taglib/riff/rifffile.cpp
            src/taglib/s3m/s3mfile.cpp
            src/taglib/s3m/s3mproperties.cpp
            src/taglib/toolkit/tbytevector.cpp
            src/taglib/toolkit/tbytevectorlist.cpp
            src/taglib/toolkit/tbytevectorstream.cpp
            src/taglib/toolkit/tdebug.cpp
            src/taglib/toolkit/tdebuglistener.cpp
            src/taglib/toolkit/tfile.cpp
            src/taglib/toolkit/tfilestream.cpp
            src/taglib/toolkit/tiostream.cpp
            src/taglib/toolkit/tpropertymap.cpp
            src/taglib/toolkit/trefcounter.cpp
            src/taglib/toolkit/tstring.cpp
            src/taglib/toolkit/tstringlist.cpp
            src/taglib/toolkit/tzlib.cpp
            src/taglib/toolkit/unicode.cpp
            src/taglib/trueaudio/trueaudiofile.cpp
            src/taglib/trueaudio/trueaudioproperties.cpp
            src/taglib/wavpack/wavpackfile.cpp
            src/taglib/wavpack/wavpackproperties.cpp
            src/taglib/xm/xmfile.cpp
            src/taglib/xm/xmproperties.cpp
            src/taglib/audioproperties.cpp
            src/taglib/fileref.cpp
            src/taglib/tag.cpp
            src/taglib/tagunion.cpp
            src/taglib/tagutils.cpp
            src/taglib/ape/apefile.h
            src/taglib/ape/apefooter.h
            src/taglib/ape/apeitem.h
            src/taglib/ape/apeproperties.h
            src/taglib/ape/apetag.h
            src/taglib/asf/asfattribute.h
            src/taglib/asf/asffile.h
            src/taglib/asf/asfpicture.h
            src/taglib/asf/asfproperties.h
            src/taglib/asf/asftag.h
            src/taglib/asf/asfutils.h
            src/taglib/flac/flacfile.h
            src/taglib/flac/flacmetadatablock.h
            src/taglib/flac/flacpicture.h
            src/taglib/flac/flacproperties.h
            src/taglib/flac/flacunknownmetadatablock.h
            src/taglib/it/itfile.h
            src/taglib/it/itproperties.h
            src/taglib/mod/modfile.h
            src/taglib/mod/modfilebase.h
            src/taglib/mod/modfileprivate.h
            src/taglib/mod/modproperties.h
            src/taglib/mod/modtag.h
            src/taglib/mp4/mp4atom.h
            src/taglib/mp4/mp4coverart.h
            src/taglib/mp4/mp4file.h
            src/taglib/mp4/mp4item.h
            src/taglib/mp4/mp4properties.h
            src/taglib/mp4/mp4tag.h
            src/taglib/mpc/mpcfile.h
            src/taglib/mpc/mpcproperties.h
            src/taglib/mpeg/id3v1/id3v1genres.h
            src/taglib/mpeg/id3v1/id3v1tag.h
            src/taglib/mpeg/id3v2/frames/attachedpictureframe.h
            src/taglib/mpeg/id3v2/frames/chapterframe.h
            src/taglib/mpeg/id3v2/frames/commentsframe.h
            src/taglib/mpeg/id3v2/frames/eventtimingcodesframe.h
            src/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.h
            src/taglib/mpeg/id3v2/frames/ownershipframe.h
            src/taglib/mpeg/id3v2/frames/podcastframe.h
            src/taglib/mpeg/id3v2/frames/popularimeterframe.h
            src/taglib/mpeg/id3v2/frames/privateframe.h
            src/taglib/mpeg/id3v2/frames/relativevolumeframe.h
            src/taglib/mpeg/id3v2/frames/synchronizedlyricsframe.h
            src/taglib/mpeg/id3v2/frames/tableofcontentsframe.h
            src/taglib/mpeg/id3v2/frames/textidentificationframe.h
            src/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.h
            src/taglib/mpeg/id3v2/frames/unknownframe.h
            src/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.h
            src/taglib/mpeg/id3v2/frames/urllinkframe.h
            src/taglib/mpeg/id3v2/id3v2extendedheader.h
            src/taglib/mpeg/id3v2/id3v2footer.h
            src/taglib/mpeg/id3v2/id3v2frame.h
            src/taglib/mpeg/id3v2/id3v2framefactory.h
            src/taglib/mpeg/id3v2/id3v2header.h
            src/taglib/mpeg/id3v2/id3v2synchdata.h
            src/taglib/mpeg/id3v2/id3v2tag.h
            src/taglib/mpeg/mpegfile.h
            src/taglib/mpeg/mpegheader.h
            src/taglib/mpeg/mpegproperties.h
            src/taglib/mpeg/mpegutils.h
            src/taglib/mpeg/xingheader.h
            src/taglib/ogg/flac/oggflacfile.h
            src/taglib/ogg/opus/opusfile.h
            src/taglib/ogg/opus/opusproperties.h
            src/taglib/ogg/speex/speexfile.h
            src/taglib/ogg/speex/speexproperties.h
            src/taglib/ogg/vorbis/vorbisfile.h
            src/taglib/ogg/vorbis/vorbisproperties.h
            src/taglib/ogg/oggfile.h
            src/taglib/ogg/oggpage.h
            src/taglib/ogg/oggpageheader.h
            src/taglib/ogg/xiphcomment.h
            src/taglib/riff/aiff/aifffile.h
            src/taglib/riff/aiff/aiffproperties.h
            src/taglib/riff/wav/infotag.h
            src/taglib/riff/wav/wavfile.h
            src/taglib/riff/wav/wavproperties.h
            src/taglib/riff/rifffile.h
            src/taglib/riff/riffutils.h
            src/taglib/s3m/s3mfile.h
            src/taglib/s3m/s3mproperties.h
            src/taglib/toolkit/taglib.h
            src/taglib/toolkit/tbytevector.h
            src/taglib/toolkit/tbytevectorlist.h
            src/taglib/toolkit/tbytevectorstream.h
            src/taglib/toolkit/tdebug.h
            src/taglib/toolkit/tdebuglistener.h
            src/taglib/toolkit/tfile.h
            src/taglib/toolkit/tfilestream.h
            src/taglib/toolkit/tiostream.h
            src/taglib/toolkit/tlist.h
            src/taglib/toolkit/tmap.h
            src/taglib/toolkit/tpropertymap.h
            src/taglib/toolkit/trefcounter.h
            src/taglib/toolkit/tstring.h
            src/taglib/toolkit/tstringlist.h
            src/taglib/toolkit/tutils.h
            src/taglib/toolkit/tzlib.h
            src/taglib/toolkit/unicode.h
            src/taglib/trueaudio/trueaudiofile.h
            src/taglib/trueaudio/trueaudioproperties.h
            src/taglib/wavpack/wavpackfile.h
            src/taglib/wavpack/wavpackproperties.h
            src/taglib/xm/xmfile.h
            src/taglib/xm/xmproperties.h
            src/taglib/audioproperties.h
            src/taglib/fileref.h
            src/taglib/tag.h
            src/taglib/taglib_export.h
            src/taglib/tagunion.h
            src/taglib/tagutils.h
            )
endif ()

set(SOURCE_FILES
        ${TAGLIB_SOURCES}
        src/miniz/miniz.h
        src/miniz/miniz.c
        src/main.cpp
        src/dlgaddsong.cpp
        src/mediabackend.cpp
        src/mzarchive.cpp
        src/okjutil.h
        src/okjtypes.cpp
        src/dlgvideopreview.cpp
        src/mainwindow.cpp
        src/dbupdater.cpp
        src/directorymonitor.cpp
        src/dlgkeychange.cpp
        src/dlgdatabase.cpp
        src/dlgrequests.cpp
        src/dlgregularexport.cpp
        src/dlgregularimport.cpp
        src/dlgregularsingers.cpp
        src/dlgsettings.cpp
        src/dlgcdg.cpp
        src/okarchive.cpp
        src/models/tablemodelbreaksongs.cpp
        src/models/tablemodelcustomnamingpatterns.cpp
        src/models/tablemodelhistorysingers.cpp
        src/models/tablemodelhistorysongs.cpp
        src/models/tablemodelkaraokesongs.cpp
        src/models/tablemodelkaraokesourcedirs.cpp
        src/models/tablemodelplaylistsongs.cpp
        src/models/tablemodelqueuesongs.cpp
        src/models/tablemodelrequests.cpp
        src/models/tablemodelrotation.cpp
        src/models/tablemodelsongshopsongs.cpp
        src/tagreader.cpp
        src/bmdbupdatethread.cpp
        src/settings.cpp
        src/bmdbdialog.cpp
        src/dlgcustompatterns.cpp
        src/audiorecorder.cpp
        src/okjsongbookapi.cpp
        src/dlgdbupdate.cpp
        src/dlgbookcreator.cpp
        src/dlgeq.cpp
        src/audiofader.cpp
        src/customlineedit.cpp
        src/tickernew.cpp
        src/updatechecker.cpp
        src/videodisplay.cpp
        src/volslider.cpp
        src/dlgaddsinger.cpp
        src/songshop.cpp
        src/dlgsongshop.cpp
        src/simplecrypt.cpp
        src/dlgsongshoppurchase.cpp
        src/dlgsetpassword.cpp
        src/dlgpassword.cpp
        src/dlgpurchaseprogress.cpp
        src/karaokefileinfo.cpp
        src/karaokefilepatternresolver.cpp
        src/custompattern.cpp
        src/dlgeditsong.cpp
        src/soundfxbutton.cpp
        src/runguard/runguard.cpp
        src/durationlazyupdater.cpp
        src/idledetect.cpp
        src/mainwindow.h
        src/dlgaddsong.h
        src/dlgvideopreview.h
        src/mediabackend.h
        src/mzarchive.h
        src/okjutil.h
        src/okjtypes.h
        src/dbupdater.h
        src/directorymonitor.h
        src/dlgkeychange.h
        src/dlgdatabase.h
        src/dlgrequests.h
        src/dlgregularexport.h
        src/dlgregularimport.h
        src/dlgregularsingers.h
        src/dlgsettings.h
        src/dlgcdg.h
        src/okarchive.h
        src/models/tablemodelbreaksongs.h
        src/models/tablemodelcustomnamingpatterns.h
        src/models/tablemodelhistorysingers.h
        src/models/tablemodelhistorysongs.h
        src/models/tablemodelkaraokesongs.h
        src/models/tablemodelkaraokesourcedirs.h
        src/models/tablemodelplaylistsongs.h
        src/models/tablemodelqueuesongs.h
        src/models/tablemodelrequests.h
        src/models/tablemodelrotation.h
        src/models/tablemodelsongshopsongs.h
        src/tagreader.h
        src/bmdbupdatethread.h
        src/settings.h
        src/bmdbdialog.h
        src/dlgcustompatterns.h
        src/audiorecorder.h
        src/okjsongbookapi.h
        src/dlgdbupdate.h
        src/dlgbookcreator.h
        src/dlgeq.h
        src/audiofader.h
        src/customlineedit.h
        src/tickernew.h
        src/updatechecker.h
        src/videodisplay.h
        src/volslider.h
        src/okjversion.h
        src/dlgaddsinger.h
        src/songshop.h
        src/dlgsongshop.h
        src/simplecrypt.h
        src/dlgsongshoppurchase.h
        src/dlgsetpassword.h
        src/dlgpassword.h
        src/dlgpurchaseprogress.h
        src/karaokefileinfo.h
        src/karaokefilepatternresolver.h
        src/custompattern.h
        src/dlgeditsong.h
        src/soundfxbutton.h
        src/runguard/runguard.h
        src/models/tableviewtooltipfilter.h
        src/durationlazyupdater.h
        src/idledetect.h
        src/mainwindow.ui
        src/dlgaddsong.ui
        src/dlgkeychange.ui
        src/dlgdatabase.ui
        src/dlgrequests.ui
        src/dlgregularexport.ui
        src/dlgregularimport.ui
        src/dlgregularsingers.ui
        src/dlgsettings.ui
        src/dlgcdg.ui
        src/bmdbdialog.ui
        src/dlgcustompatterns.ui
        src/dlgdbupdate.ui
        src/dlgbookcreator.ui
        src/dlgeq.ui
        src/dlgaddsinger.ui
        src/dlgsongshop.ui
        src/dlgsongshoppurchase.ui
        src/dlgsetpassword.ui
        src/dlgpassword.ui
        src/dlgpurchaseprogress.ui
        src/dlgeditsong.ui
        src/dlgvideopreview.ui
        src/resources.qrc
        src/softwarerendervideosink.cpp
        src/softwarerendervideosink.h
        src/cdg/cdgappsrc.cpp
        src/cdg/cdgappsrc.h
        src/cdg/cdgfilereader.cpp
        src/cdg/cdgfilereader.h
        src/cdg/cdgimageframe.cpp
        src/cdg/cdgimageframe.h
        src/cdg/libCDG.h
        src/gstreamer/gstreamerhelper.cpp
        src/gstreamer/gstreamerhelper.h
        )

set(LIBRARIES
        spdlog
        Qt5::Widgets
        Qt5::Core
        Qt5::Gui
        Qt5::Sql
        Qt5::Network
        Qt5::Svg
        Qt5::PrintSupport
        Qt5::Concurrent
        )


if (${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")

    if (EXTERNAL_TAGLIB)
        list(APPEND LIBRARIES "PkgConfig::TAGLIB")
    endif ()

    if (EXTERNAL_SPDLOG)
        list(APPEND LIBRARIES "PkgConfig::SPDLOG")
    endif ()

    add_executable(openkj
            ${SOURCE_FILES}
            )
    target_link_libraries(openkj ${LIBRARIES} ${GSTREAMER_LIBRARIES})

    install(
            TARGETS openkj
            DESTINATION bin
    )
    install(
            FILES src/Icons/org.openkj.OpenKJ.svg
            DESTINATION share/icons/hicolor/scalable/apps
    )
    install(
            FILES src/org.openkj.OpenKJ.desktop
            DESTINATION share/applications
    )
    install(
            FILES src/org.openkj.OpenKJ.metainfo.xml
            DESTINATION share/metainfo
    )
endif ()

if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
    set(openkj_ICON ${CMAKE_CURRENT_SOURCE_DIR}/src/Icons/OpenKJ.icns)

    find_package(PkgConfig REQUIRED)
    pkg_check_modules(GSTREAMER REQUIRED gstreamer-1.0 gstreamer-app-1.0 gstreamer-audio-1.0 gstreamer-pbutils-1.0 gstreamer-controller-1.0 gstreamer-video-1.0)

    set_source_files_properties(${openkj_ICON} PROPERTIES
            MACOSX_PACKAGE_LOCATION "Resources"
            )
    add_executable(openkj
            MACOSX_BUNDLE
            ${openkj_ICON}
            ${SOURCE_FILES}
            )
    set_target_properties(openkj PROPERTIES
            BUNDLE True
            MACOSX_BUNDLE_GUI_IDENTIFIER org.openkj.openkj
            MACOSX_BUNDLE_BUNDLE_NAME OpenKJ
            MACOSX_BUNDLE_BUNDLE_VERSION ${sem_ver}
            MACOSX_BUNDLE_ICON_FILE OpenKJ.icns
            )
    target_link_libraries(openkj
            ${LIBRARIES}
	    #"-F /Library/Frameworks -framework GStreamer"
	    ${GSTREAMER_LIBRARIES}
            ${GSTREAMER_FRAMEWORK}
            )
    if (NOT DEFINED BUILDONLY)
        get_target_property(_qt5_qmake_location Qt5::qmake IMPORTED_LOCATION)
        execute_process(
                COMMAND "${_qt5_qmake_location}" -query QT_INSTALL_PREFIX
                RESULT_VARIABLE return_code
                OUTPUT_VARIABLE qt5_install_prefix
                OUTPUT_STRIP_TRAILING_WHITESPACE
        )
        if (qt5_install_prefix)
            find_program(MACDEPLOYQT macdeployqt HINTS ${qt5_install_prefix} PATH_SUFFIXES bin)
            if (MACDEPLOYQT)
                if (DEFINED MAC_SIGNING_IDENTITY)
                    add_custom_command(
                            TARGET openkj
                            COMMAND "${MACDEPLOYQT}"
                            VERBATIM
                            ARGS
                            "${CMAKE_BINARY_DIR}/openkj.app"
                            -codesign=${MAC_SIGNING_IDENTITY}
                            "-appstore-compliant"
                    )
                else ()
                    add_custom_command(
                            TARGET openkj
                            COMMAND "${MACDEPLOYQT}"
                            ARGS "${CMAKE_BINARY_DIR}/openkj.app"
                    )
                endif ()
            else ()
                message("Can't find macdeployqt")
            endif ()
        else ()
            message("QT_INSTALL_DIR not defined")
        endif ()
        if (DEFINED BUNDLE_GSTREAMER)
            message("Installing GStreamer framework into app bundle")
            install(
                    DIRECTORY "/Library/Frameworks/GStreamer.framework.dist"
                    DESTINATION "openkj.app/Contents/Frameworks/GStreamer.framework"
            )
            add_custom_command(
                    TARGET openkj
                    POST_BUILD
                    COMMAND "cp"
                    ARGS
                    "-pR"
                    "/Library/Frameworks/GStreamer.framework.dist"
                    "openkj.app/Contents/Frameworks/GStreamer.framework"
                    COMMAND "osxrelocator"
                    ARGS
                    "openkj.app/Contents/Frameworks/GStreamer.framework/Versions/Current/lib"
                    "/Library/Frameworks/GStreamer.framework/"
                    "@executable_path/../Frameworks/GStreamer.framework/"
                    "-r"
                    USES_TERMINAL
                    COMMAND "osxrelocator"
                    ARGS
                    "openkj.app/Contents/Frameworks/GStreamer.framework/Versions/Current/libexec"
                    "/Library/Frameworks/GStreamer.framework/"
                    "@executable_path/../../../../../../Frameworks/GStreamer.framework/"
                    "-r"
                    USES_TERMINAL
                    COMMAND "osxrelocator"
                    ARGS
                    "openkj.app/Contents/Frameworks/GStreamer.framework/Versions/Current/bin"
                    "/Library/Frameworks/GStreamer.framework/"
                    "@executable_path/../../../../Frameworks/GStreamer.framework/"
                    "-r"
                    USES_TERMINAL
                    COMMAND "osxrelocator"
                    ARGS
                    "openkj.app/Contents/MacOS"
                    "/Library/Frameworks/GStreamer.framework/"
                    "@executable_path/../Frameworks/GStreamer.framework/"
                    "-r"
                    USES_TERMINAL
            )
        endif ()
    endif ()
endif ()

if (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
    add_executable(openkj
            ${SOURCE_FILES}
            ${WINDOWS_ICON_RC}
            )
    target_link_libraries(openkj PRIVATE ${LIBRARIES})
    set_property(
            TARGET openkj
            PROPERTY WIN32_EXECUTABLE true
    )

    if (DEFINED DEPLOY_DEPS)
        get_target_property(_qt5_qmake_location Qt5::qmake IMPORTED_LOCATION)
        execute_process(
                COMMAND "${_qt5_qmake_location}" -query QT_INSTALL_PREFIX
                RESULT_VARIABLE return_code
                OUTPUT_VARIABLE qt5_install_prefix
                OUTPUT_STRIP_TRAILING_WHITESPACE
        )
        install(DIRECTORY "${GST_BASE_PATH}/bin/" DESTINATION "bin")
        if (qt5_install_prefix)
            find_program(WINDEPLOYQT windeployqt HINTS ${qt5_install_prefix} PATH_SUFFIXES bin)
            if (WINDEPLOYQT)
                add_custom_command(
                        TARGET openkj
                        COMMAND "${WINDEPLOYQT}"
                        ARGS "${CMAKE_BINARY_DIR}\\openkj.exe"
                )
            else ()
                message("Can't find windeployqt")
            endif ()
        else ()
            message("QT_INSTALL_DIR not defined")
        endif ()
        add_custom_command(
                TARGET openkj
                COMMAND "xcopy"
                ARGS "${GST_BASE_PATH_NATIVE}\\*" "/s" "/y"
                COMMAND "xcopy"
                ARGS "${GST_BASE_PATH_NATIVE}\\bin\\*.dll" "/y"
        )
    endif ()
endif ()


