cmake_minimum_required(VERSION 3.0)
project(VITE CXX C)

### The current version number
set (VITE_VERSION_MAJOR 1)
set (VITE_VERSION_MINOR 2)
set (VITE_VERSION_PATCH 0)

find_package(Git)
if(GIT_FOUND)
  execute_process(COMMAND ${GIT_EXECUTABLE} show --no-patch --format="%h %aI"
    OUTPUT_VARIABLE VITE_WC_INFO
    ERROR_VARIABLE  Git_info_error
    RESULT_VARIABLE Git_info_result
    OUTPUT_STRIP_TRAILING_WHITESPACE)

  if(NOT ${Git_info_result} EQUAL 0)
    set(VITE_WC_REVISION "")
    set(VITE_WC_DATE     "")
  else()
    string(REGEX REPLACE "^\"(.*) (.*)\"$"
      "\\1" VITE_WC_REVISION "${VITE_WC_INFO}")
    string(REGEX REPLACE "^\"(.*) (.*)\"$"
      "\\2" VITE_WC_DATE "${VITE_WC_INFO}")
  endif()
endif()

if (NOT ${VITE_WC_REVISION} STREQUAL "")
  set (VITE_VERSION "r${VITE_WC_REVISION}")
else()
  set (VITE_VERSION "${VITE_VERSION_MAJOR}.${VITE_VERSION_MINOR}.${VITE_VERSION_PATCH}")
endif()


if (NOT ${VITE_WC_DATE} STREQUAL "")
  set (VITE_DATE "\"${VITE_WC_DATE}\"")
else()
  if(UNIX)
    set(_vite_SAVED_LC_ALL "$ENV{LC_ALL}")
    set(ENV{LC_ALL} C)

    execute_process(COMMAND date +"%B %Y"
      OUTPUT_VARIABLE VITE_DATE
      ERROR_VARIABLE vite_date_error
      RESULT_VARIABLE vite_date_result
      OUTPUT_STRIP_TRAILING_WHITESPACE )

    # restore the previous LC_ALL
    set(ENV{LC_ALL} ${_vite_SAVED_LC_ALL})
  else()
    set(VITE_DATE "")
  endif()
endif()

message(STATUS "Current revision is ${VITE_VERSION} from ${VITE_DATE}")

if(COMMAND CMAKE_POLICY)
  # CMP0003: add the link paths to the link command as with cmake 2.4
  cmake_policy(SET CMP0003 NEW)
endif(COMMAND CMAKE_POLICY)

### Misc options
option(BUILD_SHARED_LIBS
  "Build shared libraries" OFF)
option(BUILD_64bits
  "Build 64 bits mode" ON)
if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build, options are None, Debug, Release, RelWithDebInfo and MinSizeRel." FORCE)
endif(NOT CMAKE_BUILD_TYPE)

# cmake modules setup
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/")
include (CMakeDetermineSystem)
include (CheckCCompilerFlag)
include (CheckFunctionExists)
include (CheckSymbolExists)
include (CheckIncludeFile)
include (CheckIncludeFileCXX)
include (CheckIncludeFiles)
include (CheckLibraryExists)
include (CMakeDependentOption)

### Required Packages
# Try to find Qt5 : http://forum.openscenegraph.org/viewtopic.php?t=11431
option(USE_QT5
  "Use QT5 instead of QT4" ON)

if (USE_QT5)
  set(CMAKE_AUTOMOC ON)
  #set(CMAKE_AUTORCC ON)
  #set(CMAKE_AUTOUIC ON)

  if(CMAKE_VERSION VERSION_LESS "3.7.0")
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
  endif()

  find_package(Qt5 COMPONENTS Widgets Core Xml OpenGL Charts Svg UiTools QUIET )

else(USE_QT5) # Try Qt4

  set(CMAKE_AUTOMOC ON)
  find_package(Qt4 COMPONENTS QtCore QtGui QtXml REQUIRED)
  set(QT_USE_QTUITOOLS ON)
  set(QT_USE_QTOPENGL ON)
  include(${QT_USE_FILE})

endif(USE_QT5)

set( OpenGL_GL_PREFERENCE LEGACY )
find_package(OpenGL)
#find_package(GLU)

### Optimization options
option(VITE_ENABLE_SERIALIZATION
  "Enable the support of Boost Serialization." OFF)
option(VITE_ENABLE_VBO
  "Enable the support of VBO." ON)
