project(mars_app)
set(PROJECT_VERSION 1.0)
set(PROJECT_DESCRIPTION "This is ...")
cmake_minimum_required(VERSION 2.6)

include(FindPkgConfig)

find_package(lib_manager)
lib_defaults()
define_module_info()

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR} "${PROJECT_SOURCE_DIR}/cmake")

set(DEFAULT_CONFIG_DIR "${CMAKE_INSTALL_PREFIX}/configuration/mars_default" CACHE STRING "The Default config dir to load")
add_definitions(-DDEFAULT_CONFIG_DIR=\"${DEFAULT_CONFIG_DIR}\")
add_definitions(-DMARS_PREFERENCES_DEFAULT_RESOURCES_PATH=\"${CMAKE_INSTALL_PREFIX}/share\")


MACRO(CMAKE_USE_FULL_RPATH install_rpath)
    SET(CMAKE_SKIP_BUILD_RPATH  FALSE)
    SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
    SET(CMAKE_INSTALL_RPATH ${install_rpath})
    SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
ENDMACRO(CMAKE_USE_FULL_RPATH)
CMAKE_USE_FULL_RPATH("${CMAKE_INSTALL_PREFIX}/lib")

pkg_check_modules(PKGCONFIG
        lib_manager
        configmaps
        # optional but still requires include header to be available if used
        mars_scene_loader
        mars_graphics
        mars_gui
        mars_sim
        main_gui
        mars_interfaces
        data_broker
        cfg_manager
        data_broker_gui
        cfg_manager_gui
        lib_manager_gui
        log_console
        data_broker_plotter2
        SkyDomePlugin
        CameraGUI
        entity_view
        mars_smurf
        mars_smurf_loader
)
include_directories(${PKGCONFIG_INCLUDE_DIRS})
link_directories(${PKGCONFIG_LIBRARY_DIRS})
add_definitions(${PKGCONFIG_CLFAGS_OTHER})  #flags excluding the ones with -I


pkg_check_modules(MAINGUI main_gui)
if(MAINGUI_FOUND)
  set(main_gui_required main_gui)
  include_directories(${MAINGUI_INCLUDE_DIRS})
  link_directories(${MAINGUI_LIBRARY_DIRS})
  add_definitions(${MAINGUI_CLFAGS_OTHER})
  setup_qt()
  set(SOURCES
    src/GraphicsTimer.cpp
    src/MARS.cpp
  )
  set(QT_MOC_HEADER
      src/GraphicsTimer.h
      #src/MARS.h
  )
  if (${USE_QT5})
  qt5_wrap_cpp ( QT_MOC_HEADER_SRC ${QT_MOC_HEADER} )
  else (${USE_QT5})
  qt4_wrap_cpp ( QT_MOC_HEADER_SRC ${QT_MOC_HEADER} )
  endif (${USE_QT5})
else(MAINGUI_FOUND)
  add_definitions("-DNO_GUI")
  set(SOURCES
    src/MARS.cpp
  )
endif(MAINGUI_FOUND)


set(TARGET_SRC
    ${QT_MOC_HEADER_SRC}
    ${SOURCES}
)

if(MAINGUI_FOUND)
IF( MINGW )
  # resource compilation for MinGW
  ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/mars_icon.o
                      COMMAND windres.exe -I${CMAKE_CURRENT_SOURCE_DIR} -i${CMAKE_CURRENT_SOURCE_DIR}/resources/appicon.rc
                             -o ${CMAKE_CURRENT_BINARY_DIR}/mars_icon.o )
  SET(TARGET_SRC ${TARGET_SRC} ${CMAKE_CURRENT_BINARY_DIR}/mars_icon.o)
#ELSE( MINGW )
#  SET(TARGET_SRC ${TARGET_SRC} resources/mars_icon.ico)
ENDIF( MINGW )
endif(MAINGUI_FOUND)

add_executable(${PROJECT_NAME} src/main.cpp)
add_library(mars SHARED ${TARGET_SRC})

if(MAINGUI_FOUND)
if (${USE_QT5})
qt5_use_modules(${PROJECT_NAME} Widgets)
qt5_use_modules(mars Widgets)
endif (${USE_QT5})
endif(MAINGUI_FOUND)

IF (WIN32)
  set(WIN_LIBS
        -lwinmm
  )
  SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES LINK_FLAGS -Wl,--stack,0x1000000)
