#---------------------------------------------------------------------------- # Setup the project cmake_minimum_required(VERSION 3.0 FATAL_ERROR) project(KM3Sim) if (NOT CMAKE_VERSION VERSION_LESS 3.8) set(CMAKE_CXX_STANDARD 17) endif() #---------------------------------------------------------------------------- # Find Geant4 package, activating all available Vis drivers by default # You can set WITH_GEANT4_VIS to OFF via the command line or ccmake/cmake-gui # to build a batch mode only executable # option(WITH_GEANT4_VIS "Build example with Geant4 Vis drivers" ON) if(WITH_GEANT4_VIS) find_package(Geant4 REQUIRED gdml ui_all vis_all) else() find_package(Geant4 REQUIRED gdml) endif() include(${Geant4_USE_FILE}) #---------------------------------------------------------------------------- # Find ROOT (required package) # find_package(ROOT REQUIRED COMPONENTS EG) message(STATUS "Found ROOT version: ${ROOT_VERSION}") if("${ROOT_INCLUDE_DIR}" STREQUAL "") message(STATUS "Empty root include directory, append $ROOTSYS/include") SET(ROOT_INCLUDE_DIR "${ROOT_INCLUDE_DIR} $ENV{ROOTSYS}/include") endif() message(STATUS "ROOT include directories ${ROOT_INCLUDE_DIR}") #---------------------------------------------------------------------------- # Find BOOST (required package) # find_package(Boost REQUIRED COMPONENTS program_options) #---------------------------------------------------------------------------- # Find Xerces (required package) # IF(DEFINED ENV{XERCESROOT}) set(XERCESCROOT "$ENV{XERCESROOT}") ENDIF() IF(DEFINED ENV{XERCES_DIR}) set(XERCESCROOT "$ENV{XERCES_DIR}") ENDIF() IF(DEFINED XERCESCROOT) message(STATUS "XERCESROOT defined: ${XERCESCROOT}") set(XercesC_LIBRARY "${XERCESCROOT}/lib") set(XercesC_INCLUDE_DIR "${XERCESCROOT}/include") link_directories("${XERCESCROOT}/lib") include_directories(${XERCESCROOT}/include) ENDIF() find_package(XercesC REQUIRED) #---------------------------------------------------------------------------- # KM3NeT dataformat definitions # # Check if KM3net dataformat is built. If not, built it. set(DATAFORMAT_DIR "${PROJECT_SOURCE_DIR}/externals/km3net-dataformat") if (NOT EXISTS "${DATAFORMAT_DIR}/lib") message(STATUS "Make km3net-dataformat") execute_process(COMMAND make WORKING_DIRECTORY ${DATAFORMAT_DIR}) message(STATUS "km3net-dataformat built") else() message(STATUS "km3net-dataformat already built.") endif() link_directories(${DATAFORMAT_DIR}/lib) # uuid needed for dataformat > v3.0.0 set(DATAFORMAT_LIBRARIES "KM3NeTROOT" "uuid") #---------------------------------------------------------------------------- # Catch headers (unit tests framework) # set(CATCH_DIR ${PROJECT_SOURCE_DIR}/externals) #---------------------------------------------------------------------------- # Locate sources and headers for this project # include_directories(${PROJECT_SOURCE_DIR}/include ${ROOT_INCLUDE_DIR} ${Geant4_INCLUDE_DIR} $ENV{BOOST_INCLUDE_PATH} ${DATAFORMAT_DIR}/offline ${DATAFORMAT_DIR}/online ${XERCESC_INCLUDE_DIR} ${CATCH_DIR}) file(GLOB sources ${PROJECT_SOURCE_DIR}/src/*.cc) file(GLOB headers ${PROJECT_SOURCE_DIR}/include/*.hh) #---------------------------------------------------------------------------- # Set the Project Flags # execute_process(COMMAND git --no-pager describe --tags --always OUTPUT_VARIABLE GIT_VERSION) execute_process(COMMAND date "+%y%m%d" OUTPUT_VARIABLE BUILD_DATE) string(STRIP "${BUILD_DATE}" BUILD_DATE) string(STRIP "${GIT_VERSION}" GIT_VERSION) add_definitions(-DGIT_VERSION="${GIT_VERSION}") add_definitions(-DBUILD_DATE="${BUILD_DATE}") add_definitions(-DG4DISABLE_PARAMETRIZATION) add_definitions(-DGEANT4_USE_SYSTEM_CLHEP=ON) #---------------------------------------------------------------------------- # Download GDML validation files # # Check if GDML_RESSOURCES_PATH already exist. If not, download GDML # validation schema files release and extract it. # The resulting directory path is stored for later source in # GDML_SOURCE_FILE. # set(GDML_SCHEMA_URL "http://cern.ch/service-spi/app/releases/GDML/downloads/GDML_3_1_6.tar.gz") set(GDML_RESSOURCES_PATH "${CMAKE_BINARY_DIR}/ressources/gdml/") set(GDML_SOURCE_FILE "${PROJECT_SOURCE_DIR}/source-gdml-schema.sh") if(NOT EXISTS "${GDML_RESSOURCES_PATH}") message(STATUS "GDML validation files will be download in: ${GDML_RESSOURCES_PATH}") get_filename_component(GDML_ARCHIVE ${GDML_SCHEMA_URL} NAME) get_filename_component(GDML_DIR ${GDML_SCHEMA_URL} NAME_WE) file(MAKE_DIRECTORY "${GDML_RESSOURCES_PATH}") file(DOWNLOAD "${GDML_SCHEMA_URL}" "${GDML_RESSOURCES_PATH}/${GDML_ARCHIVE}") if (CMAKE_VERSION VERSION_LESS 3.18) execute_process(COMMAND tar -xvf ${GDML_RESSOURCES_PATH}/${GDML_ARCHIVE} WORKING_DIRECTORY "${GDML_RESSOURCES_PATH}") else () # Quite cool but only available since cmake 3.18 file(ARCHIVE_EXTRACT INPUT "${GDML_RESSOURCES_PATH}/${GDML_ARCHIVE}" DESTINATION "${GDML_RESSOURCES_PATH}") endif() file(REMOVE "${GDML_RESSOURCES_PATH}/${GDML_ARCHIVE}") message(STATUS "GDML validation files available in: ${GDML_RESSOURCES_PATH}/${GDML_DIR}/schema/") write_file("${GDML_SOURCE_FILE}" "#!/bin/bash\n" "export GDML_SCHEMA_DIR=${GDML_RESSOURCES_PATH}/${GDML_DIR}/schema/") message(STATUS "GDML environement variable writen in: ${GDML_SOURCE_FILE}") else() message(STATUS "GDML schema validation files already present: ${GDML_RESSOURCES_PATH}") endif() #---------------------------------------------------------------------------- # List and copy the additional tools and files (e.g. script ) # to the build directory file(GLOB SCRIPT_FILES "${PROJECT_SOURCE_DIR}/scripts/*.py") message("Script found and added to build : ${SCRIPT_FILES}") #---------------------------------------------------------------------------- # Add the executable, and link it to the Geant4 libraries # If(NOT DEFINED MODE OR MODE STREQUAL "km3sim") add_executable(KM3Sim KM3Sim.cc ${sources} ${headers}) target_link_libraries(KM3Sim ${XercesC_LIBRARIES} ${Geant4_LIBRARIES} ${ROOT_LIBRARIES} ${Boost_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${DATAFORMAT_LIBRARIES}) install(TARGETS KM3Sim DESTINATION bin) file(COPY ${SCRIPT_FILES} DESTINATION "./") endif() if(NOT DEFINED MODE OR MODE STREQUAL "unittest") add_executable(RunTests tests/RunTests.cc ${tests} ${headers}) target_link_libraries(RunTests ${XercesC_LIBRARIES} ${Geant4_LIBRARIES} ${ROOT_LIBRARIES} ${Boost_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${DATAFORMAT_LIBRARIES}) endif()