Back to home page

EIC code displayed by LXR

 
 

    


Warning, /EICrecon/CMakeLists.txt is written in an unsupported language. File is not indexed.

0001 # cmake-format: off
0002 #
0003 # Variables to control this CMake build:
0004 # ===================================================================================
0005 #    CMake flag       |  environment variable  |  Description
0006 # ===================================================================================
0007 # -- (under review)   | EDM4HEP_ROOT           |  Edm4Hep  installation directory
0008 #------------------------------------------------------------------------------------
0009 # -DCMAKE_CXX_STANDARD      | 17 - standard for C++ compilation
0010 # ===================================================================================
0011 #
0012 #
0013 # ==============================================================
0014 #    DEPENDENCIES (used by find_package)
0015 # ==============================================================
0016 #      Name           |  Description
0017 # ==============================================================
0018 # JANA                |   Jana2 framework
0019 # EDM4HEP             |   Event data model based on podio
0020 # podio               |   IO library
0021 # DD4hep              |   Geometry framework
0022 # ROOT                |   CERN ROOT
0023 # spdlog              |   Formatting library
0024 # IRT                 |   Indirect Ray Tracing library
0025 # ==============================================================
0026 #
0027 # cmake-format: on
0028 
0029 cmake_minimum_required(VERSION 3.24)
0030 
0031 # 3.27: find_package() uses upper-case <PACKAGENAME>_ROOT variables
0032 cmake_policy(SET CMP0144 NEW)
0033 
0034 include(cmake/git_version.cmake)
0035 set_git_version(EICRECON_VERSION)
0036 
0037 project(
0038   EICrecon
0039   VERSION ${EICRECON_VERSION}
0040   LANGUAGES CXX)
0041 
0042 # CMake includes
0043 include(CheckCXXCompilerFlag)
0044 
0045 # Set a default build type if none was specified
0046 set(default_build_type "Release")
0047 if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
0048   message(
0049     STATUS
0050       "Setting build type to '${default_build_type}' as none was specified.")
0051   set(CMAKE_BUILD_TYPE
0052       "${default_build_type}"
0053       CACHE STRING "Choose the type of build." FORCE)
0054   # Set the possible values of build type for cmake-gui
0055   set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
0056                                                "MinSizeRel" "RelWithDebInfo")
0057 endif()
0058 
0059 # Minimal dependency versions
0060 set(Acts_VERSION_MIN 39.2.0)
0061 set(algorithms_VERSION_MIN 1.0.0)
0062 set(DD4hep_VERSION_MIN 1.21)
0063 set(EDM4EIC_VERSION_MIN 8.4)
0064 set(EDM4HEP_VERSION_MIN 0.99.4)
0065 set(Eigen3_VERSION_MIN 3.3)
0066 set(FastJet_VERSION_MIN 3)
0067 set(FastJetContrib_VERSION_MIN 1.46)
0068 set(fmt_VERSION_MIN 9.0.0)
0069 set(IRT_VERSION_MIN 1.0.5)
0070 set(JANA_VERSION_MIN 2.4.0)
0071 set(onnxruntime_MIN_VERSION 1.17)
0072 set(podio_VERSION_MIN 1.3)
0073 set(ROOT_VERSION_MIN 6.28)
0074 set(spdlog_VERSION_MIN 1.11.0)
0075 set(ZeroMQ_VERSION_MIN 4.3.0)
0076 
0077 # Set default standard to C++20
0078 set(CMAKE_CXX_STANDARD_MIN 20)
0079 set(CMAKE_CXX_STANDARD
0080     ${CMAKE_CXX_STANDARD_MIN}
0081     CACHE STRING "C++ standard to be used")
0082 if(CMAKE_CXX_STANDARD LESS CMAKE_CXX_STANDARD_MIN)
0083   message(
0084     FATAL_ERROR
0085       "Unsupported C++ standard: ${CMAKE_CXX_STANDARD} (at least ${CMAKE_CXX_STANDARD_MIN} required)"
0086   )
0087 endif()
0088 set(CMAKE_CXX_STANDARD_REQUIRED ON)
0089 set(CMAKE_CXX_EXTENSIONS OFF)
0090 
0091 # Infrastructure to support use of --no-as-needed
0092 include(CheckLinkerFlag)
0093 check_linker_flag(CXX "LINKER:--no-as-needed" CXX_LINKER_HAS_no_as_needed)
0094 set(CMAKE_CXX_LINK_LIBRARY_USING_NO_AS_NEEDED_SUPPORTED TRUE)
0095 set(CMAKE_CXX_LINK_LIBRARY_USING_NO_AS_NEEDED
0096     "LINKER:--push-state,--no-as-needed" "<LINK_ITEM>" "LINKER:--pop-state")
0097 
0098 # Export compile commands as json for run-clang-tidy
0099 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
0100 
0101 # Also use clang-tidy integration in CMake
0102 option(ENABLE_CLANG_TIDY "Enable clang-tidy integration in cmake" OFF)
0103 if(ENABLE_CLANG_TIDY)
0104   find_program(CLANG_TIDY_EXE NAMES "clang-tidy")
0105   if(CLANG_TIDY_EXE)
0106     message(STATUS "clang-tidy found: ${CLANG_TIDY_EXE}")
0107     set(CMAKE_CXX_CLANG_TIDY
0108         "${CLANG_TIDY_EXE}"
0109         CACHE STRING "" FORCE)
0110   else()
0111     set(CMAKE_CXX_CLANG_TIDY
0112         ""
0113         CACHE STRING "" FORCE)
0114   endif()
0115 endif()
0116 
0117 # LINK_WHAT_YOU_USE support
0118 option(ENABLE_LINK_WHAT_YOU_USE
0119        "Enable LINK_WHAT_YOU_USE to detect unnecessary link dependencies" OFF)
0120 if(ENABLE_LINK_WHAT_YOU_USE)
0121   message(STATUS "LINK_WHAT_YOU_USE enabled")
0122   set(CMAKE_LINK_WHAT_YOU_USE TRUE)
0123 
0124   # Set output directory for LINK_WHAT_YOU_USE logs
0125   set(LINK_WHAT_YOU_USE_OUTPUT_DIR "${CMAKE_BINARY_DIR}/link_what_you_use_logs")
0126 
0127   # Set up custom check script for better output control; CMake will append the
0128   # binary file path as the last argument
0129   set(CMAKE_LINK_WHAT_YOU_USE_CHECK
0130       "${CMAKE_COMMAND}" "-DOUTPUT_DIR=${LINK_WHAT_YOU_USE_OUTPUT_DIR}" -P
0131       "${CMAKE_SOURCE_DIR}/cmake/link_what_you_use_check.cmake")
0132 
0133   message(
0134     STATUS
0135       "LINK_WHAT_YOU_USE logs will be written to: ${LINK_WHAT_YOU_USE_OUTPUT_DIR}"
0136   )
0137 endif()
0138 
0139 # Enable -fPIC for all targets
0140 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
0141 
0142 # Install to the top directory by default
0143 if(${CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT})
0144   set(CMAKE_INSTALL_PREFIX
0145       ${CMAKE_SOURCE_DIR}
0146       CACHE PATH "Install in top directory by default" FORCE)
0147 endif()
0148 
0149 # Install to standard location
0150 include(GNUInstallDirs)
0151 
0152 # Default plugins installation directory is 'plugins'
0153 if(NOT DEFINED PLUGIN_OUTPUT_DIRECTORY)
0154   set(PLUGIN_OUTPUT_DIRECTORY "lib/${PROJECT_NAME}/plugins")
0155   message(STATUS "${CMAKE_PROJECT_NAME}: Set default PLUGIN_OUTPUT_DIRECTORY")
0156 endif()
0157 message(
0158   STATUS
0159     "${CMAKE_PROJECT_NAME}: PLUGIN_OUTPUT_DIRECTORY: ${PLUGIN_OUTPUT_DIRECTORY}"
0160 )
0161 
0162 # Default plugins static libraries installation directory is 'lib'
0163 if(NOT DEFINED PLUGIN_LIBRARY_OUTPUT_DIRECTORY)
0164   set(PLUGIN_LIBRARY_OUTPUT_DIRECTORY "lib")
0165   message(STATUS "${CMAKE_PROJECT_NAME}: Set default PLUGIN_OUTPUT_DIRECTORY")
0166 endif()
0167 message(
0168   STATUS
0169     "${CMAKE_PROJECT_NAME}: PLUGIN_LIBRARY_OUTPUT_DIRECTORY: ${PLUGIN_LIBRARY_OUTPUT_DIRECTORY}"
0170 )
0171 
0172 # Use, i.e. don't skip the full RPATH for the build tree, and use relative paths
0173 # for relocatable build products
0174 set(CMAKE_SKIP_BUILD_RPATH FALSE)
0175 set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE)
0176 
0177 # When building, don't use the install RPATH already (but later on when
0178 # installing)
0179 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
0180 set(CMAKE_SKIP_INSTALL_RPATH FALSE)
0181 set(CMAKE_INSTALL_RPATH
0182     "${CMAKE_INSTALL_PREFIX}/${PLUGIN_LIBRARY_OUTPUT_DIRECTORY};${CMAKE_INSTALL_PREFIX}/${PLUGIN_OUTPUT_DIRECTORY}"
0183 )
0184 
0185 # Add the automatically determined parts of the RPATH which point to directories
0186 # outside the build tree to the install RPATH
0187 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
0188 
0189 # Add custom Find<Package>.cmake modules early so they take priority over
0190 # bundled finders shipped by third-party packages (e.g. ROOT ships FindVdt.cmake
0191 # and appends its cmake/modules to CMAKE_MODULE_PATH during find_package(ROOT)).
0192 list(PREPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
0193 
0194 # Check and print what JANA2 is used
0195 find_package(JANA ${JANA_VERSION_MIN} REQUIRED)
0196 message(STATUS "${CMAKE_PROJECT_NAME}: JANA2 CMake   : ${JANA_DIR}")
0197 message(STATUS "${CMAKE_PROJECT_NAME}: JANA2 includes: ${JANA_INCLUDE_DIR}")
0198 message(STATUS "${CMAKE_PROJECT_NAME}: JANA2 library : ${JANA_LIBRARY}")
0199 
0200 # Algorithms
0201 find_package(algorithms ${algorithms_VERSION_MIN} REQUIRED Core)
0202 
0203 # PODIO, EDM4HEP, EDM4EIC event models
0204 find_package(Eigen3 ${Eigen3_VERSION_MIN} REQUIRED)
0205 find_package(podio ${podio_VERSION_MIN} REQUIRED)
0206 find_package(EDM4HEP REQUIRED)
0207 if(EDM4HEP_VERSION VERSION_LESS EDM4HEP_VERSION_MIN)
0208   message(
0209     FATAL_ERROR
0210       "EDM4HEP ${EDM4HEP_VERSION} is less than minimum ${EDM4HEP_VERSION_MIN}")
0211 endif()
0212 find_package(EDM4EIC ${EDM4EIC_VERSION_MIN} REQUIRED)
0213 
0214 # fmt
0215 find_package(fmt ${fmt_VERSION_MIN} REQUIRED)
0216 
0217 # spdlog
0218 find_package(spdlog ${spdlog_VERSION_MIN} REQUIRED)
0219 
0220 # Guidelines Support Library
0221 find_package(Microsoft.GSL CONFIG)
0222 
0223 # Remove PODIO_JSON_OUTPUT (ref: https://github.com/AIDASoft/podio/issues/475)
0224 get_target_property(EDM4HEP_INTERFACE_COMPILE_DEFINITIONS EDM4HEP::edm4hep
0225                     INTERFACE_COMPILE_DEFINITIONS)
0226 if(EDM4HEP_INTERFACE_COMPILE_DEFINITIONS)
0227   list(FILTER EDM4HEP_INTERFACE_COMPILE_DEFINITIONS EXCLUDE REGEX
0228        [[^PODIO_JSON_OUTPUT$]])
0229   set_property(
0230     TARGET EDM4HEP::edm4hep PROPERTY INTERFACE_COMPILE_DEFINITIONS
0231                                      ${EDM4HEP_INTERFACE_COMPILE_DEFINITIONS})
0232 endif()
0233 get_target_property(EDM4EIC_INTERFACE_COMPILE_DEFINITIONS EDM4EIC::edm4eic
0234                     INTERFACE_COMPILE_DEFINITIONS)
0235 if(EDM4EIC_INTERFACE_COMPILE_DEFINITIONS)
0236   list(FILTER EDM4EIC_INTERFACE_COMPILE_DEFINITIONS EXCLUDE REGEX
0237        [[^PODIO_JSON_OUTPUT$]])
0238   set_property(
0239     TARGET EDM4EIC::edm4eic PROPERTY INTERFACE_COMPILE_DEFINITIONS
0240                                      ${EDM4EIC_INTERFACE_COMPILE_DEFINITIONS})
0241 endif()
0242 
0243 # DD4Hep is required for the most of the part
0244 find_package(DD4hep ${DD4hep_VERSION_MIN} REQUIRED)
0245 
0246 # ACTS cmake-lint: disable=C0103
0247 find_package(Acts REQUIRED COMPONENTS Core PluginDD4hep PluginJson)
0248 set(Acts_VERSION
0249     "${Acts_VERSION_MAJOR}.${Acts_VERSION_MINOR}.${Acts_VERSION_PATCH}")
0250 if(${Acts_VERSION} VERSION_LESS ${Acts_VERSION_MIN})
0251   message(
0252     FATAL_ERROR
0253       "Acts version ${Acts_VERSION_MIN} or higher required, but ${Acts_VERSION} found"
0254   )
0255 endif()
0256 if(${Acts_VERSION} VERSION_GREATER_EQUAL "43.0.0")
0257   set(Acts_NAMESPACE_PREFIX Acts::)
0258 else()
0259   set(Acts_NAMESPACE_PREFIX Acts)
0260 endif()
0261 # Acts::Core
0262 get_target_property(ACTS_COMPILE_FEATURES ${Acts_NAMESPACE_PREFIX}Core
0263                     INTERFACE_COMPILE_FEATURES)
0264 if(NOT "cxx_std_${CMAKE_CXX_STANDARD}" IN_LIST ACTS_COMPILE_FEATURES)
0265   message(
0266     WARNING
0267       "Acts has not been built with the requested C++ standard ${CMAKE_CXX_STANDARD}."
0268   )
0269 endif()
0270 
0271 # Workaround for multiple definition bug in Acts < 40
0272 # (https://github.com/acts-project/acts/pull/4380)
0273 if(Acts_VERSION VERSION_LESS "40.0.0")
0274   if(TARGET ${Acts_NAMESPACE_PREFIX}PluginPodio)
0275     message(STATUS "Checking if older Acts version needs linker flags...")
0276     try_compile(
0277       Acts_needs_allow_multiple_definition
0278       ${CMAKE_BINARY_DIR}/Acts_needs_allow_multiple_definition
0279       SOURCES
0280         ${PROJECT_SOURCE_DIR}/cmake/Acts_needs_allow_multiple_definition/main.cc
0281         ${PROJECT_SOURCE_DIR}/cmake/Acts_needs_allow_multiple_definition/a.cc
0282         ${PROJECT_SOURCE_DIR}/cmake/Acts_needs_allow_multiple_definition/b.cc
0283       LINK_LIBRARIES podio::podio ${Acts_NAMESPACE_PREFIX}Core
0284                      ${Acts_NAMESPACE_PREFIX}PluginPodio)
0285     if(NOT Acts_needs_allow_multiple_definition)
0286       message(WARNING "This Acts version requires --allow-multiple-definition. "
0287                       "This may mask other multiple definition issues. "
0288                       "Ref: https://github.com/acts-project/acts/pull/4380.")
0289       check_linker_flag(CXX "LINKER:--allow-multiple-definition"
0290                         CXX_LINKER_HAS_allow_multiple_definition)
0291       if(CXX_LINKER_HAS_allow_multiple_definition)
0292         add_link_options("LINKER:--allow-multiple-definition")
0293       endif()
0294     endif()
0295   endif()
0296 endif()
0297 
0298 # ROOT
0299 find_package(ROOT ${ROOT_VERSION_MIN} REQUIRED)
0300 # Check that ROOT is compiled with a modern enough c++ standard
0301 get_target_property(ROOT_COMPILE_FEATURES ROOT::Core INTERFACE_COMPILE_FEATURES)
0302 if(NOT "cxx_std_${CMAKE_CXX_STANDARD}" IN_LIST ROOT_COMPILE_FEATURES)
0303   message(
0304     WARNING
0305       "ROOT has not been built with the requested C++ standard ${CMAKE_CXX_STANDARD}."
0306   )
0307 endif()
0308 
0309 # ONNX Runtime
0310 find_package(onnxruntime ${onnxruntime_MIN_VERSION} CONFIG)
0311 
0312 # ZeroMQ
0313 if(NOT TARGET libzmq)
0314   # This and set_target_properties below addresses a discrepancy between
0315   # https://github.com/zeromq/cppzmq/blob/master/libzmq-pkg-config/FindZeroMQ.cmake
0316   # and https://github.com/JeffersonLab/JANA2/blob/master/cmake/FindZeroMQ.cmake
0317   add_library(libzmq UNKNOWN IMPORTED)
0318 
0319   if(NOT cppzmq_FOUND)
0320     find_package(cppzmq REQUIRED)
0321   endif()
0322 
0323   set_target_properties(
0324     libzmq PROPERTIES IMPORTED_LOCATION ${ZeroMQ_LIBRARIES}
0325                       INTERFACE_INCLUDE_DIRECTORIES ${ZeroMQ_INCLUDE_DIRS})
0326 endif()
0327 
0328 # Add CMake additional functionality:
0329 include(cmake/jana_plugin.cmake) # Add common settings for plugins
0330 
0331 enable_testing()
0332 
0333 # Address sanitizer
0334 option(USE_ASAN "Compile with address sanitizer" OFF)
0335 if(${USE_ASAN})
0336   add_compile_options(-fsanitize=address -fno-omit-frame-pointer -g -O1)
0337   add_link_options(-fsanitize=address)
0338   install(FILES .github/asan.supp .github/lsan.supp
0339           DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME})
0340 endif()
0341 
0342 # Thread sanitizer
0343 option(USE_TSAN "Compile with thread sanitizer" OFF)
0344 if(${USE_TSAN})
0345   add_compile_options(-fsanitize=thread -g -O1)
0346   add_link_options(-fsanitize=thread)
0347   install(FILES .github/tsan.supp
0348           DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME})
0349 endif()
0350 
0351 # Undefined behavior sanitizer
0352 option(USE_UBSAN "Compile with undefined behavior sanitizer" OFF)
0353 if(${USE_UBSAN})
0354   foreach(sanitizer undefined float-divide-by-zero unsigned-integer-overflow
0355                     implicit-conversion local-bounds nullability)
0356     check_cxx_compiler_flag("-fsanitize=${sanitizer}"
0357                             CXX_COMPILER_HAS_sanitize_${sanitizer})
0358     if(CXX_COMPILER_HAS_sanitize_${sanitizer})
0359       add_compile_options(-fsanitize=${sanitizer})
0360       add_link_options(-fsanitize=${sanitizer})
0361     endif()
0362   endforeach()
0363   add_compile_options(-g -O1)
0364   install(FILES .github/ubsan.supp
0365           DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME})
0366 endif()
0367 
0368 # Compress debug symbols if supported
0369 check_cxx_compiler_flag("-gz" CXX_COMPILER_HAS_gz)
0370 if(CXX_COMPILER_HAS_gz)
0371   set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -gz")
0372   set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -gz")
0373 endif()
0374 
0375 add_subdirectory(src/services)
0376 add_subdirectory(src/algorithms)
0377 add_subdirectory(src/benchmarks)
0378 add_subdirectory(src/detectors)
0379 add_subdirectory(src/extensions)
0380 add_subdirectory(src/factories)
0381 add_subdirectory(src/global)
0382 add_subdirectory(src/scripts)
0383 add_subdirectory(src/tests)
0384 add_subdirectory(src/utilities)
0385 
0386 # Install all cmake helpers
0387 include(CMakePackageConfigHelpers)
0388 configure_package_config_file(
0389   cmake/${PROJECT_NAME}Config.cmake.in
0390   ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}Config.cmake
0391   INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
0392 write_basic_package_version_file(
0393   ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}ConfigVersion.cmake
0394   VERSION ${CMAKE_PROJECT_VERSION}
0395   COMPATIBILITY SameMajorVersion)
0396 install(
0397   FILES ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}Config.cmake
0398         ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}ConfigVersion.cmake
0399   DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
0400 install(
0401   EXPORT ${PROJECT_NAME}Targets
0402   NAMESPACE ${PROJECT_NAME}::
0403   DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
0404 install(
0405   DIRECTORY cmake/
0406   DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
0407   FILES_MATCHING
0408   PATTERN *.cmake)