option(VITE_ENABLE_MT_PARSERS
  "Enable multi-threading in parsers." OFF)

### Debug options
option(VITE_DBG_MEMORY_USAGE
  "Enable statistic on memory usage." OFF)
cmake_dependent_option(VITE_DBG_MEMORY_TRACE
  "Enable trace generation of memory usage (requires MEMORY_USAGE)." OFF "VITE_DBG_MEMORY_USAGE" OFF)

### Trace format options
option(VITE_ENABLE_OTF
  "Enable the support of OTF file format." OFF)
option(VITE_ENABLE_OTF2
  "Enable the support of OTF2 file format." OFF)
option(VITE_ENABLE_TAU
  "Enable the support of TAU file format." OFF)

# timeval, timespec, realtime clocks, etc
include(CheckStructHasMember)
check_struct_has_member("struct timespec" tv_nsec time.h HAVE_TIMESPEC_TV_NSEC)
if( NOT HAVE_TIMESPEC_TV_NSEC )
  add_definitions(-D_GNU_SOURCE)
  check_struct_has_member("struct timespec" tv_nsec time.h HAVE_TIMESPEC_TV_NSEC)
endif( NOT HAVE_TIMESPEC_TV_NSEC )
check_library_exists(rt clock_gettime "" HAVE_CLOCK_GETTIME)
if( HAVE_CLOCK_GETTIME )
  set(EXTRA_LIBS "${EXTRA_LIBS};rt")
endif( HAVE_CLOCK_GETTIME )

# stdlib, stdio, string, getopt, etc
check_include_files(stdarg.h HAVE_STDARG_H)
check_function_exists(va_copy HAVE_VA_COPY)
if (NOT HAVE_VA_COPY)
  check_function_exists(__va_copy HAVE_UNDERSCORE_VA_COPY)
endif (NOT HAVE_VA_COPY)
check_function_exists(asprintf HAVE_ASPRINTF)
check_function_exists(vasprintf HAVE_VASPRINTF)
check_include_files(getopt.h HAVE_GETOPT_H)
check_include_files(unistd.h HAVE_UNISTD_H)
check_function_exists(getopt_long HAVE_GETOPT_LONG)
check_include_files(errno.h HAVE_ERRNO_H)
check_include_files(stddef.h HAVE_STDDEF_H)
check_function_exists(getrusage HAVE_GETRUSAGE)
check_include_files(limits.h HAVE_LIMITS_H)
check_include_files(string.h HAVE_STRING_H)

#
# Find optional packages
#

# Search for Boost
#    Components : filesystem, iostreams, programoptions, python, regex,
#                 serialization, signals, system, thread, wave
if(VITE_ENABLE_SERIALIZATION)
  find_package( Boost COMPONENTS serialization thread iostreams system)
endif(VITE_ENABLE_SERIALIZATION)

if(VITE_ENABLE_VBO)
  find_package(GLEW REQUIRED)
  include_directories(${GLEW_INCLUDE_PATH})
  if (GLM_INC)
    include_directories(${GLM_INC})
    list(APPEND CMAKE_REQUIRED_INCLUDES ${GLM_INC})
  endif()
  check_include_file_cxx(glm/glm.hpp HAVE_GLM_H)
  if (NOT HAVE_GLM_H)
    message(FATAL_ERROR "libglm-dev package is required, you might specify the include directory where to find glm/glm.hpp through -DGLM_INC=/path/to/glm")
  endif()
endif(VITE_ENABLE_VBO)

if(VITE_ENABLE_OTF)
  find_package(OTF)
endif(VITE_ENABLE_OTF)

if(VITE_ENABLE_OTF2)
  find_package(OTF2)
endif(VITE_ENABLE_OTF2)

if(VITE_ENABLE_TAU)
  find_package(TAU)
endif(VITE_ENABLE_TAU)

if(VITE_ENABLE_MT_PARSERS)
  add_definitions(-DMT_PARSING)
endif()

if(VITE_DBG_MEMORY_USAGE)
  add_definitions(-DMEMORY_USAGE)
endif()

if(VITE_DBG_MEMORY_TRACE)
  add_definitions(-DMEMORY_TRACE)
endif()

# Configuration header
configure_file (
  "${CMAKE_CURRENT_SOURCE_DIR}/src/common/ViteConfig.hpp.in"
  "${CMAKE_CURRENT_BINARY_DIR}/src/common/ViteConfig.hpp")

add_subdirectory(src)
add_subdirectory(plugins)

include(CPackLists.txt)
