cmake_minimum_required(VERSION 2.8.11) set(proj_name fazia-ecc) set(proj_version 2.0) if(${CMAKE_VERSION} VERSION_LESS 3.0) project(${proj_name}) set(PROJECT_VERSION ${proj_version}) set(${proj_name}_VERSION ${proj_version}) else() cmake_policy(VERSION 3.0) project(${proj_name} VERSION ${proj_version}) endif() set(CMAKE_BUILD_TYPE "RelWithDebInfo") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_SOURCE_DIR}/externals/cmake/AddSubproject ) include(AddSubproject) # automatically add paths to external libraries to RPATH of all binaries set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) # ============================================================================= # ------------------------------ Build options -------------------------------- # ============================================================================= option(USE_TAPIRMQ "use TapirMQ-client to push metadata and logs to InfluxDB" ON) set(LIBARIES_TO_LINK) # look for KaliVeda with FAZIA libraries and optionally sqlite find_package(KaliVeda 1.10 REQUIRED FAZIA) include(${KALIVEDA_USE_FILE}) list(APPEND LIBRARIES_TO_LINK ${KALIVEDA_LIBRARIES}) # look for ROOT find_package(ROOT REQUIRED GuiHtml Thread) include(SetUpROOTBuild) list(APPEND LIBRARIES_TO_LINK ${ROOT_LIBRARIES}) # look for libcurl find_package(CURL REQUIRED) if(CURL_FOUND) include_directories(${CURL_INCLUDE_DIRS}) endif() # to read GANIL MFM merged frame (INDRA-FAZIA) #---sources available from: https://gitlab.in2p3.fr/jdfcode/mfmlib.git find_package(mfmlib QUIET) if(mfmlib_FOUND) set(HAVE_MFMLIB yes) include_directories(${mfmlib_INCLUDE_DIRS}) list(APPEND LIBRARIES_TO_LINK ${mfmlib_LIBRARIES}) endif(mfmlib_FOUND) # to read GANIL Mesytec data #---sources available from: https://gitlab.in2p3.fr/mesytec-ganil/mesytec_data find_package(mesytec_data REQUIRED) if(mesytec_data_FOUND) set(WITH_MESYTEC yes) include_directories(${mesytec_data_INCLUDE_DIRS}) list(APPEND LIBRARIES_TO_LINK ${mesytec_data_LIBRARIES}) else() message(STATUS "mesytec_data not found...") endif() # look for boost find_package(Boost COMPONENTS program_options) if(Boost_PROGRAM_OPTIONS_FOUND) set(HAVE_BOOST yes) include_directories(${Boost_INCLUDE_DIRS}) list(APPEND LIBRARIES_TO_LINK ${Boost_PROGRAM_OPTIONS_LIBRARY}) endif() include(GNUInstallDirs) set(CMAKE_INSTALL_PKGINCDIR ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}) set(CMAKE_INSTALL_PKGLIBDIR ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}) set(CMAKE_INSTALL_PKGCONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) #------------------------------------------------------------------------------------------- # Build & install analysis tools (former fazia-oscillo branch) # look for protobuf find_package(Protobuf) if(NOT PROTOBUF_FOUND) # we may need pkg-config to find installation find_package(PkgConfig QUIET) if(PkgConfig_FOUND) message(STATUS "Looking for protobuf with pkg-config") ## use pkg-config to get hints for protobuf locations pkg_check_modules(PROTOBUF QUIET protobuf) if(PROTOBUF_FOUND) set(CMAKE_LIBRARY_PATH ${PROTOBUF_LIBRARY_DIRS} ${CMAKE_LIBRARY_PATH}) set(PROTOBUF_INCLUDE_DIR ${PROTOBUF_INCLUDE_DIRS}) set(Protobuf_INCLUDE_DIR ${PROTOBUF_INCLUDE_DIRS}) find_package(Protobuf) endif(PROTOBUF_FOUND) endif(PkgConfig_FOUND) endif(NOT PROTOBUF_FOUND) if(PROTOBUF_FOUND) # protobuf requires C++11 or higher # check if -std=c++11/4/7 flag already in cxx flags string(FIND ${CMAKE_CXX_FLAGS} "-std=c++11" CPP11_FLAGS) string(FIND ${CMAKE_CXX_FLAGS} "-std=c++14" CPP14_FLAGS) string(FIND ${CMAKE_CXX_FLAGS} "-std=c++17" CPP17_FLAGS) if((CPP11_FLAGS GREATER 0) OR (CPP14_FLAGS GREATER 0) OR (CPP17_FLAGS GREATER 0)) # nothing to do, one of flags is already present else() include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) if(COMPILER_SUPPORTS_CXX11) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") endif() endif() endif(PROTOBUF_FOUND) add_definitions( -DOSCILLO_DATADIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}" ) # look for ZeroMQ find_package(ZMQ) if(PROTOBUF_FOUND AND ZMQ_FOUND) set(HAVE_PROTOBUF yes) include_directories(${PROTOBUF_INCLUDE_DIRS}) message(STATUS "Protobuf include dir = ${PROTOBUF_INCLUDE_DIRS}") include_directories(${CMAKE_BINARY_DIR}/protobuf) set(HAVE_ZMQ_H yes) include_directories(${ZMQ_INCLUDE_DIRS}) list(APPEND LIBRARIES_TO_LINK ${ZMQ_LIBRARIES}) message(STATUS "ZMQ include dir = ${ZMQ_INCLUDE_DIRS}") message(STATUS "ZMQ library = ${ZMQ_LIBRARIES}") # generate protobuf source from event description set(FAZIA_EVENT_PROTO FzEventSet.proto) add_subdirectory(protobuf) get_property(FAZIA_PROTOBUF_LIB GLOBAL PROPERTY FAZIA_PROTOBUF_LIB) list(APPEND LIBRARIES_TO_LINK ${FAZIA_PROTOBUF_LIB}) endif(PROTOBUF_FOUND AND ZMQ_FOUND) set(LIBRARY_TARGETS) if(USE_TAPIRMQ) list(APPEND LIBRARY_TARGETS tapirmq-client) add_subproject(externals/tapirmq-client PATH_TO_LIBS "$ORIGIN/fazia-ecc:$ORIGIN/../lib/fazia-ecc") message(NOTICE "using TapirMQ-client library") endif(USE_TAPIRMQ) # generate config.h configure_file(${CMAKE_SOURCE_DIR}/config.h.in ${CMAKE_BINARY_DIR}/fzoscillo-config.h) install(FILES ${CMAKE_BINARY_DIR}/fzoscillo-config.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) include_directories(${CMAKE_BINARY_DIR}) add_definitions( -DHAVE_CONFIG_H ) add_definitions( -DPKGBUILDDIR=${PROJECT_BINARY_DIR} -DPKGDATADIR=${CMAKE_INSTALL_FULL_DATADIR} -DPKGHTMLDIR=${CMAKE_INSTALL_FULL_HTMLDIR} ) list(APPEND LIBRARY_TARGETS fazia-ecc-base) add_subdirectory(base) include_directories(${CMAKE_SOURCE_DIR}/base) list(APPEND LIBRARY_TARGETS fazia-ecc-ecc) add_subdirectory(ecc) install_subproject_targets() include_directories(${CMAKE_SOURCE_DIR}/ecc) list(APPEND LIBRARY_TARGETS fazia-ecc-mon) add_subdirectory(monitoring) include_directories(${CMAKE_SOURCE_DIR}/monitoring) add_subdirectory(merger) list(APPEND LIBRARIES_TO_LINK ${LIBRARY_TARGETS}) add_subdirectory(execs) set(doc_DATA README INSTALL README.server README.usersguide COPYING) install(FILES ${doc_DATA} DESTINATION ${CMAKE_INSTALL_DOCDIR}) install(DIRECTORY etc/ DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}) # install PHP scripts for webserver database access install(DIRECTORY webserver DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}) include(CreateConfigScript) create_config_script() if(PROTOBUF_FOUND AND ZMQ_FOUND) if(DEFINED ENV{SITE}) if($ENV{SITE} STREQUAL "CCIN2P3") #-at IN2P3 Computing Centre, build with support for xrootd find_package(XROOTD) if(XROOTD_FOUND) list(APPEND LIBRARIES_TO_LINK ${XROOTD_LIBRARIES}) endif() endif() endif() # configure subdirectories for different executables add_subdirectory(oscillo) add_subdirectory(viewer) if(HAVE_MFMLIB AND WITH_MESYTEC) add_subdirectory(indra-viewer) add_subdirectory(indra-scaler) endif() # - obsolete: do not build # add_subdirectory(converter) add_subdirectory(database) add_subdirectory(replay) add_subdirectory(scaler) endif(PROTOBUF_FOUND AND ZMQ_FOUND) include(CheckCXXSymbolExists) set(CMAKE_REQUIRED_INCLUDES ${KALIVEDA_INCLUDE_DIR}) CHECK_CXX_SYMBOL_EXISTS(WITH_RSQLITE KVConfig.h GOT_KVSQLITE) if(GOT_KVSQLITE) message(STATUS "Got KVSQLITE") add_subdirectory(dbviewer) else() message(STATUS "No KVSQLITE: dbviewer directory will not be compiled") endif() # set RPATH on all executables in order to find private utility libraries # libfazia_protobuf_event.so & libfazia_sound.so which will not be installed in a # standard library directory but in $PREFIX/bin/fazia-ecc/ get_property(EXEC_TARGET_LIST GLOBAL PROPERTY EXEC_TARGET_LIST) foreach(exec_target ${EXEC_TARGET_LIST}) get_target_property(TARGET_RUNPATH ${exec_target} INSTALL_RPATH) list(APPEND TARGET_RUNPATH ${CMAKE_INSTALL_FULL_BINDIR}/${PROJECT_NAME}) set_target_properties(${exec_target} PROPERTIES INSTALL_RPATH "${TARGET_RUNPATH}") endforeach() #install user's guides install(DIRECTORY doc/ DESTINATION ${CMAKE_INSTALL_HTMLDIR}) #generate & install class reference doc add_custom_target(html make -f ${PROJECT_SOURCE_DIR}/make.html ROOTEXEC=${ROOT_EXECUTABLE} srcdir=${PROJECT_SOURCE_DIR} builddir=${PROJECT_BUILD_DIR} COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_BINARY_DIR}/htmldoc ${CMAKE_INSTALL_FULL_HTMLDIR} WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} ) find_package(Protobuf REQUIRED) PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS MergerInfo.proto) add_executable(merger-spy merger-spy.cpp MergerInfo.pb.cc merger_spy.cpp) target_include_directories(merger-spy PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) target_link_libraries(merger-spy ${LIBRARIES_TO_LINK}) install(TARGETS merger-spy DESTINATION ${CMAKE_INSTALL_BINDIR}) set_property(GLOBAL APPEND PROPERTY EXEC_TARGET_LIST merger-spy)