Skip to content
Snippets Groups Projects
Forked from Gaudi / Gaudi
724 commits behind, 13 commits ahead of the upstream repository.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
CMakeLists.txt 16.07 KiB
#####################################################################################
# (c) Copyright 1998-2023 CERN for the benefit of the LHCb and ATLAS collaborations #
#                                                                                   #
# This software is distributed under the terms of the Apache version 2 licence,     #
# copied verbatim in the file "LICENSE".                                            #
#                                                                                   #
# In applying this licence, CERN does not waive the privileges and immunities       #
# granted to it by virtue of its status as an Intergovernmental Organization        #
# or submit itself to any jurisdiction.                                             #
#####################################################################################
# GaudiKernel subdirectory

# VectorClass only supports x86_64 architectures
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
  # Look for VectorClass required header (private dependency)
  find_path(VectorClass_INCLUDE_DIR NAMES instrset_detect.cpp)
  if(VectorClass_INCLUDE_DIR AND NOT VectorClass_VERSION)
    # check that the version is good enough
    set(VectorClass_VERSION 0.0)
    file(STRINGS ${VectorClass_INCLUDE_DIR}/instrset.h _vectorclass_guard REGEX "define +INSTRSET_H +[0-9]+")
    list(GET _vectorclass_guard 0 _vectorclass_guard)
    if(_vectorclass_guard MATCHES "INSTRSET_H +([0-9][0-9][0-9][0-9][0-9])")
      string(REGEX REPLACE "([0-9]+)([0-9][0-9])([0-9][0-9])" "\\1.\\2.\\3" VectorClass_VERSION "${CMAKE_MATCH_1}")
    elseif(_vectorclass_guard MATCHES "INSTRSET_H +([0-9][0-9][0-9])")
      string(REGEX REPLACE "([0-9]+)([0-9][0-9])" "\\1.\\2" VectorClass_VERSION "${CMAKE_MATCH_1}")
    endif()
    set(VectorClass_VERSION "${VectorClass_VERSION}" CACHE INTERNAL "")
  endif()
  if(NOT VectorClass_INCLUDE_DIR OR VectorClass_VERSION VERSION_LESS 2.01.02)
    if(VectorClass_INCLUDE_DIR)
      message(STATUS "Found VectorClass instrset_detect ${VectorClass_VERSION} at ${VectorClass_INCLUDE_DIR}")
    endif()
    message(WARNING "using internal VectorClass instrset_detect (2.01.02)")
    set(VectorClass_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/contrib" CACHE PATH "" FORCE)
    set(VectorClass_VERSION "1.25" CACHE INTERNAL "" FORCE)
  endif()
  mark_as_advanced(VectorClass_INCLUDE_DIR)
  message(STATUS "Using VectorClass instrset_detect ${VectorClass_VERSION} at ${VectorClass_INCLUDE_DIR}")
endif()

# Build the library
gaudi_add_library(GaudiKernel
  SOURCES src/Lib/AlgContext.cpp
          src/Lib/Algorithm.cpp
          src/Lib/AlgorithmHistory.cpp
          src/Lib/AlgTool.cpp
          src/Lib/AlgToolHistory.cpp
          src/Lib/AllocatorPool.cpp
          src/Lib/Application.cpp
          src/Lib/Auditor.cpp
          src/Lib/Bootstrap.cpp
          src/Lib/ChronoEntity.cpp
          src/Lib/ComponentManager.cpp
          src/Lib/ConcurrencyFlags.cpp
          src/Lib/ContainedObject.cpp
          src/Lib/ConversionSvc.cpp
          src/Lib/Converter.cpp
          src/Lib/DataHandle.cpp
          src/Lib/DataHandleFinder.cpp
          src/Lib/DataHandleHolderVisitor.cpp
          src/Lib/DataHistory.cpp
          src/Lib/DataObject.cpp
          src/Lib/DataObjectHandleBase.cpp
          src/Lib/DataHandleProperty.cpp
          src/Lib/DataObjID.cpp
          src/Lib/DataStreamTool.cpp
          src/Lib/DataSvc.cpp
          src/Lib/DataTypeInfo.cpp
          src/Lib/Debugger.cpp
          src/Lib/Dictionary.cpp
          src/Lib/DirSearchPath.cpp
          src/Lib/Environment.cpp
          src/Lib/EventIDBase.cpp
          src/Lib/EventIDRange.cpp
          src/Lib/EventSelectorDataStream.cpp
          src/Lib/FunctionalFilterDecision.cpp
          src/Lib/GaudiException.cpp
          src/Lib/GaudiHandle.cpp
          src/Lib/GaudiMain.cpp
          src/Lib/Guards.cpp
          src/Lib/HistoDef.cpp
          src/Lib/HistogramArray.cpp
          src/Lib/HistoryObj.cpp
          src/Lib/IChronoStatSvc.cpp
          src/Lib/IConversionSvc.cpp
          src/Lib/IDataProviderSvc.cpp
          src/Lib/IInterface.cpp
          src/Lib/Incident.cpp
          src/Lib/IPartitionControl.cpp
          src/Lib/ISvcLocator.cpp
          src/Lib/ITimelineSvc.cpp
          src/Lib/JobHistory.cpp
          src/Lib/KeyedObjectManager.cpp
          src/Lib/LegacyAlgorithm.cpp
          src/Lib/LinkManager.cpp
          src/Lib/MapBase.cpp
          src/Lib/Memory.cpp
          src/Lib/Message.cpp
          src/Lib/MinimalEventLoopMgr.cpp
          src/Lib/ModuleInfo.cpp
          src/Lib/MsgStream.cpp
          src/Lib/NTupleImplementation.cpp
          src/Lib/NTupleItems.cpp
          src/Lib/ParsersCollections.cpp
          src/Lib/ParsersHistograms.cpp
          src/Lib/ParsersStandardList1.cpp
          src/Lib/ParsersStandardList2.cpp
          src/Lib/ParsersStandardList3.cpp
          src/Lib/ParsersStandardList4.cpp
          src/Lib/ParsersStandardMisc1.cpp
          src/Lib/ParsersStandardMisc2.cpp
          src/Lib/ParsersStandardMisc3.cpp
          src/Lib/ParsersStandardMisc4.cpp
          src/Lib/ParsersStandardMisc5.cpp
          src/Lib/ParsersStandardSingle.cpp
          src/Lib/ParsersVct.cpp
          src/Lib/PathResolver.cpp
          src/Lib/PrintAlgsSequences.cpp
          src/Lib/ProcessDescriptor.cpp
          src/Lib/Property.cpp
          src/Lib/PropertyMgr.cpp
          src/Lib/Range.cpp
          src/Lib/RegistryEntry.cpp
          src/Lib/RenounceToolInputsVisitor.cpp
          src/Lib/RndmGenerators.cpp
          src/Lib/RndmTypeInfos.cpp
          src/Lib/Selector.cpp
          src/Lib/Sequence.cpp
          src/Lib/Service.cpp
          src/Lib/ServiceHistory.cpp
          src/Lib/ServiceLocatorHelper.cpp
          src/Lib/Sleep.cpp
          src/Lib/SmartDataObjectPtr.cpp
          src/Lib/SmartRefBase.cpp
          src/Lib/SmartRefVector.cpp
          src/Lib/Stat.cpp
          src/Lib/StateMachine.cpp
          src/Lib/StatusCode.cpp
          src/Lib/StringKey.cpp
          src/Lib/System.cpp
          src/Lib/ThreadLocalContext.cpp
          src/Lib/Time.cpp
          src/Lib/Timing.cpp
          src/Lib/ToolVisitor.cpp
          src/Lib/TsDataSvc.cpp
          src/Lib/VirtualDestructors.cpp
          src/Lib/WatchdogThread.cpp
  LINK
    PUBLIC GaudiPluginService
           Boost::headers
           Boost::filesystem
           Boost::thread
           Boost::regex
           Boost::system
           TBB::tbb
           ${CMAKE_DL_LIBS}
           ROOT::Core
           cppgsl::cppgsl
           fmt::fmt
           nlohmann_json::nlohmann_json
           Rangev3::rangev3
           ${GAUDI_ATOMIC_LIBS}
    PRIVATE Python::Python
)
gaudi_generate_version_header_file(GaudiKernel)
target_include_directories(GaudiKernel
  PRIVATE ${VectorClass_INCLUDE_DIR}
  PUBLIC $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/include>  # for GAUDI_VERSION.h
  )
if(APPLE)
  target_sources(GaudiKernel PRIVATE src/Lib/Platform/SystemMacOS.h
                                     src/Lib/Platform/SystemMacOS.mm)
  target_link_libraries(GaudiKernel PUBLIC "-framework Foundation -framework CoreFoundation")
elseif(WIN32)
  target_sources(GaudiKernel PRIVATE src/Lib/Platform/SystemWin32.h
                                     src/Lib/Platform/SystemWin32.cpp)
elseif(UNIX)
  target_sources(GaudiKernel PRIVATE src/Lib/Platform/SystemLinux.h
                                     src/Lib/Platform/SystemLinux.cpp)
  target_link_libraries(GaudiKernel PUBLIC ${rt_LIBRARY})
endif()

# Genconf
gaudi_add_executable(genconf
  SOURCES src/Util/genconf.cpp
  LINK GaudiKernel
       GaudiPluginService
       Boost::headers
       Boost::program_options
       Boost::regex
       Boost::log
       Boost::log_setup
       ROOT::Core)
target_compile_definitions(genconf PRIVATE BOOST_LOG_DYN_LINK)
set_target_properties(genconf PROPERTIES ENABLE_EXPORTS TRUE)

if(WIN32)
  gaudi_add_executable(genwindef
    SOURCES src/Util/genwindef.cpp
            src/Util/LibSymbolInfo.cpp)
endif()

gaudi_add_executable(instructionsetLevel
  SOURCES src/Util/instructionsetLevel.cpp
  LINK GaudiKernel
       GaudiPluginService)

# ROOT dictionaries
gaudi_add_dictionary(GaudiKernelDict
                     HEADERFILES dict/dictionary.h
                     SELECTION dict/dictionary.xml
                     LINK GaudiKernel)

# Install python modules
gaudi_install(PYTHON)

# Install other scripts
gaudi_install(SCRIPTS)

# Check that gdb can be used for stack traces
find_program(gdb_cmd gdb)
mark_as_advanced(gdb_cmd)
if(gdb_cmd)
  get_filename_component(gdb_dir "${gdb_cmd}" DIRECTORY)
  file(TO_CMAKE_PATH "$ENV{PATH}" envpath)
  if(NOT gdb_dir IN_LIST envpath)
    set_property(TARGET target_runtime_paths APPEND
      PROPERTY runtime_path $<SHELL_PATH:${gdb_dir}>)
  endif()
else()
  message(WARNING "gdb not found, you will not be able to have stack traces for problems")
endif()

if(BUILD_TESTING)
  gaudi_add_executable(profile_Property
                      SOURCES tests/src/profile_Property.cpp
                      LINK GaudiKernel)

  # Build and register tests
  get_filename_component(package_name ${CMAKE_CURRENT_SOURCE_DIR} NAME)
  gaudi_add_executable(DirSearchPath_test
                      SOURCES tests/src/DirSearchPath_test.cpp
                      LINK GaudiKernel
                      TEST)

  gaudi_add_executable(PathResolver_test SOURCES tests/src/PathResolver_test.cpp
    LINK GaudiKernel)
  add_test(NAME ${package_name}.PathResolver_test
          COMMAND run $<TARGET_FILE:PathResolver_test>
          WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests)

  gaudi_add_executable(Parsers_test SOURCES tests/src/parsers.cpp
    LINK GaudiKernel TEST)

  gaudi_add_executable(Memory_test SOURCES tests/src/Memory_test.cpp
    LINK GaudiKernel TEST)

  gaudi_add_executable(ContextSpecificPtrTest SOURCES tests/src/test_ContextSpecificPtr.cpp
    LINK GaudiKernel Boost::unit_test_framework TEST)

  gaudi_add_executable(test_GAUDI-905 SOURCES tests/src/GAUDI-905.cpp
    LINK GaudiKernel TEST)

  gaudi_add_executable(test_GAUDI-973 SOURCES tests/src/GAUDI-973.cpp
    LINK GaudiKernel TEST)

  gaudi_add_executable(test_PropertyHolder SOURCES tests/src/test_PropertyHolder.cpp
    LINK GaudiKernel Boost::unit_test_framework TEST)

  gaudi_add_executable(test_Property SOURCES tests/src/test_Property.cpp
    LINK GaudiKernel Boost::unit_test_framework TEST)

  gaudi_add_executable(test_WeakPropertyRef SOURCES tests/src/test_WeakPropertyRef.cpp
    LINK GaudiKernel Boost::unit_test_framework TEST)

  gaudi_add_executable(test_StatusCode SOURCES tests/src/test_StatusCode.cpp
    LINK GaudiKernel Boost::unit_test_framework TEST)

  gaudi_add_executable(test_EventIDBase SOURCES tests/src/test_EventIDBase.cpp
    LINK GaudiKernel Boost::unit_test_framework TEST)

  gaudi_add_executable(test_EventIDRange SOURCES tests/src/test_EventIDRange.cpp
    LINK GaudiKernel Boost::unit_test_framework TEST)

  gaudi_add_executable(test_SystemTypeinfoName SOURCES tests/src/test_SystemTypeinfoName.cpp
    LINK GaudiKernel Boost::unit_test_framework TEST)

  gaudi_add_executable(test_SystemCmdLineArgs SOURCES tests/src/test_SystemCmdLineArgs.cpp
    LINK GaudiKernel Boost::unit_test_framework TEST)

  gaudi_add_executable(test_compose SOURCES tests/src/test_compose.cpp
    LINK GaudiKernel Boost::unit_test_framework TEST)

  gaudi_add_executable(test_reverse SOURCES tests/src/test_reverse.cpp
    LINK GaudiKernel Boost::unit_test_framework TEST)

  gaudi_add_executable(test_Counters SOURCES tests/src/CountersUnitTest.cpp
    LINK GaudiKernel Boost::unit_test_framework TEST)

  gaudi_add_executable(test_CounterHistos SOURCES tests/src/CounterHistosUnitTest.cpp
    LINK GaudiKernel Boost::unit_test_framework TEST)

  gaudi_add_executable(test_CounterHistoArray SOURCES tests/src/CounterHistoArrayUnitTest.cpp
    LINK GaudiKernel Boost::unit_test_framework TEST)

  gaudi_add_executable(test_GenericSink SOURCES tests/src/GenericSinkUnitTest.cpp
    LINK GaudiKernel Boost::unit_test_framework TEST)

  gaudi_add_executable(AttribStringParser_test SOURCES tests/src/test_AttribStringParser.cpp
    LINK GaudiKernel Boost::unit_test_framework TEST)

  gaudi_add_executable(test_MonotonicArena SOURCES tests/src/test_MonotonicArena.cpp
    LINK GaudiKernel Boost::unit_test_framework TEST)

  gaudi_add_executable(test_GaudiTimer SOURCES tests/src/test_GaudiTimer.cpp
    LINK GaudiKernel Boost::unit_test_framework TEST)

  gaudi_add_executable(test_HistoUtils SOURCES tests/src/RootHistogramUtilsUnitTest.cpp
    LINK GaudiKernel Boost::unit_test_framework ROOT::Hist TEST)

  foreach(test_case IN ITEMS 01 02 03 04)
    add_executable(test_StatusCodeFail_case${test_case} tests/src/test_StatusCode_fail.cxx)
    target_include_directories(test_StatusCodeFail_case${test_case} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
    target_link_libraries(test_StatusCodeFail_case${test_case} PRIVATE Boost::headers)
    set_target_properties(test_StatusCodeFail_case${test_case} PROPERTIES EXCLUDE_FROM_ALL TRUE EXCLUDE_FROM_DEFAULT_BUILD TRUE)
    target_compile_definitions(test_StatusCodeFail_case${test_case} PRIVATE CASE${test_case})
    add_test(NAME ${package_name}.test_StatusCodeFail.case${test_case}
            COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target test_StatusCodeFail_case${test_case})
    set_property(TEST ${package_name}.test_StatusCodeFail.case${test_case} PROPERTY PASS_REGULAR_EXPRESSION "FAIL${test_case}")
    set_property(TEST ${package_name}.test_StatusCodeFail.case${test_case} PROPERTY RESOURCE_LOCK build-system)
  endforeach()

  # add compilation failure test for Gaudihistogram usage
  add_executable(test_CounterHistoFail tests/src/CounterHistos_fail.cpp)
  target_link_libraries(test_CounterHistoFail PRIVATE
    nlohmann_json::nlohmann_json
    cppgsl::cppgsl
    Boost::headers
    ROOT::Hist
    fmt::fmt
  )
  target_include_directories(test_CounterHistoFail PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/include
    ${PROJECT_SOURCE_DIR}/GaudiPluginService/include
  )
  set_target_properties(test_CounterHistoFail PROPERTIES EXCLUDE_FROM_ALL TRUE EXCLUDE_FROM_DEFAULT_BUILD TRUE)
  add_test(NAME GaudiKernel.test_CounterHistoFail COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target test_CounterHistoFail)
  set_property(TEST GaudiKernel.test_CounterHistoFail PROPERTY PASS_REGULAR_EXPRESSION "\\+\\+h2d\\[1\\.2\\]\; // ERROR: cannot fill a 2D histogram with a single index")
  set_property(TEST GaudiKernel.test_CounterHistoFail PROPERTY RESOURCE_LOCK build-system)
  if(GAUDI_USE_CPPUNIT)
    gaudi_add_executable(test_SerializeSTL SOURCES tests/src/test_SerializeSTL.cpp
      LINK GaudiKernel CppUnit::cppunit TEST)

    gaudi_add_executable(test_AnyDataObject SOURCES tests/src/test_AnyDataObject.cpp
      LINK GaudiKernel CppUnit::cppunit TEST)

    gaudi_add_executable(test_DataHandleVector SOURCES tests/src/test_DataHandleVector.cpp
      LINK GaudiKernel CppUnit::cppunit TEST)

    gaudi_add_executable(test_GaudiTime SOURCES tests/src/test_GaudiTime.cpp
      LINK GaudiKernel CppUnit::cppunit TEST)

    gaudi_add_executable(test_GaudiTiming SOURCES tests/src/test_GaudiTiming.cpp
      LINK GaudiKernel CppUnit::cppunit TEST)

    gaudi_add_executable(test_LockedHandle SOURCES tests/src/test_LockedHandle.cpp
      LINK GaudiKernel CppUnit::cppunit Boost::thread ${CMAKE_DL_LIBS} TEST)
  endif()

  gaudi_add_executable(GaudiKernel_catch2_tests
    SOURCES 
      tests/src/CounterSerializationTest.cpp
      tests/src/MonitoringEntityUnitTest.cpp
    LINK
      GaudiKernel
      Catch2::Catch2WithMain
      nlohmann_json::nlohmann_json
  )
  catch_discover_tests(GaudiKernel_catch2_tests
      TEST_PREFIX GaudiKernel.
      PROPERTIES
          LABELS "Gaudi"
          LABELS "Gaudi.GaudiKernel"
  )

  gaudi_add_pytest(tests/nose)

  gaudi_add_module(test_CustomFactory
    SOURCES tests/src/custom_factory.cpp
    LINK GaudiPluginService)

  file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/custom_factory_testdir)
  add_test(NAME ${package_name}.genconf_with_custom_factory
    COMMAND run $<TARGET_FILE:genconf>
            -o ${CMAKE_CURRENT_BINARY_DIR}/custom_factory_testdir
            -p CustomFactoryTest
            -i test_CustomFactory
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/custom_factory_testdir)

  # QMTest
  gaudi_add_tests(QMTest)
endif()