###
### CMakeLists for calyp
###

cmake_minimum_required( VERSION 3.2.0 )

######################################################################################
# CMake  functions
######################################################################################
SET(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake )
INCLUDE( cmake/ModulesFct.cmake )
INCLUDE(FeatureSummary)
INCLUDE(GNUInstallDirs)

######################################################################################
# Project Definition
######################################################################################

SET( PROJECT_NAME "calyp" CACHE INTERNAL "" FORCE )
SET( PROJECT_LIBRARY "Calyp" CACHE INTERNAL "" FORCE )


PROJECT( ${PROJECT_NAME} )
SET( CALYP_VERSION_MAJOR "1" )
SET( CALYP_VERSION_MINOR "1" )
SET( CALYP_VERSION_PATCH "0" )
SET( CALYP_VERSION "${CALYP_VERSION_MAJOR}.${CALYP_VERSION_MINOR}.${CALYP_VERSION_PATCH}" CACHE INTERNAL "" FORCE )

######################################################################################
# Variables
######################################################################################

OPTION( BUILD_APP               "Build GUI Application"                 ON  )
OPTION( BUILD_TOOLS             "Build Command Line Application"        ON  )
OPTION( BUILD_EXAMPLES          "Build Examples"                        OFF )
OPTION( BUILD_DOC               "Build Documentation"                   OFF )
OPTION( BUILD_TESTS             "Build Google Tests"                    OFF )

OPTION( USE_FERVOR              "Add Fervor support"                    OFF )

OPTION( USE_DYNLOAD             "Use dynamic load of modules"           ON  )
OPTION( USE_SSE                 "Build with SSE support"                OFF )
OPTION( USE_WERROR              "Warnings as errors"                    OFF )
OPTION( USE_STATIC              "Use static libs"                       OFF )


######################################################################################
# Release configuration
######################################################################################

# To be switched on when releasing.
OPTION(RELEASE_BUILD "Remove Git revision from program version (use for stable releases)" ON)

# Get current version.
set(CALYP_VERSION_STRING "${CALYP_VERSION}")
if(NOT RELEASE_BUILD AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git)
  # Probably a Git workspace; determine the revision.
  FIND_PACKAGE(Git QUIET)
  if(GIT_FOUND)
    exec_program(${GIT_EXECUTABLE}
      ${CMAKE_CURRENT_SOURCE_DIR}
      ARGS "describe --tags"
      OUTPUT_VARIABLE CALYP_GIT_REVISION
      RETURN_VALUE TAG_RESULT
    )
    # git describe --tags failed; maybe the repository was checked with depth=1.
    if(NOT ${TAG_RESULT} EQUAL 0)
      exec_program(${GIT_EXECUTABLE}
        ${CMAKE_CURRENT_SOURCE_DIR}
        ARGS "describe --always"
        OUTPUT_VARIABLE CALYP_GIT_REVISION
      )
    endif()
    message(STATUS "Calyp Git revision: ${CALYP_GIT_REVISION}")
    set(CALYP_VERSION_STRING "${CALYP_VERSION} (rev. ${CALYP_GIT_REVISION})")
  else()
    message(STATUS "Calyp Git revision could not be determined")
  endif()
endif()

SET(UPDATE_CHANNEL "stable" CACHE STRING "Update channel" )
# CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/CalypUpdate.xml.in ${CMAKE_CURRENT_BINARY_DIR}/CalypUpdate-${UPDATE_CHANNEL}.xml )


######################################################################################
# Dependencies
######################################################################################

IF( BUILD_DOC )
  FIND_PACKAGE(Doxygen)
  SET( BUILD_DOC ${Doxygen_FOUND} )
ENDIF()
SET_PACKAGE_PROPERTIES(Doxygen PROPERTIES URL "http://www.doxygen.org/" DESCRIPTION "Doxygen" TYPE OPTIONAL)


IF( BUILD_TESTS )
  FIND_PACKAGE(GTest)
  SET( BUILD_DOC ${GTEST_FOUND} )
  IF( GTEST_FOUND )
    ENABLE_TESTING()
    INCLUDE_DIRECTORIES(${GTEST_INCLUDE_DIRS})
  ENDIF()
ENDIF()

OPTION( USE_OPENCV "Add OpenCV support" ON )
IF( USE_OPENCV )

  FIND_PACKAGE( OpenCV COMPONENTS core highgui imgproc video )
  IF( ${OpenCV_FOUND} )
    SET(USE_OPENCV TRUE )
    LIST(APPEND OPENCV_MODULES core highgui imgproc video )
    FIND_PACKAGE( OpenCV COMPONENTS videoio )
    IF( ${OPENCV_VIDEOIO_FOUND} )
      LIST(APPEND OPENCV_MODULES videoio )
    ENDIF()
  ELSE()
    SET(USE_OPENCV FALSE )
  ENDIF()
