#
# CMakeLists.txt
# CMake makefile for the Moon Phase Qt application.
#

#
# This file is part of moonphase.
# Copyright (C) 2014-2018 by Alan Wise <awisesoftware@gmail.com>.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#


INCLUDE(ExternalProject)

SET(MOONPHASEQT_DISPLAYNAME "${MOONPHASE_DISPLAYNAME} (Qt)")

# Options.
OPTION(OPTION_MOONPHASE_BUILDMOONPHASEQT
    "Build the ${MOONPHASEQT_DISPLAYNAME} application." ON)
OPTION(OPTION_MOONPHASE_BUILDMOONPHASEQTDOCUMENTATION
    "Build the ${MOONPHASEQT_DISPLAYNAME} application documentation." OFF)


#
# Configuration
#

# Build information.
SET(MOONPHASEQT_EXECUTABLENAME "${MOONPHASE_EXECUTABLENAME}-qt")
STRING(REPLACE "-" "" MOONPHASEQT_EXECUTABLENAMEND "${MOONPHASEQT_EXECUTABLENAME}")
SET(MOONPHASEQT_MAJORVERSION ${MOONPHASE_MAJORVERSION})
SET(MOONPHASEQT_MINORVERSION ${MOONPHASE_MINORVERSION})
SET(MOONPHASEQT_PATCHVERSION ${MOONPHASE_PATCHVERSION})
SET(MOONPHASEQT_DESCRIPTION ${MOONPHASE_DESCRIPTION})

IF(OPTION_MOONPHASE_BUILDMOONPHASEQT)
  # Need Qt4.
  FIND_PACKAGE(Qt4 REQUIRED QtCore QtGui QtNetwork)
  INCLUDE(${QT_USE_FILE})
  # Create a configuration file.
  CONFIGURE_FILE(
      "${CMAKE_CURRENT_SOURCE_DIR}/cmake/config.h.in"
      "${CMAKE_CURRENT_BINARY_DIR}/config.h")
  # Create the desktop entry.
  IF(UNIX)
    CONFIGURE_FILE(
        "${CMAKE_CURRENT_SOURCE_DIR}/cmake/${MOONPHASEQT_EXECUTABLENAME}.desktop.in"
        "${CMAKE_CURRENT_BINARY_DIR}/${MOONPHASEQT_EXECUTABLENAME}.desktop")
  ENDIF()
  # Additional definitions.
  IF(MSVC)
    ADD_DEFINITIONS(${DEFINE_PREFIX}UNICODE)
        # Needed for qtsingleapplication (qlockedfile_win.cpp)
  ENDIF()
ENDIF()

IF(OPTION_MOONPHASE_BUILDMOONPHASEQTDOCUMENTATION)
  # Need Doxygen.
  FIND_PACKAGE(Doxygen REQUIRED)
  # Create the Doxygen file.
  CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/cmake/Doxyfile.in"
      "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile-${MOONPHASEQT_EXECUTABLENAME}")
ENDIF()


#
# Include paths
#

IF(OPTION_MOONPHASE_BUILDMOONPHASEQT)
  INCLUDE_DIRECTORIES(
      "${CMAKE_BINARY_DIR}/"
      "${CMAKE_CURRENT_BINARY_DIR}/"
      "${CMAKE_CURRENT_SOURCE_DIR}/sources"
      "${CMAKE_BINARY_DIR}/awisetoolbox/qt/widgets/"
      "${CMAKE_BINARY_DIR}/awisetoolbox/qt/utilities/sources/"
      "${CMAKE_SOURCE_DIR}/awisetoolbox/qt/widgets/sources/"
      "${CMAKE_SOURCE_DIR}/awisetoolbox/qt/utilities/sources/"
      "${CMAKE_SOURCE_DIR}/qt/qt-solutions/qtsingleapplication/src/"
      "${CMAKE_BINARY_DIR}/wwwidgets/widgets/"
      "${CMAKE_BINARY_DIR}/wwwidgets/widgets/qwwbuttonlineedit/"
      "${CMAKE_BINARY_DIR}/wwwidgets/widgets/qwwcolorbutton/"
      "${CMAKE_BINARY_DIR}/wwwidgets/widgets/qwwfilechooser/")
ENDIF()


#
# Sources
#

