# 
# libplankton build system
#
# Dependencies:
#  * boost
#  * UF for geographic conversions
#
PROJECT(libplankton)

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

set(LIBPLANKTON_VERSION 20160816.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 )  
ENDIF( NOT CMAKE_BUILD_TYPE )



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

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

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

IF( NOT Boost_SYSTEM_FOUND )
   MESSAGE( FATAL_ERROR  "ERROR - Can't find boost system" )
ENDIF( NOT Boost_SYSTEM_FOUND )      

# UF geoconversion
IF( CMAKE_BUILD_TYPE STREQUAL Debug )
   SET( UF_GEOCONV_LIBRARY ufGeographicConversions-d )
ELSE( CMAKE_BUILD_TYPE STREQUAL Debug )
   SET( UF_GEOCONV_LIBRARY ufGeographicConversions )
ENDIF( CMAKE_BUILD_TYPE STREQUAL Debug )




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

ADD_DEFINITIONS( "-Wall" )
INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include 
                     ${Boost_INCLUDE_DIRS}
                     ${UF_INCLUDE_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 )

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

# Build libraries
add_subdirectory(src)
add_subdirectory(include)
add_subdirectory(tests)

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

ENABLE_TESTING( )
ADD_TEST( cross_prod_mat_test ${EXECUTABLE_OUTPUT_PATH}/cross_prod_mat_test  )
ADD_TEST( pose_test           ${EXECUTABLE_OUTPUT_PATH}/pose_test            )
ADD_TEST( rot_mat_test        ${EXECUTABLE_OUTPUT_PATH}/rot_mat_test         )
ADD_TEST( rot_mat_test        ${EXECUTABLE_OUTPUT_PATH}/coord_trans_jac_test )
ADD_TEST( map_projection      ${EXECUTABLE_OUTPUT_PATH}/map_projection_test )

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

INCLUDE(CMakePackageConfigHelpers)
WRITE_BASIC_PACKAGE_VERSION_FILE(
    "${CMAKE_CURRENT_BINARY_DIR}/LibPlankton/LibPlanktonConfigVersion.cmake"
    VERSION ${LIBPLANKTON_VERSION}
    COMPATIBILITY AnyNewerVersion
)

IF(CMAKE_VERSION VERSION_LESS "3.0")
    EXPORT(TARGETS plankton
        FILE "${CMAKE_CURRENT_BINARY_DIR}/LibPlankton/LibPlanktonTargets.cmake"
        NAMESPACE libplankton::
    )
ELSE()
    EXPORT(EXPORT LibPlanktonTargets
        FILE "${CMAKE_CURRENT_BINARY_DIR}/LibPlankton/LibPlanktonTargets.cmake"
        NAMESPACE libplankton::
    )
ENDIF()

CONFIGURE_FILE(cmake/LibPlanktonConfig.cmake
    "${CMAKE_CURRENT_BINARY_DIR}/LibPlankton/LibPlanktonConfig.cmake"
    COPYONLY
)

set(ConfigPackageLocation lib/cmake/LibPlankton)
install(EXPORT LibPlanktonTargets
    FILE LibPlanktonTargets.cmake
    NAMESPACE libplankton::
    DESTINATION ${ConfigPackageLocation}
)
install(
    FILES cmake/LibPlanktonConfig.cmake
    "${CMAKE_CURRENT_BINARY_DIR}/LibPlankton/LibPlanktonConfigVersion.cmake"
    DESTINATION "${ConfigPackageLocation}"
)
