PROJECT(DataSvc)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)

# Build Type
IF(CMAKE_BUILD_TYPE_INITIALIZED_TO_DEFAULT)
    SET(CMAKE_BUILD_TYPE DEBUG) # RELEASE, RELWITHDEBINFO MINSIZEREL
ENDIF()

# Find Package
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/../CMake/Modules)

OPTION(Dim "Dim" OFF)
IF(Dim)
    FIND_PACKAGE(Dim REQUIRED)
    IF(Dim_FOUND)
        INCLUDE_DIRECTORIES(${Dim_INCLUDE_DIRS})
    ELSEIF(NOT Dim_FOUND) 
        MESSAGE(FATAL_ERROR "Unable to find Dim. Did you set Dim_ROOT?")
    ENDIF()
ELSEIF(NOT Dim)
    MESSAGE(STATUS "Did not call Dim.")
ENDIF()

FIND_PACKAGE(SniperKernel REQUIRED)
#FIND_PACKAGE(Data REQUIRED)
#IF(DATA_FOUND AND SNIPERKERNEL_FOUND)
IF(SNIPERKERNEL_FOUND)
  INCLUDE_DIRECTORIES(${SniperKernel_INCLUDE_DIRS} ${Data_INCLUDE_DIRS})
ELSEIF(NOT SniperKernel_FOUND) 
  MESSAGE(FATAL_ERROR "Unable to find SniperKernel. Did you set SniperKernel_ROOT?")
ENDIF()

OPTION(Epics "Epics" OFF)
IF(Epics)
    FIND_PACKAGE(pvAccess REQUIRED)
    FIND_PACKAGE(pvData REQUIRED)
    FIND_PACKAGE(Base REQUIRED)
    IF(pvAccess_FOUND AND pvData_FOUND)
        IF(Base_FOUND)
            INCLUDE_DIRECTORIES(${Base_INCLUDE_DIRS} ${Base_INCLUDE_DIRS}/compiler/gcc ${Base_INCLUDE_DIRS}/os/Linux ${pvAccess_INCLUDE_DIRS}/../ ${pvData_INCLUDE_DIRS}/../)
        ELSEIF(NOT Base_FOUND)
            MESSAGE(FATAL_ERROR "Unable to find base. Did you set BasePATH?")
        ENDIF()
    ELSEIF(NOT pvAccess_FOUND)
        MESSAGE(FATAL_ERROR "Unable to find pvAccess. Did you set pvAccess_ROOT?")
    ELSEIF(NOT pvData_FOUND)
        MESSAGE(FATAL_ERROR "Unable to find pvData. Did you set pvData_ROOT?")
    ENDIF()
ELSEIF(NOT Epics)
    MESSAGE(STATUS "Did not call Epics!")
ENDIF()

# Find Package
SET(Boost_NO_BOOST_CMAKE TRUE)
#SET( BOOST_ROOT "/opt/shared/library/boost-1.62.0")
FIND_PACKAGE(Boost)
FIND_PACKAGE(PythonLibs)
IF(Boost_FOUND AND PYTHONLIBS_FOUND)
  INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_PATH})
  SET(Boost_USE_STATIC_LIBS OFF)
  SET(Boost_USE_MULTITHREADED ON)
  SET(Boost_USE_STATIC_RUNTIME OFF)
  FIND_PACKAGE(Boost  COMPONENTS python  thread REQUIRED) 
ELSEIF(NOT Boost_FOUND)
  MESSAGE(FATAL_ERROR "Unable to find Boost. Did you set BOOST_ROOT?")
ELSEIF(NOT PYTHONLIBS_FOUND)
  MESSAGE(FATAL_ERROR "Unable to find Python. Did you set PYTHONPATH?")
ENDIF()

# Compile Flag
IF(CMAKE_COMPILER_IS_GNUCXX)
  ADD_DEFINITIONS("-Wall")
ELSE()
  MESSAGE(FATAL_ERROR "CMakeLists.txt has not been tested/written for your compiler.")
ENDIF()

# Search Source Files
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR})
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/EpicsV4Src)
    
FILE(GLOB_RECURSE CPPLIB_SRC_LIST "src/*.cc")# "src/EpicsV4Src/*.cc")
IF(NOT Dim AND NOT Epics)
    list(REMOVE_ITEM CPPLIB_SRC_LIST
${CMAKE_CURRENT_SOURCE_DIR}/src/DimRecvSvc.cc
${CMAKE_CURRENT_SOURCE_DIR}/src/EpicsInputSvc.cc
${CMAKE_CURRENT_SOURCE_DIR}/src/neutronClientStartMonitor.cc
${CMAKE_CURRENT_SOURCE_DIR}/src/EpicsV4Src/neutronClientRequestAndMonitor.cc)
    MESSAGE(STATUS ${CPPLIB_SRC_LIST})
ELSEIF(NOT Dim AND Epics)
    list(REMOVE_ITEM CPPLIB_SRC_LIST
${CMAKE_CURRENT_SOURCE_DIR}/src/DimRecvSvc.cc)
    MESSAGE(STATUS ${CPPLIB_SRC_LIST})
ELSEIF(NOT Epics AND Dim)
    list(REMOVE_ITEM CPPLIB_SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/src/EpicsInputSvc.cc
${CMAKE_CURRENT_SOURCE_DIR}/src/neutronClientStartMonitor.cc
${CMAKE_CURRENT_SOURCE_DIR}/src/EpicsV4Src/neutronClientRequestAndMonitor.cc)
    MESSAGE(STATUS ${CPPLIB_SRC_LIST})
ENDIF()

# Compile Library for CPP
ADD_LIBRARY(DataSvc SHARED ${CPPLIB_SRC_LIST})
TARGET_LINK_LIBRARIES(DataSvc ${Boost_LIBRARIES}) 
TARGET_LINK_LIBRARIES(DataSvc ${SniperKernel_LIBRARIES})
TARGET_LINK_LIBRARIES(DataSvc ${Dim_LIBRARIES})
TARGET_LINK_LIBRARIES(DataSvc ${pvAccess_LIBRARIES})
TARGET_LINK_LIBRARIES(DataSvc ${pvData_LIBRARIES})
TARGET_LINK_LIBRARIES(DataSvc ${Base_LIBRARIES})

# add libDataSvcPython
FILE(GLOB_RECURSE PYBLIB_SRC_LIST "src/binding/*.cc")
ADD_LIBRARY(DataSvcPython SHARED ${PYBLIB_SRC_LIST})
TARGET_LINK_LIBRARIES(DataSvcPython ${Boost_LIBRARIES})
TARGET_LINK_LIBRARIES(DataSvcPython DataSvc)

# Output Path and Install Area
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

IF (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
  SET(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR}/../../../DroNEInstall/)
ENDIF()

INSTALL(TARGETS DataSvc LIBRARY DESTINATION lib)
INSTALL(TARGETS DataSvcPython LIBRARY DESTINATION pylib)
INSTALL(DIRECTORY DataSvc DESTINATION include)
INSTALL(DIRECTORY Data    DESTINATION include)
INSTALL(DIRECTORY python/DataSvc DESTINATION pylib)