IF(OPTION_MOONPHASE_BUILDMOONPHASEQT)
  INCLUDE("${CMAKE_SOURCE_DIR}/common/common.cmake")
  SET(MOONPHASEQT_SOURCES
      "${CMAKE_CURRENT_SOURCE_DIR}/sources/${MOONPHASEQT_EXECUTABLENAMEND}.cpp"
      "${CMAKE_CURRENT_SOURCE_DIR}/sources/controlpaneldialog.cpp"
      "${CMAKE_CURRENT_SOURCE_DIR}/sources/drawframe.cpp"
      "${CMAKE_CURRENT_SOURCE_DIR}/sources/informationitem.cpp"
      "${CMAKE_CURRENT_SOURCE_DIR}/sources/informationitemoptions.cpp"
      "${CMAKE_CURRENT_SOURCE_DIR}/sources/informationoptionsdialog.cpp"
      "${CMAKE_CURRENT_SOURCE_DIR}/sources/informationpaneldialog.cpp"
      "${CMAKE_CURRENT_SOURCE_DIR}/sources/moonanimation.cpp"
      "${CMAKE_CURRENT_SOURCE_DIR}/sources/preferenceswidget.cpp"
      "${CMAKE_CURRENT_SOURCE_DIR}/sources/settings.cpp"
      "${CMAKE_CURRENT_SOURCE_DIR}/../qt-solutions/qtsingleapplication/src/qtlocalpeer.cpp"
      "${CMAKE_CURRENT_SOURCE_DIR}/../qt-solutions/qtsingleapplication/src/qtsingleapplication.cpp")
  SET(MOONPHASEQT_HEADERS
      "${CMAKE_CURRENT_SOURCE_DIR}/sources/controlpaneldialog.h"
      "${CMAKE_CURRENT_SOURCE_DIR}/sources/informationoptionsdialog.h"
      "${CMAKE_CURRENT_SOURCE_DIR}/sources/informationpaneldialog.h"
      "${CMAKE_CURRENT_SOURCE_DIR}/sources/preferenceswidget.h"
      "${CMAKE_CURRENT_SOURCE_DIR}/../qt-solutions/qtsingleapplication/src/qtlocalpeer.h"
      "${CMAKE_CURRENT_SOURCE_DIR}/../qt-solutions/qtsingleapplication/src/qtsingleapplication.h")
  SET(MOONPHASEQT_FORMS
      "${CMAKE_CURRENT_SOURCE_DIR}/forms/controlpaneldialog.ui"
      "${CMAKE_CURRENT_SOURCE_DIR}/forms/informationoptionsdialog.ui"
      "${CMAKE_CURRENT_SOURCE_DIR}/forms/informationpaneldialog.ui"
      "${CMAKE_CURRENT_SOURCE_DIR}/forms/preferenceswidget.ui")
  SET(MOONPHASEQT_RESOURCES
      "${CMAKE_CURRENT_SOURCE_DIR}/resources/${MOONPHASEQT_EXECUTABLENAMEND}.qrc")
  QT4_WRAP_CPP(MOONPHASEQT_MOC ${MOONPHASEQT_HEADERS})
  QT4_WRAP_UI(MOONPHASEQT_UI ${MOONPHASEQT_FORMS})
  QT4_ADD_RESOURCES(MOONPHASEQT_QRC ${MOONPHASEQT_RESOURCES})
  SET(MOONPHASEQT_FILES
      ${MOONPHASEQT_SOURCES}
      ${MOONPHASEQT_MOC}
      ${MOONPHASEQT_UI}
      ${MOONPHASEQT_QRC})
  FILE(GLOB MOONPHASE_IMAGES "${CMAKE_SOURCE_DIR}/images/*")
  IF(WIN32)
    SET(MOONPHASEQT_FILES ${MOONPHASEQT_FILES}
        "${CMAKE_CURRENT_SOURCE_DIR}/resources/${MOONPHASEQT_EXECUTABLENAME}.rc")
  ELSEIF(APPLE)
    SET(MACOS_RESOURCES
        "${CMAKE_CURRENT_LIST_DIR}/resources/${MOONPHASEQT_EXECUTABLENAME}.icns"
        "${MOONPHASE_IMAGES}")
    SET_SOURCE_FILES_PROPERTIES(${MACOS_RESOURCES} PROPERTIES
        MACOSX_PACKAGE_LOCATION "Resources")
    SET(MOONPHASEQT_FILES "${MOONPHASEQT_FILES}" "${MACOS_RESOURCES}")

    # Bundle data.
    SET(MACOSX_BUNDLE_BUNDLE_NAME "${PROJECT_NAME} Bundle")
