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