# 
# seabed_localisation 
#
# External dependencies
#  * boost and boost-threads
#  * lapack
#  * cholmod
#  * OpenGL and GLU
#  * SDL
#  * gtk and gtkglext
#  * opencv
#  * ulapack
#  * UF
#  * Boost (thread and filesystem)
#  
#
# AUV library dependencies
#  * lib3dObjects
#  * lib3dRender
#  * auv_data_tools
#  * libgsf
#  * libplankton
#  * libkeypoint
#  * libflounder
#  * libsnapper 
#  * libcarp (only used by stereo tests. FIXME: remove all use of this library)
#  * libpolyp
#  * libdeltat
#

PROJECT(seabed_localisation)

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

set(LIBSEABEDCOMMON_VERSION 20170118.0.0)
set(LIBSEABEDSLAM_VERSION 20170118.0.0)

#--------------------------------#
# Enforce an out-of-source build #
#--------------------------------#

STRING(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}" INSOURCE)
IF(INSOURCE)
  MESSAGE(FATAL_ERROR "This project requires an out of source build. This is handled by the Makefile. Please type 'make'.")
ENDIF(INSOURCE)


#--------------------------------#
# Build Options                  #
#--------------------------------#

# this gets CMake to use the system triplet (x86_64-linux-gnu)
# for library locations
INCLUDE(GNUInstallDirs)

# Options can be set from the command line when running cmake.
#   eg. cmake . -DCMAKE_BUILD_TYPE=Release -DDEBUG_PROFILING=on

# Build types are: Release, Debug, RelWithDebInfo, MinSizeRel
IF( NOT CMAKE_BUILD_TYPE )
  SET( CMAKE_BUILD_TYPE Release CACHE STRING
       "Build type options are: None Debug Release RelWithDebInfo MinSizeRel."
       FORCE )
ENDIF( NOT CMAKE_BUILD_TYPE )

OPTION(BUILD_STEREO_TESTS "Build stereo test programs" ON)
OPTION(BUILD_SEABED_SLAM "Build Seabed Slam" ON)
OPTION(BUILD_SEABED_TOOLS "Build Seabed Tools" ON)


#-----------------------#
# Dependencies          #
#-----------------------#

