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