#
# 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/>.
#


#
# Configuration
#

# CMake minimum version.
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

# Load user preferences.
INCLUDE("${CMAKE_SOURCE_DIR}/preferences.cmake" OPTIONAL)

# Default to Release build type. This needs to be before PROJECT().
IF(NOT DEFINED CMAKE_BUILD_TYPE)
  MESSAGE(WARNING "\nBuild type not set. Defaulting to \"Release\".")
  SET(CMAKE_BUILD_TYPE Release CACHE STRING
      "Build type unset. Forced to \"Release\"." FORCE)
ENDIF()

# Options
INCLUDE(CMakeDependentOption)
OPTION(OPTION_MOONPHASE_USEDEBUGLOG "Enable debug logging." OFF)
OPTION(OPTION_MOONPHASE_USEMESSAGELOG "Enable message logging." OFF)
OPTION(OPTION_MOONPHASE_USEDEBUGTOOLS "Enable debugging tools." OFF)
CMAKE_DEPENDENT_OPTION(OPTION_MOONPHASE_USECCACHE "Enable ccache." OFF UNIX OFF)

# Project name.
PROJECT("Moon Phase")

# Project information.
SET(MOONPHASE_DISPLAYNAME "${PROJECT_NAME}")
STRING(TOLOWER "${PROJECT_NAME}" PROJECT_NAMELC)
STRING(REPLACE " " "" PROJECT_NAMELCNS "${PROJECT_NAMELC}")
SET(MOONPHASE_EXECUTABLENAME ${PROJECT_NAMELCNS})
SET(MOONPHASE_MAJORVERSION "0")                 # Overridable.
SET(MOONPHASE_MINORVERSION "4")                 # Overridable.
SET(MOONPHASE_PATCHVERSION "2")                 # Overridable.
SET(MOONPHASE_DESCRIPTION                       # Overridable.
    "Displays the phase of the moon in the system tray."
    " Additionally, a window and/or tool tip can be displayed that shows user"
    " configurable data"
    " about the moon (rise/set times, percent illumination, etc).")
STRING(REPLACE ";" "" MOONPHASE_DESCRIPTION "${MOONPHASE_DESCRIPTION}")
SET(MOONPHASE_OWNERNAME "Alan Wise")
SET(MOONPHASE_COPYRIGHTNOTICE "Copyright (C) 2014-2018 ${MOONPHASE_OWNERNAME}.")
SET(MOONPHASE_WEBSITE "https://moonphase.gitlab.com")
SET(MOONPHASE_LICENSE
    "License GPLv3: GNU GPL version 3 or later <http://www.gnu.org/licenses/>.")

# Convert license agreement to include file.
FILE(READ "${PROJECT_SOURCE_DIR}/documentation/license.txt" TEXT)
STRING(REGEX REPLACE "\"" "\\\\\"" ESCAPEQUOTES "${TEXT}")
STRING(REGEX REPLACE "\n" "\\\\n\"\n\"" CCODE "${ESCAPEQUOTES}")
SET(INCLUDETEXT "const char f_pLicenseAgreement[]=\n\"${CCODE}\";")
FILE(WRITE
    "${CMAKE_CURRENT_BINARY_DIR}/licenseagreement.h" "${INCLUDETEXT}")

# Convert change log to include file.
FILE(READ "${PROJECT_SOURCE_DIR}/documentation/changelog.txt" TEXT)
STRING(REGEX REPLACE "\"" "\\\\\"" ESCAPEQUOTES "${TEXT}")
STRING(REGEX REPLACE "\n" "\\\\n\"\n\"" CCODE "${ESCAPEQUOTES}")
SET(INCLUDETEXT "const char f_pChangeLog[]=\n\"${CCODE}\";")
FILE(WRITE
    "${CMAKE_CURRENT_BINARY_DIR}/changelog.h" "${INCLUDETEXT}")

# Additional compiler options and settings.
IF(${CMAKE_C_COMPILER_ID} STREQUAL GNU)
  SET(DEFINE_PREFIX -D)
  ADD_DEFINITIONS(${DEFINE_PREFIX}_GNU_SOURCE)
      # Need this define for certain prototypes.
  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \
      -ansi -Wall -Wextra -Wcast-qual -Wconversion -Wformat=2 -Wshadow \
      -Wstrict-overflow=5 -Wunused -std=c99")
      # >=c99 for wchar_t.
  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
      -ansi -Wall -Wextra -Wcast-qual -Wconversion -Wformat=2 -Wshadow \
      -Wstrict-overflow=5 -Wunused -fvisibility=hidden")
  IF(NOT CMAKE_SYSTEM_NAME STREQUAL Darwin)
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
  ENDIF()
ELSEIF(${CMAKE_C_COMPILER_ID} STREQUAL MSVC)
  SET(DEFINE_PREFIX /D)
  ADD_DEFINITIONS(
      ${DEFINE_PREFIX}_CRT_SECURE_NO_WARNINGS
      ${DEFINE_PREFIX}_CRT_NONSTDC_NO_DEPRECATE
      ${DEFINE_PREFIX}_USE_MATH_DEFINES)
ELSE()
  MESSAGE(FATAL_ERROR
      "Unknown compiler configuration. CMakeLists.txt needs to be updated!")
ENDIF()

# ccache
IF(UNIX AND OPTION_MOONPHASE_USECCACHE)
  FIND_PROGRAM(CCACHE_EXECUTABLE ccache)
  MARK_AS_ADVANCED(CCACHE_EXECUTABLE)
  IF(CCACHE_EXECUTABLE)
    SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_EXECUTABLE}")
    SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_LINK "${CCACHE_EXECUTABLE}")
  ENDIF()
ENDIF()

# Build environment.
IF(NOT UNIX AND NOT WIN32)
  MESSAGE(FATAL_ERROR
      "Unknown build configuration. CMakeLists.txt needs to be updated!")
ENDIF()

# If debug mode, set debug definition.
STRING(TOLOWER "${CMAKE_BUILD_TYPE}" BUILDTYPELC)
IF(${BUILDTYPELC} STREQUAL debug)
  ADD_DEFINITIONS(${DEFINE_PREFIX}DEBUG)
ENDIF()

# If release mode, set build release flag.
IF("${BUILDTYPELC}" STREQUAL "release")
  SET(BUILDRELEASEFLAG ON)
ELSE()
  SET(BUILDRELEASEFLAG OFF)
ENDIF()


#
# Include paths
#


#
# Sources
#


#
# Binaries
#


#
# Subdirectories
#

ADD_SUBDIRECTORY("awisetoolbox")
ADD_SUBDIRECTORY("qt")


#
# Installation
#


#
# CMakeLists.txt
#
