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 project(EICrecon LANGUAGES CXX)
0035 
0036 # CMake includes
0037 include(CheckCXXCompilerFlag)
0038 
0039 # Set version based on git
0040 include(cmake/git_version.cmake)
0041 set_git_version(CMAKE_PROJECT_VERSION)
0042 
0043 # Set a default build type if none was specified
0044 set(default_build_type "Release")
0045 if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
0046   message(
0047     STATUS
0048       "Setting build type to '${default_build_type}' as none was specified.")
0049   set(CMAKE_BUILD_TYPE
0050       "${default_build_type}"
0051       CACHE STRING "Choose the type of build." FORCE)
0052   # Set the possible values of build type for cmake-gui
0053   set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
0054                                                "MinSizeRel" "RelWithDebInfo")
0055 endif()
0056 
0057 # Minimal dependency versions
0058 set(Acts_VERSION_MIN 33.0.0)
0059 set(algorithms_VERSION_MIN 1.0.0)
0060 set(DD4hep_VERSION_MIN 1.21)
0061 set(EDM4EIC_VERSION_MIN 7.0)
0062 set(EDM4HEP_VERSION_MIN 0.7.1)
0063 set(Eigen3_VERSION_MIN 3.3)
0064 set(FastJet_VERSION_MIN 3)
0065 set(FastJetContrib_VERSION_MIN 1.46)
0066 set(fmt_VERSION_MIN 9.0.0)
0067 set(IRT_VERSION_MIN 1.0.5)
0068 set(JANA_VERSION_MIN 2.2.0)
0069 set(onnxruntime_MIN_VERSION 1.17)
0070 set(podio_VERSION_MIN 0.17)
0071 set(ROOT_VERSION_MIN 6.28)
0072 set(spdlog_VERSION_MIN 1.11.0)
0073 
0074 # Set default standard to C++20
0075 set(CMAKE_CXX_STANDARD_MIN 20)
0076 set(CMAKE_CXX_STANDARD
0077     ${CMAKE_CXX_STANDARD_MIN}
0078     CACHE STRING "C++ standard to be used")
0079 if(CMAKE_CXX_STANDARD LESS CMAKE_CXX_STANDARD_MIN)
0080   message(
0081     FATAL_ERROR
0082       "Unsupported C++ standard: ${CMAKE_CXX_STANDARD} (at least ${CMAKE_CXX_STANDARD_MIN} required)"
0083   )
0084 endif()
0085 set(CMAKE_CXX_STANDARD_REQUIRED ON)
0086 set(CMAKE_CXX_EXTENSIONS OFF)
0087 
0088 # Infrastructure to support use of --no-as-needed
0089 include(CheckLinkerFlag)
0090 check_linker_flag(CXX "LINKER:--no-as-needed" CXX_LINKER_HAS_no_as_needed)
0091 set(CMAKE_CXX_LINK_LIBRARY_USING_NO_AS_NEEDED_SUPPORTED TRUE)
0092 set(CMAKE_CXX_LINK_LIBRARY_USING_NO_AS_NEEDED
0093     "LINKER:--push-state,--no-as-needed" "<LINK_ITEM>" "LINKER:--pop-state")
0094 
0095 # Export compile commands as json for run-clang-tidy
0096 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
0097 
0098 # This PROJECT_SOURCE_DIR at this point corresponds to repository root. Saving
0099 # it as EICRECON_SOURCE_DIR so can be used for jana_plugin.cmake to correctly
0100 # set plugin includes (and in other places as needed)
0101 set(EICRECON_SOURCE_DIR ${PROJECT_SOURCE_DIR})
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 # Enable -fPIC for all targets
0120 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
0121 
0122 # Install to the top directory by default
0123 if(${CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT})
0124   set(CMAKE_INSTALL_PREFIX
0125       ${CMAKE_SOURCE_DIR}
0126       CACHE PATH "Install in top directory by default" FORCE)
0127 endif()
0128 
0129 # Install to standard location
0130 include(GNUInstallDirs)
0131 
0132 # Default plugins installation directory is 'plugins'
0133 if(NOT DEFINED PLUGIN_OUTPUT_DIRECTORY)
0134   set(PLUGIN_OUTPUT_DIRECTORY "lib/${PROJECT_NAME}/plugins")
0135   message(STATUS "${CMAKE_PROJECT_NAME}: Set default PLUGIN_OUTPUT_DIRECTORY")
0136 endif()
0137 message(
0138   STATUS
0139     "${CMAKE_PROJECT_NAME}: PLUGIN_OUTPUT_DIRECTORY: ${PLUGIN_OUTPUT_DIRECTORY}"
0140 )
0141 
0142 # Default plugins static libraries installation directory is 'lib'
0143 if(NOT DEFINED PLUGIN_LIBRARY_OUTPUT_DIRECTORY)
0144   set(PLUGIN_LIBRARY_OUTPUT_DIRECTORY "lib")
0145   message(STATUS "${CMAKE_PROJECT_NAME}: Set default PLUGIN_OUTPUT_DIRECTORY")
0146 endif()
0147 message(
0148   STATUS
0149     "${CMAKE_PROJECT_NAME}: PLUGIN_LIBRARY_OUTPUT_DIRECTORY: ${PLUGIN_LIBRARY_OUTPUT_DIRECTORY}"
0150 )
0151 
0152 # Use, i.e. don't skip the full RPATH for the build tree, and use relative paths
0153 # for relocatable build products
0154 set(CMAKE_SKIP_BUILD_RPATH FALSE)
0155 set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE)
0156 
0157 # When building, don't use the install RPATH already (but later on when
0158 # installing)
0159 set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
0160 set(CMAKE_SKIP_INSTALL_RPATH FALSE)
0161 set(CMAKE_INSTALL_RPATH
0162     "${CMAKE_INSTALL_PREFIX}/${PLUGIN_LIBRARY_OUTPUT_DIRECTORY};${CMAKE_INSTALL_PREFIX}/${PLUGIN_OUTPUT_DIRECTORY}"
0163 )
0164 
0165 # Add the automatically determined parts of the RPATH which point to directories
0166 # outside the build tree to the install RPATH
0167 set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
0168 
0169 # Check and print what JANA2 is used
0170 find_package(JANA ${JANA_VERSION_MIN} REQUIRED)
0171 message(STATUS "${CMAKE_PROJECT_NAME}: JANA2 CMake   : ${JANA_DIR}")
0172 message(STATUS "${CMAKE_PROJECT_NAME}: JANA2 includes: ${JANA_INCLUDE_DIR}")
0173 message(STATUS "${CMAKE_PROJECT_NAME}: JANA2 library : ${JANA_LIBRARY}")
0174 
0175 # Algorithms
0176 find_package(algorithms ${algorithms_VERSION_MIN} REQUIRED Core)
0177 
0178 # PODIO, EDM4HEP, EDM4EIC event models
0179 find_package(Eigen3 ${Eigen3_VERSION_MIN} REQUIRED)
0180 find_package(podio ${podio_VERSION_MIN} QUIET)
0181 if(NOT podio_FOUND)
0182   find_package(podio 1.0 REQUIRED)
0183 endif()
0184 find_package(EDM4HEP ${EDM4HEP_VERSION_MIN} REQUIRED)
0185 find_package(EDM4EIC ${EDM4EIC_VERSION_MIN} REQUIRED)
0186 
0187 # fmt
0188 find_package(fmt ${fmt_VERSION_MIN} REQUIRED)
0189 
0190 # spdlog
0191 find_package(spdlog ${spdlog_VERSION_MIN} REQUIRED)
0192 
0193 # Guidelines Support Library
0194 find_package(Microsoft.GSL CONFIG)
0195 
0196 # Remove PODIO_JSON_OUTPUT (ref: https://github.com/AIDASoft/podio/issues/475)
0197 get_target_property(EDM4HEP_INTERFACE_COMPILE_DEFINITIONS EDM4HEP::edm4hep
0198                     INTERFACE_COMPILE_DEFINITIONS)
0199 if(EDM4HEP_INTERFACE_COMPILE_DEFINITIONS)
0200   list(FILTER EDM4HEP_INTERFACE_COMPILE_DEFINITIONS EXCLUDE REGEX
0201        [[^PODIO_JSON_OUTPUT$]])
0202   set_property(
0203     TARGET EDM4HEP::edm4hep PROPERTY INTERFACE_COMPILE_DEFINITIONS
0204                                      ${EDM4HEP_INTERFACE_COMPILE_DEFINITIONS})
0205 endif()
0206 get_target_property(EDM4EIC_INTERFACE_COMPILE_DEFINITIONS EDM4EIC::edm4eic
0207                     INTERFACE_COMPILE_DEFINITIONS)
0208 if(EDM4EIC_INTERFACE_COMPILE_DEFINITIONS)
0209   list(FILTER EDM4EIC_INTERFACE_COMPILE_DEFINITIONS EXCLUDE REGEX
0210        [[^PODIO_JSON_OUTPUT$]])
0211   set_property(
0212     TARGET EDM4EIC::edm4eic PROPERTY INTERFACE_COMPILE_DEFINITIONS
0213                                      ${EDM4EIC_INTERFACE_COMPILE_DEFINITIONS})
0214 endif()
0215 
0216 # DD4Hep is required for the most of the part
0217 find_package(DD4hep ${DD4hep_VERSION_MIN} REQUIRED)
0218 
0219 # ACTS cmake-lint: disable=C0103
0220 find_package(Acts REQUIRED COMPONENTS Core PluginDD4hep PluginJson)
0221 set(Acts_VERSION
0222     "${Acts_VERSION_MAJOR}.${Acts_VERSION_MINOR}.${Acts_VERSION_PATCH}")
0223 if(${Acts_VERSION} VERSION_LESS ${Acts_VERSION_MIN})
0224   message(
0225     FATAL_ERROR
0226       "Acts version ${Acts_VERSION_MIN} or higher required, but ${Acts_VERSION} found"
0227   )
0228 endif()
0229 if(${Acts_VERSION} VERSION_GREATER_EQUAL "43.0.0")
0230   set(Acts_NAMESPACE_PREFIX Acts::)
0231 else()
0232   set(Acts_NAMESPACE_PREFIX Acts)
0233 endif()
0234 # Acts::Core
0235 get_target_property(ACTS_COMPILE_FEATURES ${Acts_NAMESPACE_PREFIX}Core
0236                     INTERFACE_COMPILE_FEATURES)
0237 if(NOT "cxx_std_${CMAKE_CXX_STANDARD}" IN_LIST ACTS_COMPILE_FEATURES)
0238   message(
0239     WARNING
0240       "Acts has not been built with the requested C++ standard ${CMAKE_CXX_STANDARD}."
0241   )
0242 endif()
0243 
0244 # ROOT
0245 find_package(ROOT ${ROOT_VERSION_MIN} REQUIRED)
0246 # Check that ROOT is compiled with a modern enough c++ standard
0247 get_target_property(ROOT_COMPILE_FEATURES ROOT::Core INTERFACE_COMPILE_FEATURES)
0248 if(NOT "cxx_std_${CMAKE_CXX_STANDARD}" IN_LIST ROOT_COMPILE_FEATURES)
0249   message(
0250     WARNING
0251       "ROOT has not been built with the requested C++ standard ${CMAKE_CXX_STANDARD}."
0252   )
0253 endif()
0254 
0255 # ONNX Runtime
0256 find_package(onnxruntime ${onnxruntime_MIN_VERSION} CONFIG)
0257 
0258 # Add CMake additional functionality:
0259 include(cmake/jana_plugin.cmake) # Add common settings for plugins
0260 list(APPEND CMAKE_MODULE_PATH ${EICRECON_SOURCE_DIR}/cmake
0261 )# Find Find<Modules>.cmake
0262 
0263 enable_testing()
0264 
0265 # Address sanitizer
0266 option(USE_ASAN "Compile with address sanitizer" OFF)
0267 if(${USE_ASAN})
0268   add_compile_options(-fsanitize=address -fno-omit-frame-pointer -g -O1)
0269   add_link_options(-fsanitize=address)
0270   install(FILES .github/asan.supp .github/lsan.supp
0271           DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME})
0272 endif()
0273 
0274 # Thread sanitizer
0275 option(USE_TSAN "Compile with thread sanitizer" OFF)
0276 if(${USE_TSAN})
0277   add_compile_options(-fsanitize=thread -g -O1)
0278   add_link_options(-fsanitize=thread)
0279   install(FILES .github/tsan.supp
0280           DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME})
0281 endif()
0282 
0283 # Undefined behavior sanitizer
0284 option(USE_UBSAN "Compile with undefined behavior sanitizer" OFF)
0285 if(${USE_UBSAN})
0286   foreach(sanitizer undefined float-divide-by-zero unsigned-integer-overflow
0287                     implicit-conversion local-bounds nullability)
0288     check_cxx_compiler_flag("-fsanitize=${sanitizer}"
0289                             CXX_COMPILER_HAS_sanitize_${sanitizer})
0290     if(CXX_COMPILER_HAS_sanitize_${sanitizer})
0291       add_compile_options(-fsanitize=${sanitizer})
0292       add_link_options(-fsanitize=${sanitizer})
0293     endif()
0294   endforeach()
0295   add_compile_options(-g -O1)
0296   install(FILES .github/ubsan.supp
0297           DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME})
0298 endif()
0299 
0300 # Compress debug symbols if supported
0301 check_cxx_compiler_flag("-gz" CXX_COMPILER_HAS_gz)
0302 if(CXX_COMPILER_HAS_gz)
0303   set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -gz")
0304   set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -gz")
0305 endif()
0306 
0307 add_subdirectory(src/services)
0308 add_subdirectory(src/algorithms)
0309 add_subdirectory(src/benchmarks)
0310 add_subdirectory(src/detectors)
0311 add_subdirectory(src/extensions)
0312 add_subdirectory(src/factories)
0313 add_subdirectory(src/global)
0314 add_subdirectory(src/scripts)
0315 add_subdirectory(src/tests)
0316 add_subdirectory(src/utilities)
0317 
0318 # Install all cmake helpers
0319 include(CMakePackageConfigHelpers)
0320 configure_package_config_file(
0321   cmake/${PROJECT_NAME}Config.cmake.in
0322   ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}Config.cmake
0323   INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
0324 write_basic_package_version_file(
0325   ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}ConfigVersion.cmake
0326   VERSION ${CMAKE_PROJECT_VERSION}
0327   COMPATIBILITY SameMajorVersion)
0328 install(
0329   FILES ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}Config.cmake
0330         ${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}ConfigVersion.cmake
0331   DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
0332 install(
0333   EXPORT ${PROJECT_NAME}Targets
0334   NAMESPACE ${PROJECT_NAME}::
0335   DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
0336 install(
0337   DIRECTORY cmake/
0338   DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
0339   FILES_MATCHING
0340   PATTERN *.cmake)