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.1.3
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_EXPORT "Be able to 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
0114 ${PROJECT_SOURCE_DIR}/source/DigitizedHit.cc
0115 ${PROJECT_SOURCE_DIR}/source/GeantImport.cc
0116 #${PROJECT_SOURCE_DIR}/source/Configuration.cc
0117 ${PROJECT_SOURCE_DIR}/source/Calibration.cc
0118 ${PROJECT_SOURCE_DIR}/source/Digitization.cc
0119 ${PROJECT_SOURCE_DIR}/source/ReconstructionFactory.cc
0120 )
0121 if(IRT_ROOT_IO)
0122 set(IRT_DICT G__${CMAKE_PROJECT_NAME})
0123 list(APPEND IRT_SRC ${IRT_DICT}.cxx)
0124 endif()
0125
0126 # library target
0127 add_library(${CMAKE_PROJECT_NAME} SHARED ${IRT_SRC} )
0128 target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE -Wall -Wno-misleading-indentation)
0129 if(NOT IRT_ROOT_IO)
0130 # disable calling of `ClassDef` etc. if not generating ROOT dictionary
0131 message(STATUS "NOTE: disabling ROOT dictionary generation")
0132 target_compile_definitions(${CMAKE_PROJECT_NAME} PUBLIC DISABLE_ROOT_IO)
0133 endif()
0134 IF(JSON_EXPORT)
0135 message(STATUS "NOTE: JSON_EXPORT enabled")
0136 set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DJSON_EXPORT")
0137 find_package(nlohmann_json 3.11.3 REQUIRED)
0138 ENDIF()
0139 target_include_directories(${CMAKE_PROJECT_NAME} PUBLIC
0140 $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
0141 $<INSTALL_INTERFACE:include>
0142 )
0143
0144 # ROOT I/O dictionary generation
0145 if(IRT_ROOT_IO)
0146 set(IRT_ROOTMAP
0147 ${CMAKE_CURRENT_BINARY_DIR}/lib${CMAKE_PROJECT_NAME}_rdict.pcm
0148 ${CMAKE_CURRENT_BINARY_DIR}/lib${CMAKE_PROJECT_NAME}.rootmap
0149 )
0150 root_generate_dictionary(${IRT_DICT} ${HEADERS} LINKDEF include/irtLinkDef.h)
0151 endif()
0152
0153 # linking
0154 if(JSON_EXPORT)
0155 target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC ROOT::Core ROOT::EG ROOT::Hist ROOT::RIO ROOT::MathCore ROOT::Tree PRIVATE nlohmann_json::nlohmann_json)
0156 else()
0157 target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC ROOT::Core ROOT::EG ROOT::Hist ROOT::RIO ROOT::MathCore ROOT::Tree)
0158 endif()
0159 #----------------------------------------------------------------------------
0160 # optional targets
0161
0162 if(EVALUATION)
0163 add_subdirectory(evaluation)
0164 endif()
0165
0166 if(DELPHES)
0167 add_subdirectory(delphes)
0168 endif()
0169
0170 #----------------------------------------------------------------------------
0171 # installation
0172
0173 install(FILES
0174 ${HEADERS}
0175 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${CMAKE_PROJECT_NAME}
0176 )
0177 install(TARGETS ${CMAKE_PROJECT_NAME}
0178 EXPORT ${CMAKE_PROJECT_NAME}Targets
0179 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
0180 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
0181 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
0182 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${CMAKE_PROJECT_NAME}
0183 )
0184 if(IRT_ROOT_IO)
0185 install(FILES
0186 ${IRT_ROOTMAP}
0187 DESTINATION ${CMAKE_INSTALL_LIBDIR}
0188 )
0189 endif()
0190
0191 #----------------------------------------------------------------------------
0192 # package config
0193
0194 include(CMakePackageConfigHelpers)
0195
0196 install(EXPORT ${CMAKE_PROJECT_NAME}Targets
0197 FILE ${CMAKE_PROJECT_NAME}Targets.cmake
0198 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME}
0199 )
0200
0201 set(TARGETS_INSTALL_PATH ${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME}/${CMAKE_PROJECT_NAME}Targets.cmake)
0202
0203 configure_package_config_file(
0204 cmake/${CMAKE_PROJECT_NAME}Config.cmake.in
0205 ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake
0206 INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME}
0207 PATH_VARS CMAKE_INSTALL_INCLUDEDIR CMAKE_INSTALL_LIBDIR TARGETS_INSTALL_PATH
0208 )
0209
0210 write_basic_package_version_file(
0211 "${CMAKE_PROJECT_NAME}ConfigVersion.cmake"
0212 VERSION ${VERSION}
0213 COMPATIBILITY SameMajorVersion
0214 )
0215
0216 install(FILES
0217 ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}Config.cmake
0218 ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}ConfigVersion.cmake
0219 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME}
0220 )
0221