Skip to content
Snippets Groups Projects
InstallFlesnet.cmake 6.99 KiB
# Build parts of the flesnet software, which is maintained in the flesnet repository on github
#
# The included libraries provide the interface to the experiment data in timeslices
# both online and in timeslice archive (.tsa) files.

set(FLESNET_VERSION 0aefc28576151385390b621b30cfc1862b97baed) # 2024-06-07

set(FLESNET_SRC_URL "https://github.com/cbm-fles/flesnet")

set(FLESNET_DESTDIR "${CMAKE_CURRENT_BINARY_DIR}/flesnet-prefix")
set(FLESNET_BIN_PREFIX "${FLESNET_DESTDIR}/src/flesnet-build")

download_project_if_needed(
  PROJECT         flesnet
  GIT_REPOSITORY  ${FLESNET_SRC_URL}
  GIT_TAG         ${FLESNET_VERSION}
  GIT_STASH       TRUE
  SOURCE_DIR      ${CMAKE_CURRENT_SOURCE_DIR}/flesnet
  TEST_FILE       CMakeLists.txt
)

include(FindBoostZstd)

If(ProjectUpdated)
  File(REMOVE_RECURSE ${FLESNET_DESTDIR})
  Message("flesnet source directory was changed so build directory was deleted")
EndIf()

if(APPLE)
  execute_process(COMMAND brew --prefix --installed openssl
                  RESULT_VARIABLE OPENSSL_FOUND
                  OUTPUT_VARIABLE OPENSSL_PATH
                  OUTPUT_STRIP_TRAILING_WHITESPACE
                 )
endif()

if ("${CMAKE_GENERATOR}" MATCHES "Make")
  set(FLESNET_BUILD_COMMAND "$(MAKE)")
else()
  set(FLESNET_BUILD_COMMAND "${CMAKE_COMMAND} --build . --target")
endif()

set(FLESNET_MODULES logging monitoring fles_ipc tsclient)
set(FLESNET_BYPRODUCTS
    ${FLESNET_DESTDIR}/src/flesnet-build/lib/fles_ipc/${CMAKE_STATIC_LIBRARY_PREFIX}fles_ipc${CMAKE_STATIC_LIBRARY_SUFFIX}
    ${FLESNET_BIN_PREFIX}/tsclient
   )

ExternalProject_Add(
  flesnet
  SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/flesnet
  CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env SIMPATH=${SIMPATH}
             ${CMAKE_COMMAND}
             -G ${CMAKE_GENERATOR}
             -DINCLUDE_ZMQ:BOOL=TRUE
             -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON
             -DOPENSSL_ROOT_DIR:FILEPATH=${OPENSSL_PATH}
             ${CMAKE_CURRENT_SOURCE_DIR}/flesnet
  BUILD_IN_SOURCE 0
  LOG_DOWNLOAD 1 LOG_CONFIGURE 1 LOG_BUILD 1 LOG_INSTALL 1
  BUILD_COMMAND ${FLESNET_BUILD_COMMAND} ${FLESNET_MODULES}
  BUILD_BYPRODUCTS ${FLESNET_BYPRODUCTS}
  INSTALL_COMMAND ""
)

install(PROGRAMS ${FLESNET_BIN_PREFIX}/tsclient TYPE BIN)

add_library(external::zmq STATIC IMPORTED GLOBAL)
add_dependencies(external::zmq flesnet)
set_target_properties(external::zmq PROPERTIES
  IMPORTED_LOCATION ${FLESNET_DESTDIR}/src/flesnet-build/src/zeromq-build/lib/${CMAKE_STATIC_LIBRARY_PREFIX}zmq${CMAKE_STATIC_LIBRARY_SUFFIX}
)
target_include_directories(external::zmq INTERFACE
  ${FLESNET_DESTDIR}/src/flesnet-build/src/zeromq/include
)
target_compile_definitions(external::zmq INTERFACE ZMQ_BUILD_DRAFT_API=1)

add_library(external::fles_logging STATIC IMPORTED GLOBAL)
add_dependencies(external::fles_logging flesnet)
set_target_properties(external::fles_logging PROPERTIES
  IMPORTED_LOCATION ${FLESNET_DESTDIR}/src/flesnet-build/lib/logging/${CMAKE_STATIC_LIBRARY_PREFIX}logging${CMAKE_STATIC_LIBRARY_SUFFIX}
)
target_include_directories(external::fles_logging INTERFACE
  ${CMAKE_CURRENT_SOURCE_DIR}/flesnet/lib/logging
  ${Boost_INCLUDE_DIRS}
)
target_compile_definitions(external::fles_logging
  INTERFACE BOOST_LOG_DYN_LINK
  INTERFACE BOOST_LOG_USE_NATIVE_SYSLOG
  INTERFACE BOOST_ERROR_CODE_HEADER_ONLY
)

add_library(external::fles_monitoring STATIC IMPORTED GLOBAL)
add_dependencies(external::fles_monitoring flesnet)
set_target_properties(external::fles_monitoring PROPERTIES
  IMPORTED_LOCATION ${FLESNET_DESTDIR}/src/flesnet-build/lib/monitoring/${CMAKE_STATIC_LIBRARY_PREFIX}monitoring${CMAKE_STATIC_LIBRARY_SUFFIX}
)
target_include_directories(external::fles_monitoring INTERFACE
  ${CMAKE_CURRENT_SOURCE_DIR}/flesnet/lib/monitoring
  ${Boost_INCLUDE_DIRS}
)
target_compile_definitions(external::fles_monitoring
  INTERFACE BOOST_LOG_DYN_LINK
  INTERFACE BOOST_LOG_USE_NATIVE_SYSLOG
  INTERFACE BOOST_ERROR_CODE_HEADER_ONLY
)