FIND_PACKAGE(UF REQUIRED)
SET( UF_LIBRARY ufGeographicConversions ufGPSParser )
FIND_PACKAGE(OpenCV REQUIRED)
FIND_PACKAGE(LAPACK REQUIRED)
LIST(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
FIND_PACKAGE(Cholmod REQUIRED)
FIND_PACKAGE(HDF5 REQUIRED)

# Boost 
FIND_PACKAGE(Boost COMPONENTS thread filesystem system REQUIRED)
IF( NOT Boost_FOUND )
   MESSAGE( FATAL_ERROR  "ERROR - Can't find boost" )
ENDIF( NOT Boost_FOUND )
SET( CMAKE_REQUIRED_INCLUDES ${Boost_INCLUDE_DIR} )

# lapack
IF( NOT LAPACK_FOUND )
   MESSAGE( FATAL_ERROR  "ERROR - Can't find lapack" )
ENDIF( NOT LAPACK_FOUND )

IF( BUILD_SEABED_SLAM)
	# OpenGL and GLU
	FIND_PACKAGE( OpenGL )
	IF( NOT OPENGL_FOUND )
	   MESSAGE( FATAL_ERROR  "ERROR - Can't find OpenGL" )
	ENDIF( NOT OPENGL_FOUND )
	IF( NOT OPENGL_GLU_FOUND )
	   MESSAGE( FATAL_ERROR  "ERROR - Can't find GLU" )
	ENDIF( NOT OPENGL_GLU_FOUND )

	# SDL
	FIND_PACKAGE( SDL )
	IF( NOT SDL_FOUND )
	   MESSAGE( FATAL_ERROR  "ERROR - Can't find SDL" )
	ENDIF( NOT SDL_FOUND )


	# GTK
    FIND_PACKAGE( GTK2 COMPONENTS gtk)
	IF( NOT GTK2_FOUND )
	  MESSAGE( FATAL_ERROR  "ERROR - Can't find GTK" )
	ENDIF( NOT GTK2_FOUND )
	ADD_DEFINITIONS( ${GTK2_CFLAGS} )

	# Gtk GL Extensions
    FIND_PACKAGE(GTKGLEXT)
	IF( NOT GTKGLEXT_FOUND )
	  MESSAGE( FATAL_ERROR  "ERROR - Can't find GTK GL Extensions" )
	ENDIF( NOT GTKGLEXT_FOUND )
	ADD_DEFINITIONS( ${GTKGLEXT_CFLAGS} )


	# lib3dObjects 
    FIND_PACKAGE(Lib3dObjects REQUIRED)

	# lib3dRender
    FIND_PACKAGE(Lib3dRender REQUIRED)

ENDIF( BUILD_SEABED_SLAM )


# ulapack 
find_path(ULAPACK_INCLUDE_DIR matrix_types.hpp PATH_SUFFIXES ulapack)
SET( CMAKE_REQUIRED_INCLUDES ${ULAPACK_INCLUDE_DIR} ${Boost_INCLUDE_DIR} )
INCLUDE(CheckIncludeFileCXX)
CHECK_INCLUDE_FILE_CXX("matrix_types.hpp" HAVE_ULAPACK )
IF( NOT HAVE_ULAPACK )
    MESSAGE( FATAL_ERROR  "ERROR - Can't find ulapack - " ${ULAPACK_INCLUDE_DIR} )
ENDIF( NOT HAVE_ULAPACK )      


# AUV data library 
FIND_PACKAGE(ADT REQUIRED)
FIND_PACKAGE(LibKeypoint REQUIRED)
FIND_PACKAGE(LibFlounder REQUIRED)
FIND_PACKAGE(LibPlankton REQUIRED)
FIND_PACKAGE(LibSnapper REQUIRED)
FIND_PACKAGE(LibGSF REQUIRED)
FIND_PACKAGE(LibDeltaT REQUIRED)

# libkeypoint
ADD_DEFINITIONS( "-DHAVE_LIBKEYPOINT" )

# libcarp - FIXME: remove all use of this
# this is used for some tests
#SET( LIBCARP_INC ${AUVLIB_PREFIX}/include/libcarp )
#SET( LIBCARP_LIBRARY carp )

# libpolyp 
# this is used by a tool that isn't even compiled...
#SET( LIBPOLYP_INC ${AUVLIB_PREFIX}/include/libpolyp )
#SET( LIBPOLYP_LIBRARY polyp )
#
SET( UF_LIBRARY ufGeographicConversions ufGPSParser )

#-----------------------#
# Compiler setup        #
#-----------------------#

ADD_DEFINITIONS( "-Wall" )

INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include
                     ${SDL_INCLUDE_DIR}
                     ${GTK2_INCLUDE_DIRS}
                     ${GTKGLEXT_INCLUDE_DIRS}
                     ${OPENGL_INCLUDE_DIR}
                     ${OpenCV_INCLUDE_DIRS}
                     ${CHOLMOD_INCLUDE_DIR}
                     ${ULAPACK_INCLUDE_DIR}
                     ${LIBGSF_INCLUDE_DIR}
                     ${HDF5_INCLUDE_DIRS}
                     ${LIBCARP_INC}
                     ${LIBPOLYP_INC}
                     ${LIBDELTAT_INC}
                     ${LIBMAGFIELD_INC}
                     ${UF_INCLUDE_DIRS}
                     ${LIBGEOTIFF_INC}
		     /usr/include/hdf5/serial
                   )

LINK_DIRECTORIES( ${GTK2_LIBRARY_DIRS}
                  ${GTKGLEXT_LIBRARY_DIRS}
                  ${CHOLMOD_LINK_DIR} 
                  ${ULAPACK_LINK_DIR}
                  ${OpenCV_LIBRARY_DIRS} 
                  ${BOOST_LIBARY_DIRS}
                )



#-----------------------#
# Print Some Info       #
#-----------------------#

