#-------------------------------------------------------------------------------
# Author: Marco Biasini
#-------------------------------------------------------------------------------

cmake_minimum_required(VERSION 2.6.4 FATAL_ERROR)
project(OpenStructure CXX C)
set (OST_VERSION_MAJOR 1)
set (OST_VERSION_MINOR 2)
set (OST_VERSION_PATCH 4)
set (OST_VERSION_STRING ${OST_VERSION_MAJOR}.${OST_VERSION_MINOR}.${OST_VERSION_PATCH} )
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake_support)
include(OST)


if (CMAKE_COMPILER_IS_GNUCXX)  
  exec_program(gcc ARGS --version OUTPUT_VARIABLE CMAKE_C_COMPILER_VERSION)
  if(CMAKE_C_COMPILER_VERSION MATCHES ".*4\\.[5-9].*")
    set(OST_GCC_45 true)
  else()   
    set(OST_GCC_45 false)  
  endif()
endif()

option(USE_SHADER "whether to compile with shader support"
       OFF)
option(USE_RPATH "embed rpath upon make install"
       OFF)
option(COMPILE_TMTOOLS "whether to compile the tmalign and tmscore programs"
       OFF)
option(PROFILE "whether to compile with profiling support"
       OFF)       
option(ENABLE_GUI "whether the graphical user interface should be enabled"
       ON)
option(ENABLE_GFX "whether graphics support should be enabled"
      ON)
option(ENABLE_IMG "whether the image processing module should be compiled"
       ON)
option(ENABLE_INFO "whether openstructure should be compiled with support for the info library"
       ON)
option(USE_NUMPY "whether numpy support is added"
      OFF)
option(USE_DOUBLE_PRECISION "whether to compile in double precision" 
       OFF)
option(ENABLE_SPNAV "whether 3DConnexion devices should be supported"
      OFF)
option(STATIC_PROPERTY_WORKAROUND "workaround for static property bug with some boost/boost_python combinations" OFF)
option(DEPLOYMENT "switch on deployment settings" OFF)
option(COMPILE_TESTS "whether unit tests should be compiled by default" OFF)
option(ENABLE_STATIC "whether static libraries should be compiled" OFF)
option(DEBIAN_STYLE_LIBEXEC "whether 'libexec' should be put under 'lib/openstructure" OFF)

if (CXX)
  set(CMAKE_CXX_COMPILER ${CXX})
endif()

if (CC)
  set(CMAKE_C_COMPILER ${CC})
endif()

if (FORTRAN_COMPILER)
  set(CMAKE_FORTRAN_COMPILER ${FORTRAN_COMPILER})
endif()



if (PREFIX)
  set(CMAKE_INSTALL_PREFIX ${PREFIX})
endif()

if (SYS_ROOT)
  set(CMAKE_PREFIX_PATH ${SYS_ROOT})
endif()

if (OPTIMIZE)
  set(CMAKE_BUILD_TYPE Release)
  set(_OPT ON)
else()
   set(CMAKE_BUILD_TYPE Debug)
    set(_OPT OFF)
endif()

if (USE_DOUBLE_PRECISION)
  set(_DOUBLE_PREC ON)
else()
  set(_DOUBLE_PREC OFF)
  set(_DOUBLE_PREC OFF)
endif()

if (NOT ENABLE_INFO)
  set(ENABLE_GFX OFF)
endif()

if (NOT ENABLE_GFX)
  set(ENABLE_GUI OFF)
endif()

if (ENABLE_INFO)
  set(_INFO ON)
else()
  set(_INFO OFF)
endif()

if (ENABLE_GUI)
  set(_UI ON)
else()
  set(_UI OFF)
endif()

if (ENABLE_GFX)
  set(_OPENGL ON)
else()
  set(_OPENGL OFF)
endif()

if (USE_SHADER)
  set(_SHADER ON)
else()
  set(_SHADER OFF)
endif()
if (USE_NUMPY)
  set(_NUMPY ON)
else()
  set(_NUMPY OFF)
endif()
if (COMPILE_TMTOOLS)
  set(_TM_TOOLS ON)
else()
  set(_TM_TOOLS OFF)
endif()
if (ENABLE_IMG)
  set(_IMG ON)
else()
  set(_IMG OFF)
endif()
if (PROFILE)
  set(_PROFILE ON)
else()
  set(_PROFILE OFF)
endif()

if (DEBIAN_STYLE_LIBEXEC)
  set(_DEBIAN_STYLE_LIBEXEC ON)
else()
  set(_DEBIAN_STYLE_LIBEXEC OFF)
endif()

add_definitions(-DEIGEN2_SUPPORT)

if (COMPOUND_LIB)
  set(_COMP_LIB "${COMPOUND_LIB}")
  if (NOT IS_ABSOLUTE "${COMPOUND_LIB}")
    set(COMPOUND_LIB "${CMAKE_CURRENT_SOURCE_DIR}/${COMPOUND_LIB}")
  endif()
else()
  set(_COMP_LIB "NONE")
endif()

if (STATIC_PROPERTY_WORKAROUND)
  set(_STATICPROPS ON)
else()
  set(_STATICPROPS OFF)
endif()

if (NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE Debug)
endif()

