Back to home page

EIC code displayed by LXR

 
 

    


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

0001 cmake_minimum_required(VERSION 3.10.0 FATAL_ERROR)
0002 
0003 project(IRT2
0004   VERSION 2.2.0
0005   LANGUAGES CXX
0006 )
0007 
0008 cmake_policy(SET CMP0079 NEW) # allow `target_link_libraries` from any dir
0009 
0010 #----------------------------------------------------------------------------
0011 # options
0012 option(EVALUATION  "Build evaluation programs"                                   OFF)
0013 option(DELPHES     "Delphes card production"                                      ON)
0014 option(IRT_ROOT_IO "Generate dictionary for ROOT I/O of libIRT objects"           ON)
0015 option(JSON_IMPORT_EXPORT "Be able to import/export calibrations in JSON format" OFF)
0016 
0017 # Sanitizer options (TSAN is mutually exclusive with ASAN/UBSAN)
0018 include(CMakeDependentOption)
0019 option(USE_TSAN "Enable Thread Sanitizer" OFF)
0020 cmake_dependent_option(USE_ASAN "Enable Address Sanitizer" OFF "NOT USE_TSAN" OFF)
0021 cmake_dependent_option(USE_UBSAN "Enable Undefined Behavior Sanitizer" OFF "NOT USE_TSAN" OFF)
0022 
0023 # Export compile commands as json for run-clang-tidy
0024 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
0025 
0026 #----------------------------------------------------------------------------
0027 # dependencies
0028 
0029 list(APPEND CMAKE_PREFIX_PATH $ENV{ROOTSYS})
0030 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
0031 find_package(ROOT 6 REQUIRED COMPONENTS Core EG Hist MathCore RIO Tree)
0032 include(${ROOT_USE_FILE})
0033 
0034 #----------------------------------------------------------------------------
0035 # flags
0036 
0037 include(GNUInstallDirs) # standard GNU installation
0038 include(CheckCXXCompilerFlag)
0039 
0040 set(CMAKE_CXX_FLAGS "-std=c++0x")
0041 
0042 check_cxx_compiler_flag(-std=c++17 HAVE_FLAG_STD_CXX17)
0043 if(HAVE_FLAG_STD_CXX17)
0044   # Have -std=c++17, use it;    
0045   set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
0046 else()
0047   check_cxx_compiler_flag(-std=c++11 HAVE_FLAG_STD_CXX11)
0048   if(HAVE_FLAG_STD_CXX11)
0049     # Have -std=c++11, use it;  
0050     set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
0051   endif()
0052 endif()
0053 
0054 set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-vla-cxx-extension")
0055     
0056 # Thread Sanitizer
0057 if(USE_TSAN)
0058   message(STATUS "Building with Thread Sanitizer enabled")
0059   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -g -O1 -fno-omit-frame-pointer")
0060   set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread")
0061   set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=thread")
0062 endif()
0063 
0064 # Address Sanitizer
0065 if(USE_ASAN)
0066   message(STATUS "Building with Address Sanitizer enabled")
0067   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -g -O1 -fno-omit-frame-pointer")
0068   set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
0069   set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address")
0070 endif()
0071 
0072 # Undefined Behavior Sanitizer
0073 if(USE_UBSAN)
0074   message(STATUS "Building with Undefined Behavior Sanitizer enabled")
0075   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -g -O1 -fno-omit-frame-pointer")
0076   set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined")
0077   set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=undefined")
0078 endif()
0079 
0080 #----------------------------------------------------------------------------
0081 # IRT library
0082 
0083 # headers
0084 include_directories(
0085   ${PROJECT_SOURCE_DIR}/include 
0086   ${ROOT_INCLUDE_DIRS}
0087 
0088   # For now assume that newly installed edm4eic::(CherenkovPID, ...) event structures are available 
0089   # in the same place where IRT is supposed to be installed;
0090   ${CMAKE_INSTALL_PREFIX}/include
0091 )
0092 file(GLOB HEADERS ${PROJECT_SOURCE_DIR}/include/*.h)
0093 list(FILTER HEADERS EXCLUDE REGEX "LinkDef\\.h$")
0094 
0095 #if(DEFINED EICRECON)
0096 #   set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEICRECON")
0097 #endif()
0098 
0099 # sources
0100 set(IRT_SRC
0101   ${PROJECT_SOURCE_DIR}/source/CherenkovDetector.cc
0102   ${PROJECT_SOURCE_DIR}/source/CherenkovDetectorCollection.cc
0103   
0104   ${PROJECT_SOURCE_DIR}/source/ParametricSurface.cc
0105   ${PROJECT_SOURCE_DIR}/source/SphericalSurface.cc
0106   ${PROJECT_SOURCE_DIR}/source/ToricSurface.cc
0107   ${PROJECT_SOURCE_DIR}/source/CylindricalSurface.cc
0108   ${PROJECT_SOURCE_DIR}/source/ConicalSurface.cc
0109   ${PROJECT_SOURCE_DIR}/source/FlatSurface.cc
0110   ${PROJECT_SOURCE_DIR}/source/IRT.cc
0111   ${PROJECT_SOURCE_DIR}/source/ChargedParticle.cc
0112   ${PROJECT_SOURCE_DIR}/source/CherenkovRadiator.cc
0113   ${PROJECT_SOURCE_DIR}/source/DataInterpolation.cc
0114 
0115   ${PROJECT_SOURCE_DIR}/source/DigitizedHit.cc
0116   ${PROJECT_SOURCE_DIR}/source/GeantImport.cc
0117   #${PROJECT_SOURCE_DIR}/source/Configuration.cc
0118   ${PROJECT_SOURCE_DIR}/source/Calibration.cc
0119   ${PROJECT_SOURCE_DIR}/source/Digitization.cc
0120   ${PROJECT_SOURCE_DIR}/source/ReconstructionFactory.cc
0121 )
0122 if(IRT_ROOT_IO)
0123   set(IRT_DICT G__${CMAKE_PROJECT_NAME})
0124   list(APPEND IRT_SRC ${IRT_DICT}.cxx)
0125 endif()
0126 
0127 # library target
0128 add_library(${CMAKE_PROJECT_NAME} SHARED ${IRT_SRC} )
0129 target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE -Wall -Wno-misleading-indentation)
0130 if(NOT IRT_ROOT_IO)
0131   # disable calling of `ClassDef` etc. if not generating ROOT dictionary
0132   message(STATUS "NOTE: disabling ROOT dictionary generation")
0133   target_compile_definitions(${CMAKE_PROJECT_NAME} PUBLIC DISABLE_ROOT_IO)
0134 endif()
0135 IF(JSON_IMPORT_EXPORT)
0136   message(STATUS "NOTE: JSON_IMPORT_EXPORT enabled")
0137   set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DJSON_IMPORT_EXPORT")
0138   find_package(nlohmann_json 3.11.2 REQUIRED)
0139 ENDIF()
0140 target_include_directories(${CMAKE_PROJECT_NAME} PUBLIC
0141   $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
0142   $<INSTALL_INTERFACE:include>
0143 )
0144 
0145 # ROOT I/O dictionary generation
0146 if(IRT_ROOT_IO)
0147   set(IRT_ROOTMAP
0148     ${CMAKE_CURRENT_BINARY_DIR}/lib${CMAKE_PROJECT_NAME}_rdict.pcm
0149     ${CMAKE_CURRENT_BINARY_DIR}/lib${CMAKE_PROJECT_NAME}.rootmap
0150   )
0151   if(JSON_IMPORT_EXPORT)
0152     root_generate_dictionary(${IRT_DICT} ${HEADERS} LINKDEF include/irtLinkDef.h OPTIONS -DJSON_IMPORT_EXPORT)
0153   else()
0154     root_generate_dictionary(${IRT_DICT} ${HEADERS} LINKDEF include/irtLinkDef.h)
0155   endif()
0156 endif()
0157 
0158 # linking
0159 if(JSON_IMPORT_EXPORT)
0160   target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC ROOT::Core ROOT::EG ROOT::Hist ROOT::RIO ROOT::MathCore ROOT::Tree PRIVATE nlohmann_json::nlohmann_json)
0161 else()
0162   target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC ROOT::Core ROOT::EG ROOT::Hist ROOT::RIO ROOT::MathCore ROOT::Tree)
0163 endif()
0164 #----------------------------------------------------------------------------
0165 # optional targets
0166 
0167 if(EVALUATION)
0168   add_subdirectory(evaluation)
0169 endif()
0170 
0171 if(DELPHES)
0172   add_subdirectory(delphes)
0173 endif()
0174 
0175 #----------------------------------------------------------------------------
0176 # installation
0177 
0178 install(FILES
0179   ${HEADERS}
0180   DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${CMAKE_PROJECT_NAME}
0181 )
0182 install(TARGETS ${CMAKE_PROJECT_NAME}
0183   EXPORT ${CMAKE_PROJECT_NAME}Targets
0184   LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
0185   ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
0186   RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
0187   INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${CMAKE_PROJECT_NAME}
0188 )
0189 if(IRT_ROOT_IO)
0190   install(FILES
0191     ${IRT_ROOTMAP}
0192     DESTINATION ${CMAKE_INSTALL_LIBDIR}
0193   )
0194 endif()
0195 
0196 #----------------------------------------------------------------------------
0197 # package config
0198 
0199 include(CMakePackageConfigHelpers)
0200 
0201 install(EXPORT ${CMAKE_PROJECT_NAME}Targets
0202   FILE ${CMAKE_PROJECT_NAME}Targets.cmake
0203   DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME}
0204 )
0205 
0206 set(TARGETS_INSTALL_PATH ${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME}/${CMAKE_PROJECT_NAME}Targets.cmake)
0207 
0208 configure_package_config_file(
0209   cmake/${CMAKE_PROJECT_NAME}Config.cmake.in
0210   ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake
0211   INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME}
0212   PATH_VARS CMAKE_INSTALL_INCLUDEDIR CMAKE_INSTALL_LIBDIR TARGETS_INSTALL_PATH
0213 )
0214 
0215 write_basic_package_version_file(
0216   "${CMAKE_PROJECT_NAME}ConfigVersion.cmake"
0217   VERSION ${VERSION}
0218   COMPATIBILITY SameMajorVersion
0219 )
0220 
0221 install(FILES
0222   ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake
0223   ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}ConfigVersion.cmake
0224   DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME}
0225 )
0226