#    SET(MACOSX_BUNDLE_GUI_IDENTIFIER "${PROJECT_NAME} GUI ID" )
    SET(MACOSX_BUNDLE_ICON_FILE "${MOONPHASEQT_EXECUTABLENAME}.icns" )
    SET(MACOSX_BUNDLE_INFO_STRING "${MOONPHASE_DESCRIPTION}")
    SET(MACOSX_BUNDLE_SHORT_VERSION_STRING
        "${MOONPHASE_MAJORVERSION}.${MOONPHASE_MINORVERSION}")
    SET(MACOSX_BUNDLE_LONG_VERSION_STRING
        "${MACOSX_BUNDLE_SHORT_VERSION_STRING}.${MOONPHASE_PATCHVERSION}")
    SET(MACOSX_BUNDLE_BUNDLE_VERSION
        "${MOONPHASE_MAJORVERSION}.${MOONPHASE_MINORVERSION}.${MOONPHASE_PATCHVERSION}")
    SET(MACOSX_BUNDLE_COPYRIGHT "${MOONPHASE_COPYRIGHTNOTICE}")
    SET(MACOSX_BUNDLE_HIDEFROMDOCK true)  # Used in custom Info.plist.
  ENDIF()
ENDIF()


#
# Binaries
#

IF(OPTION_MOONPHASE_BUILDMOONPHASEQT)
  # moonphase-qt depends on an external library that is built from source code.
  IF(UNIX)
    SET(BUILD_COMMAND "$(MAKE)")
    SET(GUI_TYPE )
    SET(WWWIDGETS_LIBRARYPATHNAME ".")
    SET(OS_LIBRARIES m)
    IF(CMAKE_SYSTEM_NAME STREQUAL Darwin)
      SET(GUI_TYPE MACOSX_BUNDLE)
      FIND_LIBRARY(COREFOUNDATIONFRAMEWORK CoreFoundation)
      IF(COREFOUNDATIONFRAMEWORK-NOTFOUND)
        MESSAGE(ERROR "CoreFoundation framework not found.")
      ENDIF()
      FIND_LIBRARY(SYSTEMCONFIGURATIONFRAMEWORK SystemConfiguration)
      IF(COREFOUNDATIONFRAMEWORK-NOTFOUND)
        MESSAGE(ERROR "SystemConfiguration framework not found.")
      ENDIF()
      FIND_LIBRARY(SECURITYFRAMEWORK Security)
      IF(COREFOUNDATIONFRAMEWORK-NOTFOUND)
        MESSAGE(ERROR "Security framework not found.")
      ENDIF()
      SET(OS_LIBRARIES ${OS_LIBRARIES}
          ${COREFOUNDATIONFRAMEWORK}
          ${SYSTEMCONFIGURATIONFRAMEWORK}
          ${SECURITYFRAMEWORK})
    ENDIF()
  ELSEIF(MSVC)
    SET(BUILD_COMMAND nmake)
    SET(GUI_TYPE WIN32)
    SET(WWWIDGETS_LIBRARYPATHNAME "${BUILDTYPELC}")
    SET(OS_LIBRARIES imm32.lib winmm.lib ws2_32.lib ${QT_QTMAIN_LIBRARY})
  ENDIF()
  SET(WWWIDGETS_LIBRARYPATHNAME
      "${WWWIDGETS_LIBRARYPATHNAME}/${CMAKE_STATIC_LIBRARY_PREFIX}wwwidgets4")
  IF(MSVC)
    IF("${BUILDTYPELC}" STREQUAL "debug")
      SET(WWWIDGETS_LIBRARYPATHNAME "${WWWIDGETS_LIBRARYPATHNAME}d")
    ENDIF()
  ENDIF()
  SET(WWWIDGETS_LIBRARYPATHNAME
      "${WWWIDGETS_LIBRARYPATHNAME}${CMAKE_STATIC_LIBRARY_SUFFIX}")
  EXTERNALPROJECT_ADD(wwwidgets
      URL "http://www.wysota.eu.org/wwwidgets/wwWidgets-1.0.tar.gz"
      URL_HASH MD5=e8f8cbe75ee409f18ba44f786bcc438c
      DOWNLOAD_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../wwwidgets/"
      SOURCE_DIR "${CMAKE_BINARY_DIR}/wwwidgets/"
      BINARY_DIR "${CMAKE_BINARY_DIR}/wwwidgets/"
      PATCH_COMMAND COMMAND patch --binary -p1 -i
          "${CMAKE_CURRENT_SOURCE_DIR}/../wwwidgets/01-dont_build_plugins.patch"
      PATCH_COMMAND COMMAND patch --binary -p1 -i
          "${CMAKE_CURRENT_SOURCE_DIR}/../wwwidgets/02-dont_build_all_widgets.patch"
      PATCH_COMMAND COMMAND patch --binary -p1 -i
          "${CMAKE_CURRENT_SOURCE_DIR}/../wwwidgets/03-g++_-fvisibility=hidden.patch"
        # --binary switches are needed by Windows GNU diff.
      CONFIGURE_COMMAND ${QT_QMAKE_EXECUTABLE} "CONFIG+=staticlib ${BUILDTYPELC}"
      BUILD_COMMAND ${BUILD_COMMAND}
      INSTALL_COMMAND "")

  # Create the executable
  ADD_EXECUTABLE(
      ${MOONPHASEQT_EXECUTABLENAME} ${GUI_TYPE}
      ${COMMON_FILES}
      ${MOONPHASEQT_FILES})
  TARGET_LINK_LIBRARIES(
      ${MOONPHASEQT_EXECUTABLENAME}
      awisetoolboxqtutilities
      awisetoolboxqtwidgets
      awisetoolboxgeneric
      "${CMAKE_BINARY_DIR}/wwwidgets/widgets/${WWWIDGETS_LIBRARYPATHNAME}"
      ${OS_LIBRARIES}
      ${QT_LIBRARIES})
  ADD_DEPENDENCIES(${MOONPHASEQT_EXECUTABLENAME} wwwidgets)
  IF(APPLE)
    # Custom Info.plist.
    SET_TARGET_PROPERTIES(${MOONPHASEQT_EXECUTABLENAME} PROPERTIES
        MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/macos/Info.plist.in")
  ENDIF()

  # Set up for cpack.
  IF(BUILDRELEASEFLAG)
    IF(MSVC)
      # Options for the NSIS generator.
      INCLUDE("${CMAKE_CURRENT_LIST_DIR}/windows/nsis.cmake")
      INCLUDE(CPack)
    ELSEIF(APPLE)
      # Options for the DragNDrop generator.
      INCLUDE("${CMAKE_CURRENT_LIST_DIR}/macos/dragndrop.cmake")
      INCLUDE(CPack)
    ELSEIF(UNIX)
      # Debian and Fedora are not handled by CPack.
    ELSE()
      MESSAGE(FATAL_ERROR "Unknown release configuration. CMakeLists.txt needs to be updated!")
    ENDIF()
  ENDIF()
ENDIF()

# Build the library documentation.
IF(OPTION_MOONPHASE_BUILDMOONPHASEQTDOCUMENTATION)
  ADD_CUSTOM_TARGET(doc-${MOONPHASEQT_EXECUTABLENAME} ALL
      COMMAND ${DOXYGEN_EXECUTABLE}
      "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile-${MOONPHASEQT_EXECUTABLENAME}"
      SOURCES
      "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile-${MOONPHASEQT_EXECUTABLENAME}")
ENDIF()


#
# Subdirectories
#


#
# Installation
#

IF(OPTION_MOONPHASE_BUILDMOONPHASEQT)
  # Install information.
  IF(UNIX AND NOT APPLE)
    SET(INSTALL_BINARYDIRECTORY "bin/")
    SET(INSTALL_IMAGEDIRECTORY "share/${MOONPHASEQT_EXECUTABLENAME}")
  ELSEIF(WIN32 OR APPLE)
    SET(INSTALL_BINARYDIRECTORY "./")
    SET(INSTALL_IMAGEDIRECTORY "./")
  ENDIF()
  # Install executable.
  INSTALL(TARGETS "${MOONPHASEQT_EXECUTABLENAME}"
      RUNTIME DESTINATION ${INSTALL_BINARYDIRECTORY}
      BUNDLE DESTINATION ${INSTALL_BINARYDIRECTORY})
  IF(UNIX AND NOT APPLE)
    # Install any images.
    INSTALL(FILES ${MOONPHASE_IMAGES} DESTINATION ${INSTALL_IMAGEDIRECTORY})
    # Install an icon.
    INSTALL(FILES
        "${CMAKE_CURRENT_SOURCE_DIR}/resources/${MOONPHASEQT_EXECUTABLENAME}.png"
        DESTINATION share/icons/)
    # Install the desktop file.
    INSTALL(FILES
        "${CMAKE_CURRENT_BINARY_DIR}/${MOONPHASEQT_EXECUTABLENAME}.desktop"
        DESTINATION share/applications/)
    # Install the man page.
    INSTALL(FILES
        "${CMAKE_CURRENT_SOURCE_DIR}/man/${MOONPHASEQT_EXECUTABLENAME}.1"
        DESTINATION share/man/man1/)
  ELSEIF(WIN32)
    # Install README.
    INSTALL(FILES "${CMAKE_CURRENT_SOURCE_DIR}/windows/README.txt"
        DESTINATION .)
  ENDIF()
ENDIF()


#
# CMakeLists.txt
#
