cmake_minimum_required(VERSION 3.10)
project(lidar2image_processing VERSION 1.0.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

set( CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/../cmake/Modules/ ${CMAKE_MODULE_PATH} )
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/tests )

if( CMAKE_COMPILER_IS_GNUCXX )
	set( WARN_FLAG_ADDITIONS "-fno-strict-aliasing" )
endif( CMAKE_COMPILER_IS_GNUCXX )

include(SetupInstall)
include(SetupCTest)
include(SetupRPATH)

set(BOOST_ROOT /usr/local)
find_package(Boost 1.5 REQUIRED COMPONENTS system filesystem)
find_package(Cholmod REQUIRED)
find_package(Eigen3)
#find_package(OpenCV)
find_package(GDAL)
find_package(ISIS REQUIRED COMPONENTS isis)
find_package(Qt5 COMPONENTS
                Core
                Concurrent
                Gui
                Multimedia
                MultimediaWidgets
                Network
                OpenGL # Needed to install mesa-common-dev for this!
                PrintSupport
                Qml
                Quick
                Script
                ScriptTools
                Sql
                Svg
                Test
                WebChannel
                Widgets
                Xml
                XmlPatterns
                # Search this path explicitly for MacOS OpenGL Framework
                PATHS /System/Library/Frameworks/ REQUIRED)

find_package(Qwt)

list( APPEND CMAKE_INSTALL_RPATH $ENV{ISISROOT}/lib )

if (APPLE)   
    #set(COMPILE_FLAGS  "-std=c17 -pedantic -F${ISIS_3RD} -Wall -ansi -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.6 -DISIS_LITTLE_ENDIAN=1 -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -fPIC -DGMM_USES_SUPERLU -O1 -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -DENABLEJP2K=0")
    set(COMPILE_FLAGS  "-std=c17 -pedantic -F${ISIS_ROOT} -Wall -ansi -mmacosx-version-min=10.6 -DISIS_LITTLE_ENDIAN=1 -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -fPIC -DGMM_USES_SUPERLU -O1 -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -DENABLEJP2K=0")
    #set(LINK_FLAGS "-L${ISIS_3RD} -F${ISIS_3RD} -headerpad_max_install_names -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.6 -bind_at_load -Wl,-rpath,${ISISROOT} -Wl,-w -Wl,-rpath,@loader_path/..  -lm -framework ApplicationServices -framework QtXmlPatterns -framework QtXml -framework QtNetwork -framework QtSql -framework QtGui -framework QtCore -framework QtSvg -framework QtTest -framework QtWebKit -framework QtOpenGL -framework qwt  ${CHOLMODLIB_DEPS} -framework Accelerate ")
    set(LINK_FLAGS "-L$ENV{ISISROOT}/lib -F$ENV{ISISROOT}/ -headerpad_max_install_names -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.6 -bind_at_load -Wl,-rpath,$ENV{ISISROOT} -Wl,-w -Wl,-rpath,@loader_path/..  -lm -framework ApplicationServices  ${CHOLMODLIB_LIBLIST} -framework Accelerate ")
else()
    set(COMPILE_FLAGS " -Wall -ansi -DISIS_LITTLE_ENDIAN=1 -fPIC -DGMM_USES_SUPERLU -O1 -DENABLEJP2K=0")
    set(LINK_FLAGS "-L$ENV{ISISROOT}/3rdParty/lib -Wl,-E -Xlinker -z -Xlinker origin -Xlinker -rpath -Xlinker $ENV{ISISROOT}/lib -pthread -lX11")
endif()
    