MESSAGE( "" )
MESSAGE( "CONFIGURATION SUMMARY" )
MESSAGE( "---------------------" )
MESSAGE( "" )
MESSAGE( "CMAKE_INSTALL_PREFIX = '${CMAKE_INSTALL_PREFIX}'" )
MESSAGE( "" )
MESSAGE( "CMAKE_BUILD_TYPE = '${CMAKE_BUILD_TYPE}'" )
MESSAGE( "" )
MESSAGE( "BUILD_STEREO_TESTS = '${BUILD_STEREO_TESTS}'" )
MESSAGE( "" )
MESSAGE( "CHOLMOD_PREFIX = '${CHOLMOD_PREFIX}'" )
MESSAGE( "" )
MESSAGE( "AUVLIB_PREFIX = '${AUVLIB_PREFIX}'" )
MESSAGE( "" )



IF( CMAKE_BUILD_TYPE STREQUAL Debug )
   MESSAGE( "CMAKE_CXX_FLAGS_DEBUG = '${CMAKE_CXX_FLAGS_DEBUG}'" )
ENDIF( CMAKE_BUILD_TYPE STREQUAL Debug )

IF( CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo )
   MESSAGE( "CMAKE_CXX_FLAGS_RELWITHDEBINFO = '${CMAKE_CXX_FLAGS_RELWITHDEBINFO}'" )
ENDIF( CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo )

IF( CMAKE_BUILD_TYPE STREQUAL Release )
   MESSAGE( "CMAKE_CXX_FLAGS_RELEASE = '${CMAKE_CXX_FLAGS_RELEASE}'" )
ENDIF( CMAKE_BUILD_TYPE STREQUAL Release )

IF( CMAKE_BUILD_TYPE STREQUAL MinSizeRel )
   MESSAGE( "CMAKE_CXX_FLAGS_MINSIZEREL = '${CMAKE_CXX_FLAGS_MINSIZEREL}'" )
ENDIF( CMAKE_BUILD_TYPE STREQUAL MinSizeRel )

MESSAGE( "" )


#-----------------------#
# Build Instructions    #
#-----------------------#

# Locations for binary files
SET( LIBRARY_OUTPUT_PATH     ${PROJECT_SOURCE_DIR}/lib )
SET( EXECUTABLE_OUTPUT_PATH  ${PROJECT_SOURCE_DIR}/bin )

ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(tools)
ADD_SUBDIRECTORY(doc)
ADD_SUBDIRECTORY(include)
IF (BUILD_SEABED_SLAM )
    ADD_SUBDIRECTORY( tests )
ENDIF( BUILD_SEABED_SLAM)

IF( BUILD_STEREO_TESTS )
    ADD_SUBDIRECTORY( stereo_tests )
ENDIF( BUILD_STEREO_TESTS )


#-----------------------#
# Testing Instructions  #
#-----------------------#

# The path to the seabed heron missions
SET( HERON_DATA_DIR "$ENV{HOME}/Data/seabed-data/heron" )

# Dead reckoning test binary and config files
#SET( DR_BIN ${EXECUTABLE_OUTPUT_PATH}/seabed_dead_reckon )
#SET( DR_CFG ${PROJECT_SOURCE_DIR}/heron_localiser.cfg )

ENABLE_TESTING( )

ADD_TEST( ellipse_intersect_test ${EXECUTABLE_OUTPUT_PATH}/ellipse_intersect_test )
ADD_TEST( overlap_probability_test ${EXECUTABLE_OUTPUT_PATH}/overlap_probability_test )
ADD_TEST( speed_of_sound_test ${EXECUTABLE_OUTPUT_PATH}/speed_of_sound_test )