setup_stage()
file(MAKE_DIRECTORY ${STAGE_DIR}
     ${EXECUTABLE_OUTPUT_PATH}
     ${HEADER_STAGE_PATH}
     ${LIB_STAGE_PATH}
     ${LIBEXEC_STAGE_PATH})

setup_compiler_flags()

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY)

if (ENABLE_STATIC AND UNIX AND NOT APPLE)
  set (CMAKE_FIND_LIBRARY_SUFFIXES .a)
endif()

setup_boost()

if (ENABLE_INFO)        
  find_package(Qt4 4.5.0 REQUIRED)
endif()

if (ENABLE_GFX)
  find_package(OpenGL REQUIRED)
endif()

if (ENABLE_IMG OR ENABLE_GFX)
  find_package(PNG REQUIRED)
else()
  set (PNG_LIBRARY "")
endif()

find_package(Eigen 2.0.0 REQUIRED)
find_package(Python 2.4 REQUIRED)

if(USE_NUMPY)
  find_package(Numpy REQUIRED)
endif()

if (ENABLE_IMG)
  find_package(FFTW REQUIRED)
  find_package(TIFF REQUIRED)
endif()


if (ENABLE_STATIC)
  set(Boost_LIBRARIES)
  set(Boost_USE_STATIC_LIBS ON)
  find_package(Boost ${_BOOST_MIN_VERSION} 
               COMPONENTS filesystem system iostreams regex REQUIRED)
  find_package(ZLIB REQUIRED)
   
  if (UNIX AND NOT APPLE)
    set(STATIC_LIBRARIES ${Boost_LIBRARIES} ${FFTW_LIBRARIES} ${TIFF_LIBRARIES} 
        ${PNG_LIBRARY} ${ZLIB_LIBRARY})
  else ()
    set(STATIC_LIBRARIES ${Boost_LIBRARIES} ${FFTW_LIBRARIES} ${TIFF_LIBRARIES} 
        ${PNG_LIBRARY} ${ZLIB_LIBRARY})
  endif()
endif()

if (ENABLE_GUI)
  ost_find_python_module(sip)
  ost_find_python_module(PyQt4)
endif()

if (ENABLE_SPNAV)
  find_package(SpNav REQUIRED)
endif()

if (CMAKE_COMPILER_IS_GNUCXX)
  set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-strict-aliasing" CACHE STRING "" FORCE)
endif()


# basic environment
include_directories(${Boost_INCLUDE_DIRS} 
                    ${FFTW_INCLUDE_PATH} 
                    ${EIGEN2_INCLUDE_DIR}
                    ${TIFF_INCLUDE_DIR}
                    ${SPNAV_INCLUDE_DIR}
                    ${PNG_INCLUDE_DIR}
                    )
if(USE_NUMPY)
include_directories(${PYTHON_NUMPY_INCLUDE_DIR})
endif()

if (UNIX)
  SET(CMAKE_SKIP_BUILD_RPATH  FALSE)
  SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
  if(USE_RPATH)
    set(_USE_RPATH ON)
    SET(CMAKE_INSTALL_RPATH "$ORIGIN/../${LIB_DIR}")
    SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
  else()
    set(_USE_RPATH OFF)
   SET(CMAKE_INSTALL_RPATH "")
   SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
  endif() 
endif()

if (ENABLE_STATIC)
  SET(CMAKE_SKIP_BUILD_RPATH TRUE)
  SET(LINK_SEARCH_END_STATIC TRUE) 
endif()

add_subdirectory(modules)
add_subdirectory(scripts)
add_subdirectory(deployment)

set(FILES_TO_BE_REMOVED ${CMAKE_SOURCE_DIR}/stage tests)
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES
                             "${FILES_TO_BE_REMOVED}")


#ost_match_boost_python_version(${PYTHON_LIBRARIES})

message(STATUS 
        "OpenStructure will be built with the following options:\n"
        "   Install Prefix                       (-DPREFIX) : ${CMAKE_INSTALL_PREFIX}\n"
        "   RPath in install                  (-DUSE_RPATH) : ${_USE_RPATH}\n"
        "   Info support                    (-DENABLE_INFO) : ${_INFO}\n"
        "   Graphical interface              (-DENABLE_GUI) : ${_UI}\n"
        "   OpenGL support                   (-DENABLE_GFX) : ${_OPENGL}\n"
        "   Image Processing support         (-DENABLE_IMG) : ${_IMG}\n"
        "   Shader support                   (-DUSE_SHADER) : ${_SHADER}\n"
        "   Numpy support                     (-DUSE_NUMPY) : ${_NUMPY}\n"
        "   Optimize                           (-DOPTIMIZE) : ${_OPT}\n"
        "   Profiling support                   (-DPROFILE) : ${_PROFILE}\n"
        "   Double Precision       (-DUSE_DOUBLE_PRECISION) : ${_DOUBLE_PREC}\n"
        "   Compound Lib                   (-DCOMPOUND_LIB) : ${_COMP_LIB}\n"
        "   TMAlign and TMScore         (-DCOMPILE_TMTOOLS) : ${_TM_TOOLS}\n"
        "   Static Libraries              (-DENABLE_STATIC) : ${ENABLE_STATIC}\n"
        "   Debian-style 'libexec' (-DDEBIAN_STYLE_LIBEXEC) : ${_DEBIAN_STYLE_LIBEXEC}" )