# 
# auv_data_tools build system
#
# Dependencies:
#  * boost
#  * OpenCV
#  * HDF5
#  * libplankton
#  * UF for geographic conversions

PROJECT(auv_data_tools)

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

set(ADT_VERSION 20160830.0.0)


#-----------------------#
# Includes              #
#-----------------------#

INCLUDE(${PROJECT_SOURCE_DIR}/cmake/SIPMacros.cmake ) 
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)


#--------------------------------#
# 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)

SET(CMAKE_CXX_FLAGS "-std=c++11")

# 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 )

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

# Boost 
FIND_PACKAGE(Boost COMPONENTS thread system program_options filesystem)
IF( NOT Boost_FOUND )
   MESSAGE( FATAL_ERROR  "ERROR - Can't find boost" )
ENDIF( NOT Boost_FOUND )     

SET( CMAKE_REQUIRED_INCLUDES ${Boost_INCLUDE_DIR} )

# boost threads
IF( NOT Boost_THREAD_FOUND )
   MESSAGE( FATAL_ERROR  "ERROR - Can't find boost threads" )
ENDIF( NOT Boost_THREAD_FOUND )


# libgeotiff
FIND_PACKAGE(GeoTIFF REQUIRED)
IF ( NOT GEOTIFF_FOUND )
 MESSAGE(FATAL_ERROR "Error can't find GeoTIFF")
ENDIF( NOT GEOTIFF_FOUND )


# OpenCV
FIND_PACKAGE(OpenCV REQUIRED)
IF ( NOT OpenCV_FOUND )
 MESSAGE(FATAL_ERROR "Error can't find OpenCV")
ENDIF( NOT OpenCV_FOUND )


#hdf5
FIND_PACKAGE(HDF5 REQUIRED COMPONENTS C HL)
IF ( NOT HDF5_FOUND )
 MESSAGE(FATAL_ERROR "Error can't find HDF5")
ENDIF( NOT HDF5_FOUND )


# libplankton 
FIND_PACKAGE(LibPlankton REQUIRED)
IF( NOT LibPlankton_FOUND )
   MESSAGE( FATAL_ERROR  "ERROR - Can't find libplankton" )
ENDIF( NOT LibPlankton_FOUND )

# UF
FIND_PACKAGE(UF REQUIRED)
IF( NOT UF_FOUND )
   MESSAGE( FATAL_ERROR  "ERROR - Can't find UF" )
ENDIF( NOT UF_FOUND )


# libpng
FIND_PACKAGE( PNG REQUIRED )
IF( NOT PNG_FOUND )
   MESSAGE( FATAL_ERROR  "ERROR - Can't find libpng" )
ENDIF( NOT PNG_FOUND )      

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

ADD_DEFINITIONS( "-Wall -g" )

INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include
                     ${PROJECT_SOURCE_DIR}/src
                     ${PNG_INCLUDE_DIR}
                     ${OpenCV_INCLUDE_DIRS}
                     ${HDF5_INCLUDE_DIRS}
                     ${UF_INCLUDE_DIRS}
                     ${GEOTIFF_INCLUDE_DIR}
                   )

LINK_DIRECTORIES( ${OPENCV_LIBRARY_DIRS} ${UF_LIBRARY_DIRS} )


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

MESSAGE( "" )
MESSAGE( "CONFIGURATION SUMMARY" )
MESSAGE( "---------------------" )
MESSAGE( "" )
MESSAGE( "CMAKE_BUILD_TYPE = '${CMAKE_BUILD_TYPE}'" )
MESSAGE( "" )
MESSAGE( "CMAKE_INSTALL_PREFIX = '${CMAKE_INSTALL_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 the library and binary files
SET( LIBRARY_OUTPUT_PATH     ${PROJECT_SOURCE_DIR}/lib )
SET( EXECUTABLE_OUTPUT_PATH  ${PROJECT_SOURCE_DIR}/bin )

ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(include)
ADD_SUBDIRECTORY(tests)
ADD_SUBDIRECTORY(tools)


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

ENABLE_TESTING( )

ADD_TEST( test_raw_dir  ${EXECUTABLE_OUTPUT_PATH}/test_raw -d ${PROJECT_SOURCE_DIR}/test_data  )
ADD_TEST( test_raw_file ${EXECUTABLE_OUTPUT_PATH}/test_raw ${PROJECT_SOURCE_DIR}/test_data/1RAW.auv  )

ADD_TEST( test_log_dir  ${EXECUTABLE_OUTPUT_PATH}/test_seabedgui_log -d ${PROJECT_SOURCE_DIR}/test_data  )
ADD_TEST( test_log_file ${EXECUTABLE_OUTPUT_PATH}/test_seabedgui_log ${PROJECT_SOURCE_DIR}/test_data/log.txt  )

ADD_TEST( raw_sort_dir  ${EXECUTABLE_OUTPUT_PATH}/raw_sort_test -d ${PROJECT_SOURCE_DIR}/test_data  )
ADD_TEST( raw_sort_file ${EXECUTABLE_OUTPUT_PATH}/raw_sort_test ${PROJECT_SOURCE_DIR}/test_data/1RAW.auv  )

ADD_TEST( calc_pixel_stats ${EXECUTABLE_OUTPUT_PATH}/calc_pixel_stats -d ${PROJECT_SOURCE_DIR}/test_data/ /tmp -s png   )

ADD_TEST( equalise_directory_images ${EXECUTABLE_OUTPUT_PATH}/equalise_directory_images -s png 
                                    /tmp ${PROJECT_SOURCE_DIR}/test_data/ /tmp --mean 115 --var 2586  )


# The OpenCV package in Ubuntu 11.04 Natty Narwhal loads 16-bit tiff images
# as 8-bit. This test catches this problem
ADD_TEST( 16bit_to_8bit ${EXECUTABLE_OUTPUT_PATH}/16bit_to_8bit ${PROJECT_SOURCE_DIR}/test_data/16.tif /tmp/8.tif ) 

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

INCLUDE(CMakePackageConfigHelpers)
WRITE_BASIC_PACKAGE_VERSION_FILE(
    "${CMAKE_CURRENT_BINARY_DIR}/ADT/ADTConfigVersion.cmake"
    VERSION ${ADT_VERSION}
    COMPATIBILITY AnyNewerVersion
)

IF(CMAKE_VERSION VERSION_LESS "3.0")
    EXPORT(TARGETS adt
        FILE "${CMAKE_CURRENT_BINARY_DIR}/ADT/ADTTargets.cmake"
        NAMESPACE adt::
    )
ELSE()
    EXPORT(EXPORT ADTTargets
        FILE "${CMAKE_CURRENT_BINARY_DIR}/ADT/ADTTargets.cmake"
        NAMESPACE adt::
    )
ENDIF()

CONFIGURE_FILE(cmake/ADTConfig.cmake
    "${CMAKE_CURRENT_BINARY_DIR}/ADT/ADTConfig.cmake"
    COPYONLY
)

set(ConfigPackageLocation lib/cmake/ADT)
install(EXPORT ADTTargets
    FILE ADTTargets.cmake
    NAMESPACE adt::
    DESTINATION ${ConfigPackageLocation}
)
install(
    FILES cmake/ADTConfig.cmake
    "${CMAKE_CURRENT_BINARY_DIR}/ADT/ADTConfigVersion.cmake"
    DESTINATION "${ConfigPackageLocation}"
)

