project(earthworm)

list(APPEND EXTRA_INCLUDE_DIR "")
add_compile_options ("-fopenmp")

#cpp_redis
if(WITH_REDIS)
  find_package(Cpp_redis)
    if(CPP_REDIS_LIBRARIES)
      list(APPEND EXTRA_INCLUDE_DIR ${CPP_REDIS_INCLUDE_DIR})
  else()
    # add external package
    message("Local libcpp_redis is not found. Installing from github")
    include(ExternalProject)
    set(EXTERNAL_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/extern)
    ExternalProject_Add(expkg_cpp_redis
        GIT_REPOSITORY https://github.com/cpp-redis/cpp_redis.git
        CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION}
        BUILD_COMMAND make -j
        INSTALL_COMMAND make install
        UPDATE_COMMAND ""
    )
    add_dependencies(earthworm expkg_cpp_redis)
    set(CPP_REDIS_LIBRARIES "${EXTERNAL_INSTALL_LOCATION}/lib/libcpp_redis.a" "${EXTERNAL_INSTALL_LOCATION}/lib/libtacopie.a")
    list(APPEND EXTRA_INCLUDE_DIR ${EXTERNAL_INSTALL_LOCATION}/include)
  endif()
endif()


#dim
find_package(Dim REQUIRED)
list(APPEND EXTRA_INCLUDE_DIR ${DIM_INCLUDE_DIR})

#Epics4
find_package(Epics4 REQUIRED)
list(APPEND EXTRA_INCLUDE_DIR ${EPICS4_INCLUDE_DIR})

#OpenMP
find_package(OpenMP REQUIRED)


#add source
file(GLOB PSR_SRC "${PROJECT_SOURCE_DIR}/Parser/libsrc/*.cc")
file(GLOB EPI_SRC "${PROJECT_SOURCE_DIR}/Epics/libsrc/*.cc")
file(GLOB HIS_SRC "${PROJECT_SOURCE_DIR}/Hist/libsrc/*.cc")
file(GLOB PRO_SRC "${PROJECT_SOURCE_DIR}/cpythonprototype/libsrc/*.cc")
file(GLOB DIM_SRC "${PROJECT_SOURCE_DIR}/DimRecv/libsrc/*.cc")
file(GLOB ETM_SRC "${PROJECT_SOURCE_DIR}/Earthworm/libsrc/*.cc")
file(GLOB UTL_SRC "${PROJECT_SOURCE_DIR}/Utils/libsrc/*.cc")
file(GLOB MD_SRC "${PROJECT_SOURCE_DIR}/MD/libsrc/*.cc")

if(WITH_REDIS)
  file(GLOB RIS_SRC "${PROJECT_SOURCE_DIR}/RedisIO/libsrc/*.cc")
  list(APPEND EXTRA_INCLUDE_DIR  ${PROJECT_SOURCE_DIR}/RedisIO/libinc)
endif()


ADD_LIBRARY(${PROJECT_NAME} SHARED ${PSR_SRC} ${EPI_SRC} ${HIS_SRC} ${UTL_SRC}  ${PRO_SRC}
            ${DIM_SRC} ${ETM_SRC} ${RIS_SRC}  ${MD_SRC})

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)

if(WITH_REDIS)
  target_link_libraries(${PROJECT_NAME} PUBLIC Threads::Threads ${CPP_REDIS_LIBRARIES} ${DIM_LIBRARIES} ${EPICS4_LIBRARIES} OpenMP::OpenMP_CXX)
else()
  target_link_libraries(${PROJECT_NAME} PUBLIC Threads::Threads ${DIM_LIBRARIES} ${EPICS4_LIBRARIES} OpenMP::OpenMP_CXX)
endif()

target_include_directories( ${PROJECT_NAME}
    PUBLIC
    ${PROJECT_SOURCE_DIR}/Utils/libinc
    ${PROJECT_SOURCE_DIR}/Epics/libinc
    ${PROJECT_SOURCE_DIR}/Hist/libinc
    ${PROJECT_SOURCE_DIR}/Parser/libinc
    ${PROJECT_SOURCE_DIR}/cpythonprototype/libinc
    ${PROJECT_SOURCE_DIR}/DimRecv/libinc
    ${PROJECT_SOURCE_DIR}/MD/libinc
    ${PROJECT_SOURCE_DIR}/Earthworm/libinc
    ${CMAKE_SOURCE_DIR}/extern/dim/inc
    ${CMAKE_SOURCE_DIR}/extern/
    ${EXTRA_INCLUDE_DIR}
)