#ADD_TEST( heron_dead_reckon_02 ${DR_BIN} ${DR_CFG} "${HERON_DATA_DIR}/Mission 02 - 20051028 - Compass Check" )
#ADD_TEST( heron_dead_reckon_03 ${DR_BIN} ${DR_CFG} "${HERON_DATA_DIR}/Mission 03 - 20051028 - Camera Setting Experiment" )
#ADD_TEST( heron_dead_reckon_05 ${DR_BIN} ${DR_CFG} "${HERON_DATA_DIR}/Mission 05 - 20051028 - Overlapping Grids" --start 1130464334 --stop 1130467525 )
#ADD_TEST( heron_dead_reckon_06 ${DR_BIN} ${DR_CFG} "${HERON_DATA_DIR}/Mission 06 - 20051029 - AutoShutter Box" --stop 1130558040)
#ADD_TEST( heron_dead_reckon_07 ${DR_BIN} ${DR_CFG} "${HERON_DATA_DIR}/Mission 07 - 20051030 - Camera Test" --stop 1130613060 )
#ADD_TEST( heron_dead_reckon_08 ${DR_BIN} ${DR_CFG} "${HERON_DATA_DIR}/Mission 08 - 20051030 - Compass Calibration" --stop 1130619750 )
#ADD_TEST( heron_dead_reckon_10 ${DR_BIN} ${DR_CFG} "${HERON_DATA_DIR}/Mission 10 - 20051030 - Overlapping Grids Night" )
#ADD_TEST( heron_dead_reckon_11 ${DR_BIN} ${DR_CFG} "${HERON_DATA_DIR}/Mission 11 - 20051031 - Heron Daylight Strobe" )
#ADD_TEST( heron_dead_reckon_12 ${DR_BIN} ${DR_CFG} "${HERON_DATA_DIR}/Mission 12 - 20051031 - Triangle" )
#ADD_TEST( heron_dead_reckon_13 ${DR_BIN} ${DR_CFG} "${HERON_DATA_DIR}/Mission 13 - 20051031 - Repeat Lines" )
#ADD_TEST( heron_dead_reckon_14 ${DR_BIN} ${DR_CFG} "${HERON_DATA_DIR}/Mission 14 - 20051101 - Grids" )
#ADD_TEST( heron_dead_reckon_15 ${DR_BIN} ${DR_CFG} "${HERON_DATA_DIR}/Mission 15 - 20051101 - Repline" )
#ADD_TEST( heron_dead_reckon_16 ${DR_BIN} ${DR_CFG} "${HERON_DATA_DIR}/Mission 16 - 20051102 - Repline" )
#ADD_TEST( heron_dead_reckon_17 ${DR_BIN} ${DR_CFG} "${HERON_DATA_DIR}/Mission 17 - 20051102 - Colour Calib" )
#ADD_TEST( heron_dead_reckon_18 ${DR_BIN} ${DR_CFG} "${HERON_DATA_DIR}/Mission 18 - 20051102 - Spiral" --start 1130900328 )
#ADD_TEST( heron_dead_reckon_19 ${DR_BIN} ${DR_CFG} "${HERON_DATA_DIR}/Mission 19 - 20051102 - Repeated lines" )
#ADD_TEST( heron_dead_reckon_20 ${DR_BIN} ${DR_CFG} "${HERON_DATA_DIR}/Mission 20 - 20051102 - Spiral Night"  --stop 1130919600 )

#-----------------------#
# Installation Related  #
#-----------------------#

INCLUDE(CMakePackageConfigHelpers)
WRITE_BASIC_PACKAGE_VERSION_FILE(
    "${CMAKE_CURRENT_BINARY_DIR}/LibSeabedSlam/LibSeabedSlamConfigVersion.cmake"
    VERSION ${LIBSEABEDSLAM_VERSION}
    COMPATIBILITY AnyNewerVersion
)

IF(CMAKE_VERSION VERSION_LESS "3.0")
    EXPORT(TARGETS seabedcommon seabedslam
        FILE "${CMAKE_CURRENT_BINARY_DIR}/LibSeabedSlam/LibSeabedSlamTargets.cmake"
        NAMESPACE libseabedslam::
    )
ELSE()
    EXPORT(EXPORT LibSeabedSlamTargets
        FILE "${CMAKE_CURRENT_BINARY_DIR}/LibSeabedSlam/LibSeabedSlamTargets.cmake"
        NAMESPACE libseabedslam::
    )
ENDIF()

CONFIGURE_FILE(cmake/LibSeabedSlamConfig.cmake
    "${CMAKE_CURRENT_BINARY_DIR}/LibSeabedSlam/LibSeabedSlamConfig.cmake"
    COPYONLY
)

set(ConfigPackageLocation lib/cmake/LibSeabedSlam)
install(EXPORT LibSeabedSlamTargets
    FILE LibSeabedSlamTargets.cmake
    NAMESPACE libseabedslam::
    DESTINATION ${ConfigPackageLocation}
)
install(
    FILES cmake/LibSeabedSlamConfig.cmake
    "${CMAKE_CURRENT_BINARY_DIR}/LibSeabedSlam/LibSeabedSlamConfigVersion.cmake"
    DESTINATION "${ConfigPackageLocation}"
)
