Warning, /EDM4eic/CMakeLists.txt is written in an unsupported language. File is not indexed.
0001 # SPDX-License-Identifier: LGPL-3.0-or-later
0002 # Copyright (C) 2022 Whitney Armstrong, Sylvester Joosten, Wouter Deconinck
0003
0004 cmake_minimum_required(VERSION 3.12)
0005
0006 project(EDM4EIC
0007 LANGUAGES CXX)
0008
0009 SET( ${PROJECT_NAME}_VERSION_MAJOR 8 )
0010 SET( ${PROJECT_NAME}_VERSION_MINOR 10 )
0011 SET( ${PROJECT_NAME}_VERSION_PATCH 0 )
0012 SET( ${PROJECT_NAME}_VERSION "${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR}.${${PROJECT_NAME}_VERSION_PATCH}" )
0013
0014 # Verify that schema version in edm4eic.yaml matches project version
0015 # Schema version is defined as 10000*major + 100*minor + patch
0016 # (two digits per component, so each component may range from 0 to 99)
0017 file(READ "${CMAKE_CURRENT_SOURCE_DIR}/edm4eic.yaml" EDM4EIC_YAML_CONTENT)
0018 string(REGEX MATCH "schema_version:[ \t]*([0-9]+)" SCHEMA_VERSION_MATCH "${EDM4EIC_YAML_CONTENT}")
0019 if(SCHEMA_VERSION_MATCH)
0020 set(SCHEMA_VERSION ${CMAKE_MATCH_1})
0021 math(EXPR EXPECTED_SCHEMA_VERSION "${${PROJECT_NAME}_VERSION_MAJOR} * 10000 + ${${PROJECT_NAME}_VERSION_MINOR} * 100 + ${${PROJECT_NAME}_VERSION_PATCH}")
0022 if(NOT SCHEMA_VERSION EQUAL EXPECTED_SCHEMA_VERSION)
0023 message(FATAL_ERROR
0024 "Schema version mismatch: edm4eic.yaml has schema_version=${SCHEMA_VERSION}, "
0025 "but CMakeLists.txt version ${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR}.${${PROJECT_NAME}_VERSION_PATCH} "
0026 "requires schema_version=${EXPECTED_SCHEMA_VERSION}. "
0027 "Please update schema_version in edm4eic.yaml to match the project version.")
0028 endif()
0029 else()
0030 message(WARNING "Could not find schema_version in edm4eic.yaml")
0031 endif()
0032
0033 # C++ standard
0034 set(CMAKE_CXX_STANDARD_MIN 20)
0035 set(CMAKE_CXX_STANDARD 20 CACHE STRING "Set the C++ standard to be used")
0036 if(CMAKE_CXX_STANDARD LESS CMAKE_CXX_STANDARD_MIN)
0037 message(
0038 FATAL_ERROR
0039 "Unsupported C++ standard: ${CMAKE_CXX_STANDARD} (at least ${CMAKE_CXX_STANDARD_MIN} required)"
0040 )
0041 endif()
0042 set(CMAKE_CXX_STANDARD_REQUIRED ON)
0043 set(CMAKE_CXX_EXTENSIONS OFF)
0044
0045 #--- Declare options -----------------------------------------------------------
0046 option(BUILD_DATA_MODEL "Run podio class generator yaml file" ON)
0047
0048 if(APPLE)
0049 set(CMAKE_SHARED_LIBRARY_SUFFIX ".so")
0050 endif(APPLE)
0051
0052 include(GNUInstallDirs)
0053
0054 include(CTest)
0055
0056 # podio has SameMajorVersion compatibility
0057 find_package(podio 1.2 REQUIRED)
0058 include_directories(${podio_INCLUDE_DIR})
0059
0060 # EDM4hep has SameMajorVersion compatibility so we try to find 1.0 first and
0061 # fall back to the minimum version in case we canot find that
0062 find_package(EDM4HEP 1.0)
0063 if (NOT EDM4HEP_FOUND)
0064 find_package(EDM4HEP 0.10.3 REQUIRED)
0065 endif()
0066
0067 list(APPEND CMAKE_PREFIX_PATH $ENV{ROOTSYS})
0068 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
0069 find_package(ROOT 6 REQUIRED COMPONENTS Core RIO Tree)
0070 include(${ROOT_USE_FILE})
0071
0072 PODIO_GENERATE_DATAMODEL(edm4eic edm4eic.yaml headers sources
0073 UPSTREAM_EDM edm4hep:${EDM4HEP_DATA_DIR}/edm4hep.yaml
0074 IO_BACKEND_HANDLERS ${PODIO_IO_HANDLERS}
0075 OUTPUT_FOLDER ${CMAKE_CURRENT_BINARY_DIR}
0076 )
0077
0078 PODIO_ADD_DATAMODEL_CORE_LIB(edm4eic "${headers}" "${sources}"
0079 OUTPUT_FOLDER ${CMAKE_CURRENT_BINARY_DIR}
0080 )
0081 # It's our responsibility to link to upstream datamodel
0082 target_link_libraries(edm4eic PUBLIC EDM4HEP::edm4hep)
0083
0084 PODIO_ADD_ROOT_IO_DICT(edm4eicDict edm4eic "${headers}" src/selection.xml
0085 OUTPUT_FOLDER ${CMAKE_CURRENT_BINARY_DIR}
0086 )
0087
0088 if(TARGET edm4eicDict)
0089 add_library(edm4eic::edm4eicDict ALIAS edm4eicDict)
0090 endif()
0091
0092 add_subdirectory(utils)
0093 add_subdirectory(test)
0094
0095 list(APPEND EDM4EIC_INSTALL_LIBS edm4eic)
0096 if(TARGET edm4eicDict)
0097 list(APPEND EDM4EIC_INSTALL_LIBS edm4eicDict)
0098 endif()
0099
0100 if(PODIO_ENABLE_ARROW)
0101 PODIO_ADD_ARROW(edm4eic "${headers}" "${sources}")
0102 message(STATUS "Building and installing the Arrow component since podio supports it")
0103 add_library(EDM4EIC::edm4eicPodioArrow ALIAS edm4eicPodioArrow)
0104 list(APPEND EDM4EIC_INSTALL_LIBS edm4eicPodioArrow)
0105 endif()
0106
0107 install(TARGETS ${EDM4EIC_INSTALL_LIBS}
0108 EXPORT ${PROJECT_NAME}Targets
0109 RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
0110 LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib
0111 PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/edm4eic"
0112 COMPONENT dev)
0113
0114 if(TARGET edm4eicDict)
0115 install(FILES
0116 "${PROJECT_BINARY_DIR}/edm4eicDictDict.rootmap"
0117 DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT dev)
0118 endif()
0119
0120 install(FILES
0121 edm4eic.yaml
0122 DESTINATION "${CMAKE_INSTALL_DATADIR}/edm4eic" COMPONENT dev)
0123
0124 if(TARGET edm4eicDict)
0125 install(FILES
0126 "${PROJECT_BINARY_DIR}/libedm4eicDict_rdict.pcm"
0127 DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT dev)
0128 endif()
0129
0130 # -------------------------
0131 # install class documentation
0132
0133 file(RELATIVE_PATH CMAKE_CURRENT_BINARY_RELATIVE_DIR
0134 ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
0135 configure_file(
0136 ${CMAKE_SOURCE_DIR}/docs/Doxyfile.in
0137 ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
0138 @ONLY)
0139
0140 option(GENERATE_DOCS "Generate the doxygen base API reference" ON)
0141
0142 if (GENERATE_DOCS)
0143 find_package(Doxygen COMPONENTS dot)
0144 if(DOXYGEN_FOUND)
0145 add_custom_target(docs ALL
0146 DEPENDS edm4eic.yaml ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
0147 COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
0148 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
0149 COMMENT "Generating API documentation with Doxygen"
0150 VERBATIM)
0151 else()
0152 message(STATUS "Doxygen not found; no documentation will be built.")
0153 endif()
0154 endif()
0155
0156 # -------------------------
0157 # add version files
0158
0159 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/EDM4eicVersion.h.in
0160 ${CMAKE_CURRENT_BINARY_DIR}/EDM4eicVersion.h )
0161 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/EDM4eicVersion.h
0162 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/edm4eic )
0163
0164 # -------------------------
0165 # install library config
0166 include(CMakePackageConfigHelpers)
0167
0168 # Install and export targets
0169 install(EXPORT ${PROJECT_NAME}Targets
0170 FILE ${PROJECT_NAME}Targets.cmake
0171 NAMESPACE ${PROJECT_NAME}::
0172 DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
0173 )
0174
0175 set(TARGETS_INSTALL_PATH "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}/${PROJECT_NAME}Targets.cmake")
0176
0177 configure_package_config_file(
0178 cmake/${PROJECT_NAME}Config.cmake.in
0179 ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
0180 INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
0181 PATH_VARS TARGETS_INSTALL_PATH
0182 )
0183
0184 write_basic_package_version_file(
0185 ${PROJECT_NAME}ConfigVersion.cmake
0186 VERSION ${${PROJECT_NAME}_VERSION}
0187 COMPATIBILITY AnyNewerVersion
0188 )
0189
0190 install(FILES
0191 ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
0192 ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
0193 DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
0194 )