add_library(external::fles_ipc STATIC IMPORTED GLOBAL)
add_dependencies(external::fles_ipc flesnet external::fles_logging)
if (BOOST_IOS_HAS_ZSTD)
  target_compile_definitions(external::fles_ipc INTERFACE BOOST_IOS_HAS_ZSTD)
endif()

set(dir_to_link
    ${FLESNET_DESTDIR}/src/flesnet-build/src/zeromq-build/lib/${CMAKE_STATIC_LIBRARY_PREFIX}zmq${CMAKE_STATIC_LIBRARY_SUFFIX}
   )
find_package("GnuTLS" 3.6.7)
if(GNUTLS_FOUND)
  list(APPEND dir_to_link
       ${GNUTLS_LIBRARIES}
      )
endif()
list(APPEND dir_to_link
     ${FLESNET_DESTDIR}/src/flesnet-build/lib/logging/${CMAKE_STATIC_LIBRARY_PREFIX}logging${CMAKE_STATIC_LIBRARY_SUFFIX}
     ${FLESNET_DESTDIR}/src/flesnet-build/lib/monitoring/${CMAKE_STATIC_LIBRARY_PREFIX}monitoring${CMAKE_STATIC_LIBRARY_SUFFIX}
     )
list(APPEND dir_to_link
     ${Boost_LOG_LIBRARY}
     ${Boost_FILESYSTEM_LIBRARY}
     ${Boost_REGEX_LIBRARY}
     ${Boost_SERIALIZATION_LIBRARY}
     ${Boost_SYSTEM_LIBRARY} # Needed for the monitoring library linking
     ${Boost_IOSTREAMS_LIBRARY} # needed for the fles_ipc library linking
     fmt::fmt
     )
if(NOT APPLE)
  list(APPEND dir_to_link ${Boost_THREAD_LIBRARY} -lrt)
endif()

# Hack such that for boost versions below 1.80.0 libzstd is found
if(APPLE AND Boost_VERSION LESS 1.80.0)
  set_target_properties(external::fles_ipc PROPERTIES
    IMPORTED_LOCATION ${FLESNET_DESTDIR}/src/flesnet-build/lib/fles_ipc/${CMAKE_STATIC_LIBRARY_PREFIX}fles_ipc${CMAKE_STATIC_LIBRARY_SUFFIX}
    IMPORTED_LINK_INTERFACE_LIBRARIES "${dir_to_link}"
    INTERFACE_LINK_DIRECTORIES "/usr/local/lib"
  )
else ()
  set_target_properties(external::fles_ipc PROPERTIES
    IMPORTED_LOCATION ${FLESNET_DESTDIR}/src/flesnet-build/lib/fles_ipc/${CMAKE_STATIC_LIBRARY_PREFIX}fles_ipc${CMAKE_STATIC_LIBRARY_SUFFIX}
    IMPORTED_LINK_INTERFACE_LIBRARIES "${dir_to_link}"
  )
endif()
target_include_directories(external::fles_ipc INTERFACE
  ${CMAKE_CURRENT_SOURCE_DIR}/flesnet/lib/fles_ipc
  ${CMAKE_CURRENT_SOURCE_DIR}/flesnet/lib/shm_ipc
)



Install(FILES ${FLESNET_DESTDIR}/src/flesnet-build/lib/fles_ipc/${CMAKE_STATIC_LIBRARY_PREFIX}fles_ipc${CMAKE_STATIC_LIBRARY_SUFFIX}
              ${FLESNET_DESTDIR}/src/flesnet-build/lib/shm_ipc/${CMAKE_STATIC_LIBRARY_PREFIX}shm_ipc${CMAKE_STATIC_LIBRARY_SUFFIX}
              ${FLESNET_DESTDIR}/src/flesnet-build/lib/logging/${CMAKE_STATIC_LIBRARY_PREFIX}logging${CMAKE_STATIC_LIBRARY_SUFFIX}
              ${FLESNET_DESTDIR}/src/flesnet-build/lib/monitoring/${CMAKE_STATIC_LIBRARY_PREFIX}monitoring${CMAKE_STATIC_LIBRARY_SUFFIX}
              ${FLESNET_DESTDIR}/src/flesnet-build/src/zeromq-build/lib/${CMAKE_STATIC_LIBRARY_PREFIX}zmq${CMAKE_STATIC_LIBRARY_SUFFIX}
        DESTINATION lib
       )

file(GLOB IPC_LIB_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/flesnet/lib/fles_ipc/*.hpp)
file(GLOB LOG_LIB_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/flesnet/lib/logging/*.hpp)
file(GLOB MONITOR_LIB_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/flesnet/lib/monitoring/*.hpp)
file(GLOB MONITOR_LIB_IPP ${CMAKE_CURRENT_SOURCE_DIR}/flesnet/lib/monitoring/*.ipp)

Install(FILES ${IPC_LIB_HEADERS}
              ${LOG_LIB_HEADERS}
              ${MONITOR_LIB_HEADERS}
              ${MONITOR_LIB_IPP}
        DESTINATION include
       )