## We must add the in-source and out-of-source
## include paths 
##--------------------------------------------
 include_directories(
  ${CMAKE_SOURCE_DIR}
  ${PROJECT_SOURCE_DIR}/..
  ${EIGEN3_INCLUDE_DIR}
  #${OPENCV_INCLUDE_DIRS}
  ${PCL_INCLUDE_DIRS}
  ${ISIS_INCLUDE_DIR}
  ${CSPICE_ROOT}/naif
  ${CSPICE_ROOT}/cspice
  ${CSPICE_ROOT}/Qt/QtCore
  ${CSPICE_ROOT}/Qt/QtXml
  ${CSPICE_ROOT}/Qt/QtXmlPatterns
  ${CSPICE_ROOT}/Qt
  ${CSPICE_ROOT}/gdal
  ${CSPICE_ROOT}/
  ${CSPICE_ROOT}/Qt/QtCore.framework/Headers
  ${CSPICE_ROOT}/Qt/QtAssistant.framework/Headers
  ${CSPICE_ROOT}/Qt/QtGui.framework/Headers
  ${CSPICE_ROOT}/Qt/QtNetwork.framework/Headers
  ${CSPICE_ROOT}/Qt/QtOpenGL.framework/Headers
  ${CSPICE_ROOT}/Qt/QtScript.framework/Headers
  ${CSPICE_ROOT}/Qt/QtScriptTools.framework/Headers
  ${CSPICE_ROOT}/Qt/QtSql.framework/Headers
  ${CSPICE_ROOT}/Qt/QtSvg.framework/Headers
  ${CSPICE_ROOT}/Qt/QtTest.framework/Headers
  ${CSPICE_ROOT}/Qt/QtWebKit.framework/Headers
  ${CSPICE_ROOT}/Qt/QtXml.framework/Headers
  ${CSPICE_ROOT}/Qt/QtXmlPatterns.framework/Headers
  ${CSPICE_ROOT}/qwt.framework/Headers
  ${CSPICE_ROOT}/xercesc
  ${CSPICE_ROOT}/tiff
  ${CSPICE_ROOT}/tnt
  ${CSPICE_ROOT}/jama
  ${CSPICE_ROOT}/geos
  ${CSPICE_ROOT}/gsl
  ${CSPICE_ROOT}/google
  ${CSPICE_ROOT}/superlu
)

 ## Set up RPATH after all find_package calls
 ##-----------------------------------------------
 setup_rpath()
 setup_ctest()


 #lidar_image_align
 add_executable(lidar_image_align
                lidar_image_align.cpp
                LidarImageAlign.cpp
                ../common/StringUtils.cpp
                ../common/FileListUtils.cpp
                ../common/ImageProcessing.cpp
                ../common/ReflectanceModels.cpp
                ../common/tiling.cpp
                ../camera_models/PVLRead.cpp	../camera_models/IsisInterfaceATK.cpp
                ../geotif_processing/CoordTransform.cpp
                ../geotif_processing/GeoUtils.cpp
                ../lidar_processing/TracksGCP.cpp
                ../lidar_processing/TracksLOLA.cpp
                ../lidar_processing/TracksFeatures.cpp)
  
target_compile_features(lidar_image_align PRIVATE cxx_std_17)

set_target_properties(lidar_image_align PROPERTIES
                       #COMPILE_FLAGS ${COMPILE_FLAGS}
                       LINK_FLAGS ${LINK_FLAGS}
                     )

target_link_directories(lidar_image_align
                        PRIVATE
                       $ENV{ISISROOT}
                       )

target_link_libraries(lidar_image_align
                       ${GDAL_LIBRARY}
                       ${Boost_LIBRARIES}
                       ${ISIS_LIBRARIES}
                       ${lib_cspice}
                       ${lib_geos}
                       ${lib_gsl}
                       ${lib_gslcblas}
                       ${lib_protobuf}
                       ${lib_tiff}
                       ${CHOLMOD_LIBRARY}
                       ${CAMD_LIBRARY}
                       ${AMD_LIBRARY}
                       ${COLAMD_LIBRARY}
                       ${lib_superlu}
                       ${BLAS_LIBRARY}
                       ${lib_z}
                       ${lib_xerces-c}
                       Qt5::XmlPatterns
                       Qt5::Xml
                       Qt5::Network
                       Qt5::Sql
                       Qt5::Gui
                       Qt5::Core
                       Qt5::Svg
                       Qt5::Test
                       Qt5::OpenGL
                       ${QWT_LIBRARY}
                       )

# Here we use ISIS's own tool to fix the paths to dynamic libraries
if(NOT APPLE)
    MESSAGE("NOT APPLE")
    add_custom_command(
        TARGET lidar_image_align 
        POST_BUILD
        COMMAND ${PATCHELF} --set-rpath $ENV{ISISROOT}/lib lidar_image_align
        COMMENT "Editing the run-time paths"
        VERBATIM
    )
endif()

install_targets(/bin lidar_image_align)

if (CTEST_ENABLED)
  add_test(lidar_image_align_test bash ./lidar_image_align_test.sh)
endif(CTEST_ENABLED)