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