ENDIF()
SET_PACKAGE_PROPERTIES(OpenCV PROPERTIES URL "http://opencv.willowgarage.com" DESCRIPTION "OpenCV library support in CalypFrame" TYPE OPTIONAL)

OPTION( USE_FFMPEG "Add FFMPEG support" ON )
IF( USE_FFMPEG )
  FIND_PACKAGE( FFmpeg COMPONENTS AVCODEC AVFORMAT AVUTIL SWSCALE )
  IF( "${AVCODEC_VERSION}" VERSION_LESS "56.0.0" )
    SET(FFMPEG_FOUND FALSE )
    SET(FFmpeg_FOUND FALSE )
  ENDIF()
  SET(USE_FFMPEG ${FFMPEG_FOUND})
ENDIF()
SET_PACKAGE_PROPERTIES(FFmpeg PROPERTIES URL "http://ffmpeg.org/" DESCRIPTION "Libav library support in CalypStream" TYPE OPTIONAL)

IF( WIN32 )
  SET( USE_STATIC ON )
  INCLUDE( cmake/Win32.cmake )
ENDIF()


######################################################################################
# CMake Defin1itions
######################################################################################

SET(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake )
INCLUDE(FeatureSummary)

# must go before the project command
SET(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Configs" FORCE)
IF(DEFINED CMAKE_BUILD_TYPE AND CMAKE_VERSION VERSION_GREATER "2.8")
  SET_PROPERTY( CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ${CMAKE_CONFIGURATION_TYPES} )
ENDIF()
SET( CMAKE_CXX_FLAGS "" )

INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} )

######################################################################################
# Compiler options
######################################################################################

SET(CMAKE_CXX_STANDARD 14)
if(CMAKE_COMPILER_IS_GNUCXX)
    ADD_DEFINITIONS(-std=gnu++0x)
endif()

IF (NOT CMAKE_BUILD_TYPE )
    MESSAGE(STATUS "No build type selected, default to Release")
    SET(CMAKE_BUILD_TYPE "Release")
ENDIF()

SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall" )

ADD_DEFINITIONS(-DQT_NO_CAST_TO_ASCII
                #-DQT_NO_CAST_FROM_ASCII
                -DQT_NO_URL_CAST_FROM_STRING
                -DQT_NO_CAST_FROM_BYTEARRAY
                #-DQT_NO_SIGNALS_SLOTS_KEYWORDS
                #-DQT_USE_QSTRINGBUILDER
               )

# if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
#    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic")
# endif()

if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
   if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.0.0")
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -Wlogical-op" )
   endif()
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations" )
endif()

IF( USE_WERROR )
  SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror" )
ENDIF()

SET( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -O0" )
SET( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2" )


######################################################################################
# Configure targets
######################################################################################

ADD_FEATURE_INFO(CalypApp     BUILD_APP    "Build Graphical interface")
ADD_FEATURE_INFO(CalypTools   BUILD_TOOLS  "Build Command line tool"  )
ADD_FEATURE_INFO(DynLoad    USE_DYNLOAD   "Support for dynamic module load" )
ADD_FEATURE_INFO(SSE        USE_SSE       "SSE instructions support" )
ADD_FEATURE_INFO(WErrors    USE_WERROR    "Warnings as errors" )

ADD_SUBDIRECTORY( lib )
ADD_SUBDIRECTORY( modules )

IF( ${BUILD_TOOLS} )
  ADD_SUBDIRECTORY( tools )
ENDIF()

IF( ${BUILD_APP} )
  ADD_SUBDIRECTORY( app )
ENDIF()

IF( ${BUILD_EXAMPLES} )
  ADD_SUBDIRECTORY( examples )
ENDIF()


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

######################################################################################
# Final information dump
######################################################################################
MESSAGE("")
MESSAGE( STATUS "${PROJECT_NAME} INFORMATION"                     )
MESSAGE( STATUS "Version: "                 "${CALYP_VERSION_STRING}" )
MESSAGE( STATUS "Configuration:"                                  )
MESSAGE( STATUS "    Static libs: "         "${USE_STATIC}" )
MESSAGE( STATUS "    Build type: "          "${CMAKE_BUILD_TYPE}" )
MESSAGE( STATUS "    Build flags: "         "${CMAKE_CXX_FLAGS}"  )

FEATURE_SUMMARY(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES)