ENDIF (WIN32)

target_link_libraries(mars
            ${QT_LIBRARIES}
            ${WIN_LIBS}
            ${PKGCONFIG_LIBRARIES}
            ${MAINGUI_LIBRARIES}
)

target_link_libraries(${PROJECT_NAME} mars)

INSTALL(TARGETS ${PROJECT_NAME} mars
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib)

IF (WIN32)
  SET (POSTLIB ".dll")
  SET (PRELIB "lib")
  SET (LIBPATH "bin")
ELSE (WIN32)
  IF (APPLE)
    SET (POSTLIB ".dylib")
    SET (PRELIB "lib")
    SET (LIBPATH "lib")
  ELSE (APPLE)
    if (${USE_QT5})
      set(PUBLIC_DEPENDECIES Qt5Widgets)
    else()
      set(PUBLIC_DEPENDENCIES QtCore)
    endif()
    SET (POSTLIB ".so")
    SET (PRELIB "lib")
    SET (LIBPATH "lib")
  ENDIF (APPLE)
ENDIF (WIN32)

set(ADDITIONAL_LIBS "" CACHE INTERNAL "")

function(add_plugin_if_available LIBNAME)
  find_library(${LIBNAME}_VAR "${LIBNAME}" HINTS ${CMAKE_INSTALL_PREFIX}/${LIBPATH})
  if(${LIBNAME}_VAR)
    MESSAGE("Found ${LIBNAME} Plugin: ${${LIBNAME}_VAR}")
    set(ADDITIONAL_LIBS "${ADDITIONAL_LIBS}${LIBNAME} " CACHE INTERNAL "")
  else()
    MESSAGE("Not found: ${LIBNAME}")
  endif()
endfunction()

add_plugin_if_available("connexion_plugin")
add_plugin_if_available("data_broker_gui")
add_plugin_if_available("cfg_manager_gui")
add_plugin_if_available("lib_manager_gui")
add_plugin_if_available("SkyDomePlugin")
add_plugin_if_available("PythonMars")
add_plugin_if_available("CameraGUI")
add_plugin_if_available("data_broker_plotter2")

if(NOT ROCK)
    add_plugin_if_available("log_console")
endif()


if(ADDITIONAL_LIBS)
string(REGEX REPLACE " " "
" ADDITIONAL_LIBS ${ADDITIONAL_LIBS})
endif()

configure_file(configuration/core_libs.in ${CMAKE_BINARY_DIR}/core_libs.txt.example @ONLY)
configure_file(configuration/other_libs.in ${CMAKE_BINARY_DIR}/other_libs.txt.example @ONLY)
configure_file(configuration/core_libs-nogui.in ${CMAKE_BINARY_DIR}/core_libs-nogui.txt.example @ONLY)
install(FILES ${CMAKE_BINARY_DIR}/core_libs.txt.example ${CMAKE_BINARY_DIR}/other_libs.txt.example ${CMAKE_BINARY_DIR}/core_libs-nogui.txt.example DESTINATION configuration/mars_default/)

install(FILES configuration/pypath.yml  DESTINATION configuration/mars_default/)
install(DIRECTORY configuration/python DESTINATION configuration/mars_default/)

configure_file(mars_app.pc.in ${CMAKE_BINARY_DIR}/mars_app.pc @ONLY)
install(FILES ${CMAKE_BINARY_DIR}/mars_app.pc DESTINATION lib/pkgconfig/)

if(MAINGUI_FOUND)
install(FILES ${CMAKE_SOURCE_DIR}/src/GraphicsTimer.h DESTINATION include/mars/app/)
endif(MAINGUI_FOUND)
install(FILES ${CMAKE_SOURCE_DIR}/src/MARS.h DESTINATION include/mars/app/)
install(FILES ${CMAKE_SOURCE_DIR}/src/MyApp.h DESTINATION include/mars/app/)
