diff --git a/cmake/modules/CbmMacros.cmake b/cmake/modules/CbmMacros.cmake index 82a6df610bb5124b81c4b218e333583086fd277f..ce3c4a74340aeaeefbdc133e1c4f0e52d1d03731 100644 --- a/cmake/modules/CbmMacros.cmake +++ b/cmake/modules/CbmMacros.cmake @@ -180,7 +180,7 @@ MACRO (GENERATE_CBM_TEST_SCRIPT SCRIPT_FULL_NAME DEST_DIR) set(my_script_name ${SCRIPT_FULL_NAME}) - configure_file(${FAIRROOTPATH}/share/fairbase/cmake/scripts/root_macro.sh.in + configure_file(${PROJECT_SOURCE_DIR}/cmake/scripts/root_macro.sh.in ${DEST_DIR}/${shell_script_name} ) diff --git a/cmake/modules/CheckCompiler.cmake b/cmake/modules/CheckCompiler.cmake new file mode 100644 index 0000000000000000000000000000000000000000..07c9c7d99289f3cb8423a56f0df149f495a159f1 --- /dev/null +++ b/cmake/modules/CheckCompiler.cmake @@ -0,0 +1,247 @@ + ################################################################################ + # Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # + # # + # This software is distributed under the terms of the # + # GNU Lesser General Public Licence (LGPL) version 3, # + # copied verbatim in the file "LICENSE" # + ################################################################################ +MACRO ( Check_Compiler ) + + +# Set a default build type for single-configuration +# CMake generators if no build type is set. +if (NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE RelWithDebInfo) +endif (NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) + +# Check for the existence of fairsoft-config +# This program only exist in newer versions of fairsoft. If the file exist extract information about +# the compiler and compiler flags used to install fairsoft. +# Compare compiler and compiler flags used to compile fairsoft with the compiler and flags used now +# In case of differences print a warning +Find_Program(FAIRSOFT_CONFIG fairsoft-config PATHS $ENV{SIMPATH}/bin $ENV{FAIRSOFT_ROOT}/bin NO_DEFAULT_PATH) + +If(FAIRSOFT_CONFIG) + Message(STATUS "fairsoft-config found") + Execute_Process(COMMAND ${FAIRSOFT_CONFIG} --cc + OUTPUT_VARIABLE FAIRSOFT_C_COMPILER) + Execute_Process(COMMAND ${FAIRSOFT_CONFIG} --cxx + OUTPUT_VARIABLE FAIRSOFT_CXX_COMPILER) + Execute_Process(COMMAND ${FAIRSOFT_CONFIG} --f77 + OUTPUT_VARIABLE FAIRSOFT_Fortran_COMPILER) + + # Strip whitespaces, otherwise readlink and comparison don't work + String(STRIP ${FAIRSOFT_C_COMPILER} FAIRSOFT_C_COMPILER) + String(STRIP ${FAIRSOFT_CXX_COMPILER} FAIRSOFT_CXX_COMPILER) + String(STRIP ${FAIRSOFT_Fortran_COMPILER} FAIRSOFT_Fortran_COMPILER) + + Get_Filename_Component(FAIRSOFT_C_COMPILER ${FAIRSOFT_C_COMPILER} REALPATH) + Get_Filename_Component(FAIRSOFT_CXX_COMPILER ${FAIRSOFT_CXX_COMPILER} REALPATH) + Get_Filename_Component(FAIRSOFT_Fortran_COMPILER ${FAIRSOFT_Fortran_COMPILER} REALPATH) + + Set(FAIRROOT_C_COMPILER ${CMAKE_C_COMPILER}) + Set(FAIRROOT_CXX_COMPILER ${CMAKE_CXX_COMPILER}) + Set(FAIRROOT_Fortran_COMPILER ${CMAKE_Fortran_COMPILER}) + + String(STRIP ${FAIRROOT_C_COMPILER} FAIRROOT_C_COMPILER) + String(STRIP ${FAIRROOT_CXX_COMPILER} FAIRROOT_CXX_COMPILER) + + If(FAIRROOT_Fortran_COMPILER) + String(STRIP ${FAIRROOT_Fortran_COMPILER} FAIRROOT_Fortran_COMPILER) + Get_Filename_Component(FAIRROOT_Fortran_COMPILER ${FAIRROOT_Fortran_COMPILER} REALPATH) + EndIf() + + Get_Filename_Component(FAIRROOT_C_COMPILER ${FAIRROOT_C_COMPILER} REALPATH) + Get_Filename_Component(FAIRROOT_CXX_COMPILER ${FAIRROOT_CXX_COMPILER} REALPATH) + + Execute_Process(COMMAND ${FAIRSOFT_C_COMPILER} --version + OUTPUT_VARIABLE FAIRSOFT_C_COMPILER_STRING + ) + + Execute_Process(COMMAND ${FAIRROOT_C_COMPILER} --version + OUTPUT_VARIABLE FAIRROOT_C_COMPILER_STRING + ) + + Execute_Process(COMMAND ${FAIRSOFT_CXX_COMPILER} --version + OUTPUT_VARIABLE FAIRSOFT_CXX_COMPILER_STRING + ) + Execute_Process(COMMAND ${FAIRROOT_CXX_COMPILER} --version + OUTPUT_VARIABLE FAIRROOT_CXX_COMPILER_STRING + ) + + set(compiler_wrapper "(omebrew/shim|ccache)") + if(NOT FAIRSOFT_C_COMPILER MATCHES ${compiler_wrapper} AND + NOT FAIRSOFT_CXX_COMPILER MATCHES ${compiler_wrapper} AND + NOT FAIRSOFT_Fortran_COMPILER MATCHES ${compiler_wrapper} AND + NOT FAIRROOT_C_COMPILER MATCHES ${compiler_wrapper} AND + NOT FAIRROOT_CXX_COMPILER MATCHES ${compiler_wrapper} AND + NOT FAIRROOT_Fortran_COMPILER MATCHES ${compiler_wrapper}) + + If(NOT ("${FAIRSOFT_C_COMPILER_STRING}" STREQUAL "${FAIRROOT_C_COMPILER_STRING}") OR NOT ("${FAIRSOFT_CXX_COMPILER_STRING}" STREQUAL "${FAIRROOT_CXX_COMPILER_STRING}")) + execute_process(COMMAND cmake -E compare_files ${FAIRSOFT_CXX_COMPILER} ${FAIRROOT_CXX_COMPILER} RESULT_VARIABLE COMPILER_DIFF) + If(NOT ${COMPILER_DIFF} EQUAL 0) + Message(STATUS "C compiler used for FairSoft installation: ${FAIRSOFT_C_COMPILER}") + Message(STATUS "C compiler used now: ${FAIRROOT_C_COMPILER}") + Message(STATUS "CXX compiler used for FairSoft installation: ${FAIRSOFT_CXX_COMPILER}") + Message(STATUS "CXX compiler used now: ${FAIRROOT_CXX_COMPILER}") + Message(STATUS "The compiler during the compilation of FairSoft is different from the current one.") + If(USE_DIFFERENT_COMPILER) + Message(STATUS "The error was silenced by the usage of -DUSE_DIFFERENT_COMPILER=TRUE") + Else() + Message(FATAL_ERROR "This is seen as an error. If you know that the setting is correct you can silence the error by using the CMake flag -DUSE_DIFFERENT_COMPILER=TRUE") + EndIf() + EndIf() + EndIf() + + If(FAIRROOT_Fortran_COMPILER) + If(NOT (${FAIRSOFT_Fortran_COMPILER} STREQUAL ${FAIRROOT_Fortran_COMPILER})) + String(STRIP ${FAIRSOFT_Fortran_COMPILER} FAIRSOFT_Fortran_COMPILER) + Message(STATUS "Fortran compiler used for FairSoft installation: ${FAIRSOFT_Fortran_COMPILER}") + Message(STATUS "Fortran compiler used now: ${FAIRROOT_Fortran_COMPILER}") + Message(STATUS "The compiler during the compilation of FairSoft is different from the current one.") + If(USE_DIFFERENT_COMPILER) + Message(STATUS "The error was silenced by the usage of -DUSE_DIFFERENT_COMPILER=TRUE") + Else() + Message(FATAL_ERROR "This is seen as an error. If you know that the setting is correct you can silence the error by using the CMake flag -DUSE_DIFFERENT_COMPILER=TRUE") + EndIf() + EndIf() + EndIf() + + endif() + + Execute_Process(COMMAND ${FAIRSOFT_CONFIG} --cxxflags + OUTPUT_VARIABLE FAIRSOFT_CXX_FLAGS) + unset(CMAKE_MATCH_1) + String(REGEX REPLACE "-std=c\\+\\+(..)" "" FAIRSOFT_CXX_FLAGS "${FAIRSOFT_CXX_FLAGS}") + if(CMAKE_MATCH_1 AND (NOT DEFINED CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD VERSION_LESS CMAKE_MATCH_1)) + set(CMAKE_CXX_STANDARD ${CMAKE_MATCH_1}) + endif() + String(STRIP ${FAIRSOFT_CXX_FLAGS} FAIRSOFT_CXX_FLAGS) + if(FAIRSOFT_CXX_FLAGS) + Set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FAIRSOFT_CXX_FLAGS}") + endif() +Else() + Message(STATUS "fairsoft-config not found. Is SIMPATH or FAIRSOFT_ROOT set correctly?") +EndIf() + + +if (CMAKE_SYSTEM_NAME MATCHES Linux) + MESSAGE("--- Found a Linux system") + if (CMAKE_COMPILER_IS_GNUCXX) + MESSAGE("--- Found GNU compiler collection") + + # Configure build types + set(CMAKE_CONFIGURATION_TYPES "RELWITHDEBINFO" "NIGHTLY" "TEST" "RELEASE" "DEBUG" "DEBUGFULL" "PROFILE" "ARRAY_CHECK") + + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -Wshadow") + set(CMAKE_CXX_FLAGS_NIGHTLY "-O0 -g -Wshadow") + set(CMAKE_CXX_FLAGS_TEST "-O2 -g -Wshadow") + set(CMAKE_CXX_FLAGS_RELEASE "-O2 -Wshadow ") + + set(CMAKE_CXX_FLAGS_DEBUG "-g -Wshadow ") + set(CMAKE_CXX_FLAGS_DEBUGFULL "-g3 -fno-inline -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wformat-security -fno-exceptions -fno-check-new -fno-common -fexceptions") + set(CMAKE_CXX_FLAGS_PROFILE "-g3 -fno-inline -ftest-coverage -fprofile-arcs -Wshadow -Wall -Wextra -Wunused-variable") + set(CMAKE_CXX_FLAGS_ARRAY_CHECK "-g3 -fno-inline -ftest-coverage -fprofile-arcs -fstack-protector") + + set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g") + set(CMAKE_C_FLAGS_RELEASE "-O2") +# set(CMAKE_C_FLAGS_DEBUG "-g -O2 -fno-reorder-blocks -fno-schedule-insns -fno-inline") + set(CMAKE_C_FLAGS_DEBUG "-g") + set(CMAKE_C_FLAGS_DEBUGFULL "-g3 -fno-inline -Wno-long-long -std=iso9899:1990 -Wundef -Wcast-align -Werror-implicit-function-declaration -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -Wmissing-format-attribute -fno-common -fexceptions") + set(CMAKE_C_FLAGS_PROFILE "-g3 -fno-inline -ftest-coverage -fprofile-arcs") + set(CMAKE_C_FLAGS_ARRAY_CHECK "-g3 -fno-inline -ftest-coverage -fprofile-arcs -fstack-protector") + + endif (CMAKE_COMPILER_IS_GNUCXX) + + if (CMAKE_C_COMPILER MATCHES "icc") + MESSAGE("--- Found Intel compiler collection") + # Select flags. + set(CMAKE_CONFIGURATION_TYPES "RELWITHDEBINFO" "RELEASE" "DEBUG" "DEBUGFULL") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g ") + set(CMAKE_CXX_FLAGS_RELEASE "-O2") + set(CMAKE_CXX_FLAGS_DEBUG "-O2 -g -0b0 -noalign") + set(CMAKE_CXX_FLAGS_DEBUGFULL "-g -Ob0 -noalign -W") + + set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g") + set(CMAKE_C_FLAGS_RELEASE "-O2") + set(CMAKE_C_FLAGS_DEBUG "-O2 -g -Ob0 -noalign") + set(CMAKE_C_FLAGS_DEBUGFULL "-g -Ob0 -noalign -W") + # Get the directory where to find libimf. The only way I found is to get the install dir from icpc and + # from there one knows where the the libraries are installed + Execute_process(COMMAND which icpc OUTPUT_VARIABLE _bla) + String(REPLACE "bin" "compiler/lib" _intel_lib_dirs ${_bla}) + String(REPLACE "/icpc" "" _intel_lib_dirs ${_intel_lib_dirs}) + String(STRIP ${_intel_lib_dirs} _intel_lib_dirs) + + endif (CMAKE_C_COMPILER MATCHES "icc") + + if (CMAKE_C_COMPILER MATCHES "clang") + MESSAGE("-- Clang compiler") + + # Select flags. + set(CMAKE_C_FLAGS_PROFILE "--coverage -g3") + set(CMAKE_CXX_FLAGS_PROFILE "--coverage -g3") + + endif (CMAKE_C_COMPILER MATCHES "clang") +endif (CMAKE_SYSTEM_NAME MATCHES Linux) + + +if (CMAKE_SYSTEM_NAME MATCHES Darwin) + EXEC_PROGRAM("sw_vers -productVersion | cut -d . -f 1-2" OUTPUT_VARIABLE MAC_OS_VERSION) + MESSAGE("-- Found a Mac OS X System ${MAC_OS_VERSION}") + if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + MESSAGE("-- Found GNU compiler collection") + + STRING(COMPARE EQUAL "10.5" "${MAC_OS_VERSION}" MAC_OS_10_5) + STRING(COMPARE EQUAL "10.6" "${MAC_OS_VERSION}" MAC_OS_10_6) + STRING(COMPARE EQUAL "10.7" "${MAC_OS_VERSION}" MAC_OS_10_7) + IF(MAC_OS_10_5 OR MAC_OS_10_6 OR MAC_OS_10_7) + SET(CMAKE_CXX_FLAGS "-m64") + SET(CMAKE_C_FLAGS "-m64") + SET(CMAKE_Fortran_FLAGS "-m64") + ENDIF(MAC_OS_10_5 OR MAC_OS_10_6 OR MAC_OS_10_7) + + Execute_Process(COMMAND gfortran -print-file-name=libgfortran.dylib + OUTPUT_VARIABLE FORTRAN_LIBDIR + ) + Get_Filename_Component(FORTRAN_LIBDIR ${FORTRAN_LIBDIR} + PATH + ) + Message("-- Fortran libraries found in ${FORTRAN_LIBDIR}") + + # Configure build types + set(CMAKE_CONFIGURATION_TYPES "RELWITHDEBINFO" "NIGHTLY" "RELEASE" "DEBUG" "DEBUGFULL" "PROFILE") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -Wshadow ") + set(CMAKE_CXX_FLAGS_NIGHTLY "-O2 -g -Wshadow -Wall -Wextra") + set(CMAKE_CXX_FLAGS_RELEASE "-O2 -Wshadow ") + set(CMAKE_CXX_FLAGS_DEBUG "-g -Wshadow -fno-inline") + set(CMAKE_CXX_FLAGS_DEBUGFULL "-g3 -fno-inline -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W -Wpointer-arith -Wformat-security -fno-exceptions -fno-check-new -fno-common") + set(CMAKE_CXX_FLAGS_PROFILE "-g3 -fno-inline -ftest-coverage -fprofile-arcs -Wall -Wextra") + + set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g") + set(CMAKE_C_FLAGS_RELEASE "-O2") + set(CMAKE_C_FLAGS_DEBUG "-g -fno-inline") + set(CMAKE_C_FLAGS_DEBUGFULL "-g3 -fno-inline -Wno-long-long -std=iso9899:1990 -Wundef -Wcast-align -Werror-implicit-function-declaration -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -Wmissing-format-attribute -fno-common") + set(CMAKE_C_FLAGS_PROFILE "-g3 -fno-inline -ftest-coverage -fprofile-arcs") + + + else (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + Message("CXX Compiler: ${CMAKE_CXX_COMPILER}") + Message("CXX Compiler ABI: ${CMAKE_CXX_COMPILER_ABI}") + Message("CXX Compiler ID: ${CMAKE_CXX_COMPILER_ID}") + MESSAGE(FATAL_ERROR "This compiler is not known.") + endif (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + + +endif (CMAKE_SYSTEM_NAME MATCHES Darwin) + + +if (CMAKE_BUILD_TYPE) + STRING(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UPPER) + SET(CMAKE_BUILD_TYPE_CXXFLAGS_KEY CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE_UPPER}) +endif () + +#MESSAGE("--- Build Type: ${CMAKE_BUILD_TYPE}") +#MESSAGE("--- Compiler Flags: ${CMAKE_CXX_FLAGS} ${${CMAKE_BUILD_TYPE_CXXFLAGS_KEY}}") + +ENDMACRO ( Check_Compiler ) diff --git a/cmake/modules/FairMacros.cmake b/cmake/modules/FairMacros.cmake new file mode 100644 index 0000000000000000000000000000000000000000..f95bd2f4330bb7448308cb7b80e88ddb827b96a4 --- /dev/null +++ b/cmake/modules/FairMacros.cmake @@ -0,0 +1,526 @@ +################################################################################ +# Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # +# # +# This software is distributed under the terms of the # +# GNU Lesser General Public Licence (LGPL) version 3, # +# copied verbatim in the file "LICENSE" # +################################################################################ + + + + +################################################################################ +# Create Bash the Variable for G4 Data files +################################################################################ +MACRO(Write_Geant4Data_Variables_sh) +Set(Geant4Data_Variables_sh "\ +####################### Create the data set variables for Geant4 ############# +") +foreach(DATASET ${Geant4_DATASETS}) + string(CONCAT Geant4Data_Variables_sh ${Geant4Data_Variables_sh} "\ +export ${Geant4_DATASET_${DATASET}_ENVVAR}=${Geant4_DATASET_${DATASET}_PATH} +") +endforeach() +string(CONCAT Geant4Data_Variables_sh ${Geant4Data_Variables_sh} "\ +############################################################################## +") + +ENDMACRO() + +################################################################################ +# Create CSH the Variable for G4 Data files +################################################################################ +MACRO(Write_Geant4Data_Variables_csh) +Set(Geant4Data_Variables_csh "\ +####################### Create the data set variables for Geant4 ############# +") +foreach(DATASET ${Geant4_DATASETS}) + string(CONCAT Geant4Data_Variables_csh ${Geant4Data_Variables_csh} "\ +setenv ${Geant4_DATASET_${DATASET}_ENVVAR} ${Geant4_DATASET_${DATASET}_PATH} +") +endforeach() +string(CONCAT Geant4Data_Variables_csh ${Geant4Data_Variables_csh} "\ +############################################################################## +") +################################################################################ +ENDMACRO() + +#Defines some variables with console color escape sequences + if(NOT WIN32 AND NOT DISABLE_COLOR) + string(ASCII 27 Esc) + set(CR "${Esc}[m") + set(CB "${Esc}[1m") + set(Red "${Esc}[31m") + set(Green "${Esc}[32m") + set(Yellow "${Esc}[33m") + set(Blue "${Esc}[34m") + set(Magenta "${Esc}[35m") + set(Cyan "${Esc}[36m") + set(White "${Esc}[37m") + set(BRed "${Esc}[1;31m") + set(BGreen "${Esc}[1;32m") + set(BYellow "${Esc}[1;33m") + set(BBlue "${Esc}[1;34m") + set(BMagenta "${Esc}[1;35m") + set(BCyan "${Esc}[1;36m") + set(BWhite "${Esc}[1;37m") + endif() + +################################################################################ +MACRO(SUBDIRLIST result curdir) + FILE(GLOB children RELATIVE ${curdir} ${curdir}/*) + SET(dirlist "") + FOREACH(child ${children}) + IF(IS_DIRECTORY ${curdir}/${child}) + LIST(APPEND dirlist ${child}) + ENDIF() + ENDFOREACH() + SET(${result} ${dirlist}) +ENDMACRO() + +################################################################################ +# +# Exchange file extention of LIST from FILE_EXT1 to FILE_EXT2 +# and assign the newly created list to OUTVAR. +# The input list LIST is not changed at all +# Ex : CHANGE_FILE_EXTENSION(*.cxx *.h TRD_HEADERS "${TRD_SRCS}") +# +################################################################################ +MACRO (CHANGE_FILE_EXTENSION FILE_EXT1 FILE_EXT2 OUTVAR LIST) + SET(BLA) + IF (${FILE_EXT1} MATCHES "^[*][.]+.*$") + STRING(REGEX REPLACE "^[*]+([.].*)$" "\\1" FILE_EXT1_NEW ${FILE_EXT1}) + ENDIF (${FILE_EXT1} MATCHES "^[*][.]+.*$") + IF (${FILE_EXT2} MATCHES "^[*][.]+.*$") + STRING(REGEX REPLACE "^[*]+([.].*)" "\\1" FILE_EXT2_NEW ${FILE_EXT2}) + ENDIF (${FILE_EXT2} MATCHES "^[*][.]+.*$") + foreach (_current_FILE ${LIST}) + STRING(REGEX REPLACE "^(.*)${FILE_EXT1_NEW}$" "\\1${FILE_EXT2_NEW}" test ${_current_FILE}) + SET (BLA ${BLA} ${test}) + endforeach (_current_FILE ${ARGN}) + SET (${OUTVAR} ${BLA}) +ENDMACRO (CHANGE_FILE_EXTENSION) + +################################################################################ +# Exchange file extention of file in list from ext1 to ext2, +# only if the resulting file exists in CMAKE_CURRENT_SOURCE_DIR, +# and assign the newly created list to 'output'. +# The input list is not changed at all +# Ex: fair_change_file_extension_ifexists(*.cxx *.h "${TRD_SRCS}" TRD_HEADERS) +################################################################################ +function(fair_change_extensions_if_exists ext1 ext2) + cmake_parse_arguments(ARGS "" "OUTVAR" "FILES" ${ARGN}) + + set(required_args "FILES;OUTVAR") + foreach(required_arg IN LISTS required_args) + if(NOT ARGS_${required_arg}) + message(FATAL_ERROR "fair_change_extensions_if_exists is missing a required argument: ${required_arg}") + endif() + endforeach() + + if(${ext1} MATCHES "^[*][.]+.*$") + string(REGEX REPLACE "^[*]+([.].*)$" "\\1" ext1new ${ext1}) + else() + set(ext1new ${ext1}) + endif() + if(${ext2} MATCHES "^[*][.]+.*$") + string(REGEX REPLACE "^[*]+([.].*)$" "\\1" ext2new ${ext2}) + else() + set(ext2new ${ext2}) + endif() + foreach(file ${ARGS_FILES}) + set(newFile "") + string(REGEX REPLACE "^(.*)${ext1new}$" "\\1${ext2new}" newFile ${file}) + if(NOT ${file} STREQUAL ${newFile} AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${newFile}) + list(APPEND result ${newFile}) + endif() + endforeach() + set(${ARGS_OUTVAR} ${result} PARENT_SCOPE) +endfunction() + +################################################################################ +# +# Macro get string with a colon seperated string of +# pathes or any other colon sperated list. +# First the string is seperated and the entries are +# filled into a list. +# Loop over the list and searches for the occurence +# of keywords which are provided as a list. +# If the keyword occurs this path (entry) is +# deleted from the list. Returns the list of pathes +# (entries) wich survives the loop. +# +# PATH: colon separated string of pathes or other +# input entries +# LIST_OF_KEYWORDS: list of the keywords which +# should be excluded in the output +# OUTVAR: name of the variable which should be filled +# with the resulting output list +# +################################################################################ + +MACRO (CLEAN_PATH_LIST PATH LIST_OF_KEYWORDS OUTVAR) + SET(BLA "") + STRING(REGEX MATCHALL "[^:]+" PATH1 ${PATH}) + FOREACH(_current_PATH ${PATH1}) + SET(KEYWORD_FOUND FALSE) + FOREACH(_current_KEYWORD ${LIST_OF_KEYWORDS}) + IF (${_current_PATH} MATCHES "${_current_KEYWORD}") + SET(KEYWORD_FOUND TRUE) + ENDIF (${_current_PATH} MATCHES "${_current_KEYWORD}") + ENDFOREACH(_current_KEYWORD ${LIST_OF_KEYWORDS}) + IF (NOT KEYWORD_FOUND) + SET(BLA ${BLA} ${_current_PATH}) + ENDIF (NOT KEYWORD_FOUND) + ENDFOREACH(_current_PATH ${PATH1}) + UNIQUE(${OUTVAR} "${BLA}") +ENDMACRO (CLEAN_PATH_LIST) + +################################################################################# +# The macro checks if the user wants to build the project +# in the source directory and if so stop the execution +# of cmake with an error message. +# +################################################################################ + +MACRO (CHECK_OUT_OF_SOURCE_BUILD) + + STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" insource) + IF(insource) + FILE(REMOVE_RECURSE ${CMAKE_SOURCE_DIR}/Testing) + FILE(REMOVE ${CMAKE_SOURCE_DIR}/DartConfiguration.tcl) + MESSAGE(FATAL_ERROR "FAIRROOT should be installed as an out of source build, to keep the source directory clean. Please create a extra build directory and run the command 'cmake path_to_source_dir' in this newly created directory. You have also to delete the directory CMakeFiles and the file CMakeCache.txt in the source directory. Otherwise cmake will complain even if you run it from an out-of-source directory.") + ENDIF(insource) + +ENDMACRO (CHECK_OUT_OF_SOURCE_BUILD) + +################################################################################# +# The macro checks if the build directory is different from the +# installation directory. In case both are the same +# stop the execution of cmake with an error message. +# +################################################################################ + +MACRO (CHECK_INSTALL_DIRECTORY) + String(COMPARE EQUAL "${CMAKE_INSTALL_PREFIX}" "${CMAKE_BINARY_DIR}" _same) + If(_same) + MESSAGE(FATAL_ERROR "Your build and installation directory is the same one. This option does not work. Please change either your build or your installation directory and rerun cmake.") + EndIf(_same) +EndMacro (CHECK_INSTALL_DIRECTORY) +################################################################################ + +MACRO(CHECK_EXTERNAL_PACKAGE_INSTALL_DIR) + If(IS_DIRECTORY ${SIMPATH}/bin) + Set(FAIRSOFT_EXTERN TRUE) + Else(IS_DIRECTORY ${SIMPATH}/bin) + Set(FAIRSOFT_EXTERN FALSE) + EndIf(IS_DIRECTORY ${SIMPATH}/bin) +EndMacro(CHECK_EXTERNAL_PACKAGE_INSTALL_DIR) +MACRO(UNIQUE var_name list) +################################################################################ +# Make the given list have only one instance of each unique element and +# store it in var_name. +################################################################################ + + SET(unique_tmp "") + FOREACH(l ${list}) + STRING(REGEX REPLACE "[+]" "\\\\+" l1 ${l}) + IF(NOT "${unique_tmp}" MATCHES "(^|;)${l1}(;|$)") + SET(unique_tmp ${unique_tmp} ${l}) + ENDIF(NOT "${unique_tmp}" MATCHES "(^|;)${l1}(;|$)") + ENDFOREACH(l) + SET(${var_name} ${unique_tmp}) +ENDMACRO(UNIQUE) +################################################################################ +# Creates a variable which stores the intersection +# between two lists +################################################################################ + +MACRO(INTERSECTION var_name list1 list2) + # Store the intersection between the two given lists in var_name. + SET(intersect_tmp "") + FOREACH(l ${list1}) + IF("${list2}" MATCHES "(^|;)${l}(;|$)") + SET(intersect_tmp ${intersect_tmp} ${l}) + ENDIF("${list2}" MATCHES "(^|;)${l}(;|$)") + ENDFOREACH(l) + SET(${var_name} ${intersect_tmp}) +ENDMACRO(INTERSECTION) +################################################################################ +MACRO(REMOVE_FROM_LIST var_name list1 list2) + # Remove elements in list2 from list1 and store the result in var_name. + SET(filter_tmp "") + FOREACH(l ${list1}) + IF(NOT "${list2}" MATCHES "(^|;)${l}(;|$)") + SET(filter_tmp ${filter_tmp} ${l}) + ENDIF(NOT "${list2}" MATCHES "(^|;)${l}(;|$)") + ENDFOREACH(l) + SET(${var_name} ${filter_tmp}) +ENDMACRO(REMOVE_FROM_LIST) +################################################################################ +MACRO (GENERATE_TEST_SCRIPT SCRIPT_FULL_NAME) + + get_filename_component(path_name ${SCRIPT_FULL_NAME} PATH) + get_filename_component(file_extension ${SCRIPT_FULL_NAME} EXT) + get_filename_component(file_name ${SCRIPT_FULL_NAME} NAME_WE) + set(shell_script_name "${file_name}.sh") + + if(${ARGC} GREATER 1) + set(new_path ${ARGV1}) + Else() + string(REPLACE ${PROJECT_SOURCE_DIR} + ${PROJECT_BINARY_DIR} new_path ${path_name} + ) + EndIf() + CONVERT_LIST_TO_STRING(${LD_LIBRARY_PATH}) + set(MY_LD_LIBRARY_PATH ${output}) + set(my_script_name ${SCRIPT_FULL_NAME}) + Write_Geant4Data_Variables_sh() + configure_file(${PROJECT_SOURCE_DIR}/cmake/scripts/set_env.sh.in + ${new_path}/${shell_script_name} + ) + EXEC_PROGRAM(/bin/chmod ARGS "u+x ${new_path}/${shell_script_name}" OUTPUT_VARIABLE tmp) +ENDMACRO (GENERATE_TEST_SCRIPT) +################################################################################ + +Macro(Generate_Exe_Script _Path _ExeName) + + Message("PATH: ${_Path}") + Message("ExeName: ${_ExeName}") + set(shell_script_name "${_ExeName}.sh") + Message("shell_script_name: ${shell_script_name}") + + string(REPLACE ${PROJECT_SOURCE_DIR} + ${PROJECT_BINARY_DIR} new_path ${_Path} + ) + + set(my_exe_name ${EXECUTABLE_OUTPUT_PATH}/${_ExeName}) + Write_Geant4Data_Variables_sh() + configure_file(${PROJECT_SOURCE_DIR}/cmake/scripts/run_binary.sh.in + ${new_path}/${shell_script_name} + ) + + EXEC_PROGRAM(/bin/chmod ARGS "u+x ${new_path}/${shell_script_name}" OUTPUT_VARIABLE tmp ) + +EndMacro(Generate_Exe_Script) +################################################################################ + +Macro (Generate_Version_Info) +IF(FAIRROOT_FOUND) + + Add_Custom_Target(svnheader ALL) + + Add_Custom_Command(TARGET svnheader + COMMAND ${CMAKE_COMMAND} -DSOURCE_DIR=${PROJECT_SOURCE_DIR} + -DBINARY_DIR=${CMAKE_BINARY_DIR} + -DINCLUDE_OUTPUT_DIRECTORY=${INCLUDE_OUTPUT_DIRECTORY} + -DFAIRROOT=${FAIRROOT_CMAKEMOD_DIR} + -P ${FAIRROOT_CMAKEMOD_DIR}/modules/GenerateVersionInfo.cmake + ) +ELSE(FAIRROOT_FOUND) + Add_Custom_Target(svnheader ALL) + Add_Custom_Command(TARGET svnheader + COMMAND ${CMAKE_COMMAND} -DSOURCE_DIR=${CMAKE_SOURCE_DIR} + -DBINARY_DIR=${CMAKE_BINARY_DIR} + -DINCLUDE_OUTPUT_DIRECTORY=${INCLUDE_OUTPUT_DIRECTORY} + -P ${CMAKE_SOURCE_DIR}/cmake/modules/GenerateVersionInfo.cmake + ) +ENDIF(FAIRROOT_FOUND) + +EndMacro (Generate_Version_Info) +################################################################################ + +Macro (SetBasicVariables) +IF(FAIRROOT_FOUND) + Set(BASE_INCLUDE_DIRECTORIES + ${FAIRROOT_INCLUDE_DIR} + ) + Set(SYSTEM_INCLUDE_DIRECTORIES + ${ROOT_INCLUDE_DIR} + ${Boost_INCLUDE_DIRS} + ) + Set(ROOT_INCLUDE_PATH + ${FAIRROOT_INCLUDE_DIR} + ) + +ELSE(FAIRROOT_FOUND) + Set(BASE_INCLUDE_DIRECTORIES + ${CMAKE_SOURCE_DIR}/logger + ${CMAKE_SOURCE_DIR}/fairtools + ${CMAKE_SOURCE_DIR}/geobase + ${CMAKE_SOURCE_DIR}/parbase + ${CMAKE_SOURCE_DIR}/base + ${CMAKE_SOURCE_DIR}/base/steer + ${CMAKE_SOURCE_DIR}/base/event + ${CMAKE_SOURCE_DIR}/base/field + ${CMAKE_SOURCE_DIR}/base/sim + ${CMAKE_SOURCE_DIR}/base/sink + ${CMAKE_SOURCE_DIR}/base/source + ${CMAKE_SOURCE_DIR}/dbase + ${CMAKE_SOURCE_DIR}/dbase/dbInterface + ${CMAKE_SOURCE_DIR}/dbase/dbValidation + ${CMAKE_SOURCE_DIR}/dbase/dbUtils + ${CMAKE_SOURCE_DIR}/input/db + ${CMAKE_SOURCE_DIR}/dbase/dbInput + ${CMAKE_SOURCE_DIR}/dbase/dbIO + ${CMAKE_SOURCE_DIR}/alignment + ) + Set(SYSTEM_INCLUDE_DIRECTORIES + ${ROOT_INCLUDE_DIR} + ${Boost_INCLUDE_DIRS} + ) + Set(ROOT_INCLUDE_PATH + ${BASE_INCLUDE_DIRECTORIES} + ) +ENDIF(FAIRROOT_FOUND) + +Set(BASE_LINK_DIRECTORIES + ${ROOT_LIBRARY_DIR} +) + +IF(FAIRROOT_FOUND) + Set(FAIRLIBDIR ${FAIRROOT_LIBRARY_DIR}) +ELSE(FAIRROOT_FOUND) + Set(FAIRLIBDIR ${CMAKE_BINARY_DIR}/lib) +ENDIF(FAIRROOT_FOUND) +Set(LD_LIBRARY_PATH ${FAIRLIBDIR} ${LD_LIBRARY_PATH}) + +include_directories(${BASE_INCLUDE_DIRECTORIES}) +include_directories(SYSTEM ${SYSTEM_INCLUDE_DIRECTORIES}) +link_directories(${BASE_LINK_DIRECTORIES}) + +EndMacro (SetBasicVariables) + +################################################################################ +# +# find_package2(PRIVATE|PUBLIC|INTERFACE <pkgname> +# [VERSION <version>] +# [COMPONENTS <list of components>] +# [ADD_REQUIREMENTS_OF <list of dep_pgkname>] +# [any other option the native find_package supports]...) +# +# Wrapper around CMake's native find_package command to add some features and bookkeeping. +# +# The qualifier (PRIVATE|PUBLIC|INTERFACE) to the package to populate +# the variables PROJECT_[INTERFACE]_<pkgname>_([VERSION]|[COMPONENTS]|PACKAGE_DEPENDENCIES) +# accordingly. This bookkeeping information is used to print our dependency found summary +# table and to generate a part of our CMake package. +# +# When a dependending package is listed with ADD_REQUIREMENTS_OF the variables +# <dep_pkgname>_<pkgname>_VERSION|COMPONENTS are looked up to and added to the native +# VERSION (selected highest version) and COMPONENTS (deduplicated) args. +# +# COMPONENTS and VERSION args are then just passed to the native find_package. +# +macro(find_package2 qualifier pkgname) + cmake_parse_arguments(ARGS "" "VERSION" "COMPONENTS;ADD_REQUIREMENTS_OF" ${ARGN}) + + string(TOUPPER ${pkgname} pkgname_upper) + set(__old_cpp__ ${CMAKE_PREFIX_PATH}) + set(CMAKE_PREFIX_PATH ${${pkgname_upper}_ROOT} $ENV{${pkgname_upper}_ROOT} ${CMAKE_PREFIX_PATH}) + + # build lists of required versions and components + unset(__required_versions__) + unset(__components__) + if(ARGS_VERSION) + list(APPEND __required_versions__ ${ARGS_VERSION}) + endif() + if(ARGS_COMPONENTS) + list(APPEND __components__ ${ARGS_COMPONENTS}) + endif() + if(ARGS_ADD_REQUIREMENTS_OF) + foreach(dep_pkgname IN LISTS ARGS_ADD_REQUIREMENTS_OF) + if(${dep_pkgname}_${pkgname}_VERSION) + list(APPEND __required_versions__ ${${dep_pkgname}_${pkgname}_VERSION}) + endif() + if(${dep_pkgname}_${pkgname}_COMPONENTS) + list(APPEND __components__ ${${dep_pkgname}_${pkgname}_COMPONENTS}) + endif() + endforeach() + endif() + + # select highest required version + unset(__version__) + if(__required_versions__) + list(GET __required_versions__ 0 __version__) + foreach(v IN LISTS __required_versions__) + if(${v} VERSION_GREATER ${__version__}) + set(__version__ ${v}) + endif() + endforeach() + endif() + # deduplicate required component list + if(__components__) + list(REMOVE_DUPLICATES __components__) + endif() + + # call native find_package + if(__components__) + find_package(${pkgname} ${__version__} QUIET COMPONENTS ${__components__} ${ARGS_UNPARSED_ARGUMENTS}) + else() + find_package(${pkgname} ${__version__} QUIET ${ARGS_UNPARSED_ARGUMENTS}) + endif() + + if(${pkgname}_FOUND) + if(${qualifier} STREQUAL PRIVATE) + set(PROJECT_${pkgname}_VERSION ${__version__}) + set(PROJECT_${pkgname}_COMPONENTS ${__components__}) + set(PROJECT_PACKAGE_DEPENDENCIES ${PROJECT_PACKAGE_DEPENDENCIES} ${pkgname}) + elseif(${qualifier} STREQUAL PUBLIC) + set(PROJECT_${pkgname}_VERSION ${__version__}) + set(PROJECT_${pkgname}_COMPONENTS ${__components__}) + set(PROJECT_PACKAGE_DEPENDENCIES ${PROJECT_PACKAGE_DEPENDENCIES} ${pkgname}) + set(PROJECT_INTERFACE_${pkgname}_VERSION ${__version__}) + set(PROJECT_INTERFACE_${pkgname}_COMPONENTS ${__components__}) + set(PROJECT_INTERFACE_PACKAGE_DEPENDENCIES ${PROJECT_INTERFACE_PACKAGE_DEPENDENCIES} ${pkgname}) + elseif(${qualifier} STREQUAL INTERFACE) + set(PROJECT_INTERFACE_${pkgname}_VERSION ${__version__}) + set(PROJECT_INTERFACE_${pkgname}_COMPONENTS ${__components__}) + set(PROJECT_INTERFACE_PACKAGE_DEPENDENCIES ${PROJECT_INTERFACE_PACKAGE_DEPENDENCIES} ${pkgname}) + endif() + endif() + + unset(__version__) + unset(__components__) + unset(__required_versions__) + set(CMAKE_PREFIX_PATH ${__old_cpp__}) + unset(__old_cpp__) +endmacro() +################################################################################ +function(pad str width char out) + cmake_parse_arguments(ARGS "LEFT" "COLOR" "" ${ARGN}) + string(LENGTH ${str} length) + if(ARGS_COLOR) + math(EXPR padding "${width}-(${length}-10*${ARGS_COLOR})") + else() + math(EXPR padding "${width}-${length}") + endif() + if(padding GREATER 0) + foreach(i RANGE ${padding}) + if(ARGS_LEFT) + set(str "${char}${str}") + else() + set(str "${str}${char}") + endif() + endforeach() + endif() + set(${out} ${str} PARENT_SCOPE) +endfunction() +################################################################################ +function(generate_package_components) + join("${PROJECT_PACKAGE_COMPONENTS}" " " COMPS) + set(PACKAGE_COMPONENTS "\ +####### Expanded from @PACKAGE_COMPONENTS@ by configure_package_config_file() ######### +set(${PROJECT_NAME}_PACKAGE_COMPONENTS ${COMPS}) +") + foreach(comp IN LISTS PROJECT_PACKAGE_COMPONENTS) + string(CONCAT PACKAGE_COMPONENTS ${PACKAGE_COMPONENTS} "\ +set(${PROJECT_NAME}_${comp}_FOUND TRUE) +") + endforeach() + string(CONCAT PACKAGE_COMPONENTS ${PACKAGE_COMPONENTS} "\ +check_required_components(${PROJECT_NAME}) +") +set(PACKAGE_COMPONENTS ${PACKAGE_COMPONENTS} PARENT_SCOPE) +endfunction() +################################################################################ diff --git a/cmake/modules/FindFairRoot.cmake b/cmake/modules/FindFairRoot.cmake new file mode 100644 index 0000000000000000000000000000000000000000..c81174861e346c0ae328a8759a45a3ab58028906 --- /dev/null +++ b/cmake/modules/FindFairRoot.cmake @@ -0,0 +1,66 @@ + ################################################################################ + # Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # + # # + # This software is distributed under the terms of the # + # GNU Lesser General Public Licence (LGPL) version 3, # + # copied verbatim in the file "LICENSE" # + ################################################################################ +# Find FairRoot installation +# Check the environment variable "FAIRROOTPATH" + +if(FairRoot_DIR) + set(FAIRROOTPATH ${FairRoot_DIR}) +else() + if(NOT DEFINED ENV{FAIRROOTPATH}) + set(user_message "You did not define the environment variable FAIRROOTPATH which is needed to find FairRoot.\ + Please set this variable and execute cmake again." ) + if(FairRoot_FIND_REQUIRED) + MESSAGE(FATAL_ERROR ${user_message}) + else(FairRoot_FIND_REQUIRED) + MESSAGE(WARNING ${user_message}) + return() + endif(FairRoot_FIND_REQUIRED) + endif(NOT DEFINED ENV{FAIRROOTPATH}) + + set(FAIRROOTPATH $ENV{FAIRROOTPATH}) +endif() + +MESSAGE(STATUS "Setting FairRoot environment:") + +FIND_PATH(FAIRROOT_INCLUDE_DIR NAMES FairRun.h PATHS + ${FAIRROOTPATH}/include + NO_DEFAULT_PATH +) + +FIND_PATH(FAIRROOT_LIBRARY_DIR NAMES libBase.so libBase.dylib PATHS + ${FAIRROOTPATH}/lib + ${FAIRROOTPATH}/lib64 + NO_DEFAULT_PATH +) + +FIND_PATH(FAIRROOT_CMAKEMOD_DIR NAMES CMakeLists.txt PATHS + ${FAIRROOTPATH}/share/fairbase/cmake + NO_DEFAULT_PATH +) + +# look for exported FairMQ targets and include them +find_file(_fairroot_fairmq_cmake + NAMES FairMQ.cmake + HINTS ${FAIRROOTPATH}/include/cmake +) +if(_fairroot_fairmq_cmake) + include(${_fairroot_fairmq_cmake}) +endif() + +if(FAIRROOT_INCLUDE_DIR AND FAIRROOT_LIBRARY_DIR) + set(FAIRROOT_FOUND TRUE) + MESSAGE(STATUS " FairRoot prefix : ${FAIRROOTPATH}") + MESSAGE(STATUS " FairRoot Library directory : ${FAIRROOT_LIBRARY_DIR}") + MESSAGE(STATUS " FairRoot Include path : ${FAIRROOT_INCLUDE_DIR}") + MESSAGE(STATUS " FairRoot Cmake Modules : ${FAIRROOT_CMAKEMOD_DIR}") + +else(FAIRROOT_INCLUDE_DIR AND FAIRROOT_LIBRARY_DIR) + set(FAIRROOT_FOUND FALSE) + MESSAGE(FATAL_ERROR "FairRoot installation not found") +endif (FAIRROOT_INCLUDE_DIR AND FAIRROOT_LIBRARY_DIR) + diff --git a/cmake/modules/ROOTMacros.cmake b/cmake/modules/ROOTMacros.cmake index 31defc4e7e8872e9f121378abcc54cf9df1cce30..c06d3384913723d2404fe3e21711f9f96bea82c2 100644 --- a/cmake/modules/ROOTMacros.cmake +++ b/cmake/modules/ROOTMacros.cmake @@ -153,15 +153,9 @@ MACRO (GENERATE_ROOT_TEST_SCRIPT SCRIPT_FULL_NAME) set(my_script_name ${SCRIPT_FULL_NAME}) Write_Geant4Data_Variables_sh() - IF(FAIRROOTPATH) - configure_file(${FAIRROOTPATH}/share/fairbase/cmake/scripts/root_macro.sh.in - ${new_path}/${shell_script_name} - ) - ELSE(FAIRROOTPATH) - configure_file(${PROJECT_SOURCE_DIR}/cmake/scripts/root_macro.sh.in - ${new_path}/${shell_script_name} - ) - ENDIF(FAIRROOTPATH) + configure_file(${PROJECT_SOURCE_DIR}/cmake/scripts/root_macro.sh.in + ${new_path}/${shell_script_name} + ) execute_process(COMMAND /bin/chmod u+x ${new_path}/${shell_script_name} OUTPUT_QUIET) ENDMACRO (GENERATE_ROOT_TEST_SCRIPT) diff --git a/cmake/modules/WriteConfigFile.cmake b/cmake/modules/WriteConfigFile.cmake new file mode 100644 index 0000000000000000000000000000000000000000..e04b6fe6784f545a33438ea2c530008ec21c8d96 --- /dev/null +++ b/cmake/modules/WriteConfigFile.cmake @@ -0,0 +1,182 @@ + ################################################################################ + # Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # + # # + # This software is distributed under the terms of the # + # GNU Lesser General Public Licence (LGPL) version 3, # + # copied verbatim in the file "LICENSE" # + ################################################################################ +MACRO (WRITE_CONFIG_FILE filename) + + String(REGEX REPLACE "^.*(install).*$" "\\1" INSTALL_VERSION ${filename}) + String(COMPARE EQUAL "install" "${INSTALL_VERSION}" INSTALL_TRUE) + + List(REMOVE_ITEM LD_LIBRARY_PATH ${CMAKE_BINARY_DIR}/lib) + + If (INSTALL_TRUE) + SET(_INSTALLDIR ${CMAKE_INSTALL_PREFIX}) + SET(_BINDIR ${CMAKE_INSTALL_PREFIX}/bin) +# SET(VMCWORKDIR ${CMAKE_INSTALL_PREFIX}/share/fairbase) + SET(FAIRLIBDIR ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) + SET(_LD_LIBRARY_PATH ${FAIRLIBDIR} ${LD_LIBRARY_PATH}) + Else (INSTALL_TRUE) + SET(_INSTALLDIR ${CMAKE_BINARY_DIR}) + SET(_BINDIR ${CMAKE_BINARY_DIR}) +# SET(VMCWORKDIR ${CMAKE_SOURCE_DIR}) + SET(FAIRLIBDIR ${CMAKE_BINARY_DIR}/lib) + SET(_LD_LIBRARY_PATH ${FAIRLIBDIR} ${LD_LIBRARY_PATH}) + EndIf (INSTALL_TRUE) + + If(NOT DEFINED FULL_CONFIG_FILE) + Set(FULL_CONFIG_FILE "true") + EndIf(NOT DEFINED FULL_CONFIG_FILE) + + + IF(CMAKE_SYSTEM_NAME MATCHES Linux) + configure_file(${PROJECT_SOURCE_DIR}/cmake/scripts/check_system.sh.in + ${CMAKE_CURRENT_BINARY_DIR}/check_system.sh + ) + configure_file(${PROJECT_SOURCE_DIR}/cmake/scripts/check_system.csh.in + ${CMAKE_CURRENT_BINARY_DIR}/check_system.csh + ) + + EXECUTE_PROCESS(COMMAND lsb_release -sd + OUTPUT_VARIABLE _linux_flavour + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + IF(_linux_flavour) + STRING(REGEX REPLACE "^\"" "" _linux_flavour ${_linux_flavour}) + STRING(REGEX REPLACE "\"$" "" _linux_flavour ${_linux_flavour}) + ENDIF(_linux_flavour) + + EXECUTE_PROCESS(COMMAND uname -m + OUTPUT_VARIABLE _system + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + ElseIf(CMAKE_SYSTEM_NAME MATCHES Darwin) + configure_file(${PROJECT_SOURCE_DIR}/cmake/scripts/check_system_mac.sh.in + ${CMAKE_CURRENT_BINARY_DIR}/check_system.sh + ) + configure_file(${PROJECT_SOURCE_DIR}/cmake/scripts/check_system_mac.csh.in + ${CMAKE_CURRENT_BINARY_DIR}/check_system.csh + ) + EXECUTE_PROCESS(COMMAND uname -sr + OUTPUT_VARIABLE _linux_flavour + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + EXECUTE_PROCESS(COMMAND uname -m + OUTPUT_VARIABLE _system + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + ENDIF(CMAKE_SYSTEM_NAME MATCHES Linux) + + + CONVERT_LIST_TO_STRING(${Geant4_INCLUDE_DIRS}) + Set(Geant4_INCLUDE_DIRS ${output}) + + CONVERT_LIST_TO_STRING(${Geant4VMC_INCLUDE_DIRS}) + Set(Geant4VMC_INCLUDE_DIRS ${output}) + +# CONVERT_LIST_TO_STRING(${Geant4VMC_CMAKE_INSTALL_LIBDIR}) +# Set(Geant4VMC_LIBRARY_DIR ${output}) + + CONVERT_LIST_TO_STRING(${Geant4VMC_MACRO_DIR}) + Set(Geant4VMC_MACRO_DIR ${output}) + + Write_Geant4Data_Variables_sh() + Write_Geant4Data_Variables_csh() + + CONVERT_LIST_TO_STRING(${PYTHIA6_LIBRARY_DIR}) + Set(PYTHIA6_LIBRARY_DIR ${output}) + + CONVERT_LIST_TO_STRING(${Geant3_SYSTEM_DIR}) + Set(G3SYS ${output}) + + CONVERT_LIST_TO_STRING(${Geant3_INCLUDE_DIRS}) + Set(Geant3_INCLUDE_DIRS ${output}) + + CONVERT_LIST_TO_STRING(${Geant3_LIBRARY_DIR}) + Set(Geant3_LIBRARY_DIR ${output}) + + CONVERT_LIST_TO_STRING(${Geant3_LIBRARIES}) + Set(Geant3_LIBRARIES ${output}) + + CONVERT_LIST_TO_STRING(${ROOT_LIBRARY_DIR}) + Set(ROOT_LIBRARY_DIR ${output}) + + CONVERT_LIST_TO_STRING(${ROOT_LIBRARIES}) + Set(ROOT_LIBRARIES ${output}) + + CONVERT_LIST_TO_STRING(${ROOT_INCLUDE_DIR}) + Set(ROOT_INCLUDE_DIR ${output} ) + +# Set(VMCWORKDIR ${C}) + + Set(FAIRLIBDIR ${FAIRLIBDIR}) + + List(APPEND _LD_LIBRARY_PATH ${PYTHIA6_LIBRARY_DIR} ${Geant3_LIBRARY_DIR} ${Geant4VMC_LIBRARY_DIR}) + + List(REMOVE_DUPLICATES _LD_LIBRARY_PATH) + CONVERT_LIST_TO_STRING(${_LD_LIBRARY_PATH}) + + IF(CMAKE_SYSTEM_NAME MATCHES Linux) + Set(MY_LD_LIBRARY_PATH ${output}) + ELSE(CMAKE_SYSTEM_NAME MATCHES Linux) + IF(CMAKE_SYSTEM_NAME MATCHES Darwin) + Set(MY_DYLD_LIBRARY_PATH ${output}) + ENDIF(CMAKE_SYSTEM_NAME MATCHES Darwin) + ENDIF(CMAKE_SYSTEM_NAME MATCHES Linux) + + Set(USE_VGM 1) + + SET(PYTHONPATH ${CMAKE_SOURCE_DIR}/python ${SIMPATH}/lib ${SIMPATH}/lib/root ${SIMPATH}/lib/Geant4 ${SIMPATH}/lib/g4py ${PYTHONPATH}) + UNIQUE(PYTHONPATH "${PYTHONPATH}") + CONVERT_LIST_TO_STRING(${PYTHONPATH}) + SET(MY_PYTHONPATH ${output}) + + SET (PATH ${ROOTSYS}/bin ${PATH}) + UNIQUE(PATH "${PATH}") + CONVERT_LIST_TO_STRING(${PATH}) + Set(MY_PATH ${output}) + + # If(FAIRSOFT_EXTERN) + # Set(PYTHIA8DATA "${SIMPATH}/share/pythia8/xmldoc") + # Else(FAIRSOFT_EXTERN) + # Set(PYTHIA8DATA "${SIMPATH}/generators/pythia8/xmldoc") + # EndIf(FAIRSOFT_EXTERN) + + CONVERT_LIST_TO_STRING(${ROOT_INCLUDE_PATH}) + Set(ROOT_INCLUDE_PATH ${output}) + + IF(${filename} MATCHES "[.]csh.*$") + configure_file(${PROJECT_SOURCE_DIR}/cmake/scripts/config.csh.in + ${CMAKE_CURRENT_BINARY_DIR}/${filename} + ) + ELSE(${filename} MATCHES "[.]csh.*$") + configure_file(${PROJECT_SOURCE_DIR}/cmake/scripts/config.sh.in + ${CMAKE_CURRENT_BINARY_DIR}/${filename} + ) + ENDIF(${filename} MATCHES "[.]csh.*$") + + +ENDMACRO (WRITE_CONFIG_FILE) + + +MACRO (CONVERT_LIST_TO_STRING) + + set (tmp "") + foreach (_current ${ARGN}) + + set(tmp1 ${tmp}) + set(tmp "") + set(tmp ${tmp1}:${_current}) + + endforeach (_current ${ARGN}) + If(tmp) + STRING(REGEX REPLACE "^:(.*)" "\\1" output ${tmp}) + Else(tmp) + Set(output "") + EndIf(tmp) + +ENDMACRO (CONVERT_LIST_TO_STRING LIST) diff --git a/cmake/scripts/check_system.csh.in b/cmake/scripts/check_system.csh.in new file mode 100644 index 0000000000000000000000000000000000000000..ef3d11726159180795385f37256c4ddb06c3e6e1 --- /dev/null +++ b/cmake/scripts/check_system.csh.in @@ -0,0 +1,28 @@ +#!/bin/csh +set linux_flavour=`lsb_release -sd | sed -e 's/^"//' -e 's/"$//'` +set system=`uname -m` +setenv same_system 1 + +echo "System during compilation: $Linux_Flavour_" +echo " $System_" +echo "System now : $linux_flavour" +echo " $system" + +if ( "$linux_flavour" != "$Linux_Flavour_" ) then + echo "You try to run the software on a different" + echo "linux flavour than it was compiled on." + echo "This is normaly a serious error, so we stop" + echo "the execution at this point." + echo "If you know what you do you can change the" + echo "config.csh script to bypass this security issue." + setenv same_system 0 +endif +if ( "$system" != "$System_" ) then + echo "You try to run the software on a different" + echo "linux architecture than it was compiled on." + echo "This is normaly a serious error, so we stop" + echo "the execution at this point." + echo "If you know what you do you can change the" + echo "config.csh script to bypass this security issue." + setenv same_system 0 +endif diff --git a/cmake/scripts/check_system.sh.in b/cmake/scripts/check_system.sh.in new file mode 100644 index 0000000000000000000000000000000000000000..f931bf7e6913688951a79fc71dc80327222a996b --- /dev/null +++ b/cmake/scripts/check_system.sh.in @@ -0,0 +1,30 @@ +#!/bin/bash +linux_flavour=$(lsb_release -sd | sed -e 's/^"//' -e 's/"$//') +system=$(uname -m) +same_system=1 + +echo "System during compilation: $Linux_Flavour_" +echo " $System_" +echo "System now : $linux_flavour" +echo " $system" + +if [ ! "$linux_flavour" = "$Linux_Flavour_" ]; then + echo "You try to run the software on a different" + echo "linux flavour than it was compiled on." + echo "This is normaly a serious error, so we stop" + echo "the execution at this point." + echo "If you know what you do you can change the" + echo "config.sh script to bypass this security issue." + same_system=0 +fi +if [ ! "$system" = "$System_" ]; then + echo "You try to run the software on a different" + echo "linux architecture than it was compiled on." + echo "This is normaly a serious error, so we stop" + echo "the execution at this point." + echo "If you know what you do you can change the" + echo "config.sh script to bypass this security issue." + same_system=0 +fi + +export same_system diff --git a/cmake/scripts/check_system_mac.csh.in b/cmake/scripts/check_system_mac.csh.in new file mode 100644 index 0000000000000000000000000000000000000000..82e58521f6314578ed5c43ab3e3d137a7579f56c --- /dev/null +++ b/cmake/scripts/check_system_mac.csh.in @@ -0,0 +1,29 @@ +#!/bin/csh +set linux_flavour=`uname -sr` +set system=`uname -m` +setenv same_system 1 + +echo "System during compilation: $Linux_Flavour_" +echo " $System_" +echo "System now : $linux_flavour" +echo " $system" + +if ( "$linux_flavour" != "$Linux_Flavour_" ) then + echo "You try to run the software on a different" + echo "OSX flavour than it was compiled on." + echo "This is normaly a serious error, so we stop" + echo "the execution at this point." + echo "If you know what you do you can change the" + echo "config.csh script to bypass this security issue." + setenv same_system 0 +endif +if ( "$system" != "$System_" ) then + echo "You try to run the software on a different" + echo "OSX architecture than it was compiled on." + echo "This is normaly a serious error, so we stop" + echo "the execution at this point." + echo "If you know what you do you can change the" + echo "config.csh script to bypass this security issue." + setenv same_system 0 +endif + diff --git a/cmake/scripts/check_system_mac.sh.in b/cmake/scripts/check_system_mac.sh.in new file mode 100644 index 0000000000000000000000000000000000000000..f7957fd60fd33167571da35d218b305388f88b18 --- /dev/null +++ b/cmake/scripts/check_system_mac.sh.in @@ -0,0 +1,30 @@ +#!/bin/bash +linux_flavour=$(uname -sr) +system=$(uname -m) +same_system=1 + +echo "System during compilation: $Linux_Flavour_" +echo " $System_" +echo "System now : $linux_flavour" +echo " $system" + +if [ ! "$linux_flavour" = "$Linux_Flavour_" ]; then + echo "You try to run the software on a different" + echo "OSX flavour than it was compiled on." + echo "This is normaly a serious error, so we stop" + echo "the execution at this point." + echo "If you know what you do you can change the" + echo "config.sh script to bypass this security issue." + same_system=0 +fi +if [ ! "$system" = "$System_" ]; then + echo "You try to run the software on a different" + echo "OSX architecture than it was compiled on." + echo "This is normaly a serious error, so we stop" + echo "the execution at this point." + echo "If you know what you do you can change the" + echo "config.sh script to bypass this security issue." + same_system=0 +fi + +export same_system diff --git a/cmake/scripts/config.csh.in b/cmake/scripts/config.csh.in new file mode 100644 index 0000000000000000000000000000000000000000..b2ff55b15d50f142c1582fcd93ed780a10d54252 --- /dev/null +++ b/cmake/scripts/config.csh.in @@ -0,0 +1,51 @@ +#!/bin/csh + +setenv Linux_Flavour_ "@_linux_flavour@" +setenv System_ "@_system@" +. @_BINDIR@/check_system.csh +if ( "$same_system" == "1" ) then + setenv SIMPATH "@SIMPATH@" + setenv ROOTSYS "@ROOTSYS@" + setenv FAIRROOTPATH "@FAIRROOTPATH@" + if ( @FULL_CONFIG_FILE@ == true ) then + setenv Geant4_INCLUDE_DIRS "@Geant4_INCLUDE_DIRS@" + setenv Geant4VMC_INCLUDE_DIRS "@Geant4VMC_INCLUDE_DIRS@" + setenv Geant4VMC_LIBRARY_DIR "@Geant4VMC_LIBRARY_DIR@" + setenv Geant4VMC_MACRO_DIR "@Geant4VMC_MACRO_DIR@" + setenv PYTHIA6_LIBRARY_DIR "@PYTHIA6_LIBRARY_DIR@" + setenv Geant3_INCLUDE_DIRS "@Geant3_INCLUDE_DIRS@" + setenv G3SYS "@G3SYS@" + setenv Geant3_LIBRARY_DIR "@Geant3_LIBRARY_DIR@" + setenv USE_VGM "1" + setenv PYTHIA8DATA "@PYTHIA8DATA@" + + @Geant4Data_Variables_csh@ + + endif + setenv Geant3_INCLUDE_DIRS "@Geant3_INCLUDE_DIRS@" + setenv ROOT_LIBRARY_DIR "@ROOT_LIBRARY_DIR@" + setenv ROOT_LIBRARIES "@ROOT_LIBRARIES@" + setenv ROOT_INCLUDE_DIR "@ROOT_INCLUDE_DIR@" + setenv ROOT_INCLUDE_PATH "@Geant3_INCLUDE_DIRS@:@ROOT_INCLUDE_PATH@" + setenv VMCWORKDIR "@VMCWORKDIR@" + setenv FAIRLIBDIR "@FAIRLIBDIR@" + setenv PYTHONPATH "@MY_PYTHONPATH@" + switch( $1 ) + case '-a' : + setenv DYLD_LIBRARY_PATH $DYLD_LIBRARY_PATH:"@MY_DYLD_LIBRARY_PATH@" + setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH:"@MY_LD_LIBRARY_PATH@" + setenv PATH $PATH:"@MY_PATH@" + breaksw + case '-p' : + setenv DYLD_LIBRARY_PATH="@MY_DYLD_LIBRARY_PATH@":$DYLD_LIBRARY_PATH + setenv LD_LIBRARY_PATH="@MY_LD_LIBRARY_PATH@":$LD_LIBRARY_PATH + setenv PATH="@MY_PATH@":$PATH + echo "hello" + breaksw + case * : + setenv DYLD_LIBRARY_PATH="@MY_DYLD_LIBRARY_PATH@" + setenv LD_LIBRARY_PATH="@MY_LD_LIBRARY_PATH@" + setenv PATH="@MY_PATH@" + breaksw + endsw +endif diff --git a/cmake/scripts/config.sh.in b/cmake/scripts/config.sh.in new file mode 100644 index 0000000000000000000000000000000000000000..76f286eeefb4cda73f2510f7ad7c2420cbc17575 --- /dev/null +++ b/cmake/scripts/config.sh.in @@ -0,0 +1,49 @@ +#!/bin/bash + +export Linux_Flavour_="@_linux_flavour@" +export System_="@_system@" +. @_BINDIR@/check_system.sh +if [ $same_system -eq 1 ]; then + export SIMPATH="@SIMPATH@" + export ROOTSYS="@ROOTSYS@" + export FAIRROOTPATH="@FAIRROOTPATH@" + if (@FULL_CONFIG_FILE@); then + export Geant4_INCLUDE_DIRS="@Geant4_INCLUDE_DIRS@" + export Geant4VMC_INCLUDE_DIRS="@Geant4VMC_INCLUDE_DIRS@" + export Geant4VMC_LIBRARY_DIR="@Geant4VMC_LIBRARY_DIR@" + export Geant4VMC_MACRO_DIR="@Geant4VMC_MACRO_DIR@" + export PYTHIA6_LIBRARY_DIR="@PYTHIA6_LIBRARY_DIR@" + export Geant3_INCLUDE_DIRS="@Geant3_INCLUDE_DIRS@" + export G3SYS="@G3SYS@" + export Geant3_LIBRARY_DIR="@Geant3_LIBRARY_DIR@" + export USE_VGM="1" + export PYTHIA8DATA="@PYTHIA8DATA@" + + @Geant4Data_Variables_sh@ + fi + export Geant3_INCLUDE_DIRS="@Geant3_INCLUDE_DIRS@" + export ROOT_LIBRARY_DIR="@ROOT_LIBRARY_DIR@" + export ROOT_LIBRARIES="@ROOT_LIBRARIES@" + export ROOT_INCLUDE_DIR="@ROOT_INCLUDE_DIR@" + export ROOT_INCLUDE_PATH="@Geant3_INCLUDE_DIRS@:@ROOT_INCLUDE_PATH@" + export VMCWORKDIR="@VMCWORKDIR@" + export FAIRLIBDIR="@FAIRLIBDIR@" + export PYTHONPATH="@MY_PYTHONPATH@" + case $1 in + -a | --append ) + export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:"@MY_DYLD_LIBRARY_PATH@" + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"@MY_LD_LIBRARY_PATH@" + export PATH=$PATH:"@MY_PATH@" + ;; + -p | --prepend ) + export DYLD_LIBRARY_PATH="@MY_DYLD_LIBRARY_PATH@":$DYLD_LIBRARY_PATH + export LD_LIBRARY_PATH="@MY_LD_LIBRARY_PATH@":$LD_LIBRARY_PATH + export PATH="@MY_PATH@":$PATH + ;; + * ) + export DYLD_LIBRARY_PATH="@MY_DYLD_LIBRARY_PATH@" + export LD_LIBRARY_PATH="@MY_LD_LIBRARY_PATH@" + export PATH="@MY_PATH@" + ;; + esac +fi diff --git a/cmake/scripts/root_macro.sh.in b/cmake/scripts/root_macro.sh.in new file mode 100644 index 0000000000000000000000000000000000000000..535797a33baea0155e84c7040226a16de76d0072 --- /dev/null +++ b/cmake/scripts/root_macro.sh.in @@ -0,0 +1,45 @@ +#!/bin/bash + +# This macro is needed to start the Root macros used for automatic testing +# from inside CMake using the add_test functionality. Since the tests +# starts with a fresh environment on has to set first the correct environment +# needed to run FairRoot. +# Also parameters defined in add_test will be converted in the correct format +# to be passed to root. + +# Setup the needed environment +export LD_LIBRARY_PATH=@MY_LD_LIBRARY_PATH@:$LD_LIBRARY_PATH +export DYLD_LIBRARY_PATH=@MY_LD_LIBRARY_PATH@:$DYLD_LIBRARY_PATH +export PATH=@SIMPATH@/bin:$PATH:@Geant4_DIR@ +export ROOTSYS=@ROOTSYS@ +export ROOTEXE=@ROOT_EXECUTABLE@ +export ROOT_INCLUDE_PATH=@Geant3_INCLUDE_DIRS@:@MY_ROOT_INCLUDE_PATH@ +export FAIRROOTPATH="@FAIRROOTPATH@" +export VMCWORKDIR=@VMCWORKDIR@ +export Geant4VMC_MACRO_DIR=@Geant4VMC_MACRO_DIR@ +export USE_VGM=1 +export BOOST=@Boost_Avail@ + +@Geant4Data_Variables_sh@ + +export G3SYS="@Geant3_SYSTEM_DIR@" +export PYTHIA8DATA="@PYTHIA8DATA@" +if [ -e @Geant4_DIR@/env.sh ]; then + . @Geant4_DIR@/env.sh +fi + +# Concatenate all parameters given on the command line to one +# comma separated string +parameters="" +for i in $*; do + if [ -z $parameters ]; then + parameters=$i + else + parameters=$(echo "$parameters,$i") + fi +done + +cd @new_path@ + +# execute root with the defined macro and the command line parameters +$ROOTEXE -q -b @my_script_name@\($parameters\) diff --git a/cmake/scripts/set_env.sh.in b/cmake/scripts/set_env.sh.in new file mode 100644 index 0000000000000000000000000000000000000000..6a7e742abdb4516610a9d5910a3431915186ece8 --- /dev/null +++ b/cmake/scripts/set_env.sh.in @@ -0,0 +1,25 @@ +#!/bin/bash + +# Setup the needed environment +export LD_LIBRARY_PATH=@MY_LD_LIBRARY_PATH@:$LD_LIBRARY_PATH +export DYLD_LIBRARY_PATH=@MY_LD_LIBRARY_PATH@:$DYLD_LIBRARY_PATH +export PATH=@SIMPATH@/bin:$PATH:@Geant4_DIR@ +export ROOTSYS=@ROOTSYS@ +export ROOTEXE=@ROOT_EXECUTABLE@ +export ROOT_INCLUDE_PATH="@Geant3_INCLUDE_DIRS@:@MY_ROOT_INCLUDE_PATH@" +export VMCWORKDIR=@VMCWORKDIR@ +export Geant4VMC_MACRO_DIR=@Geant4VMC_MACRO_DIR@ +export USE_VGM=1 +export BOOST=@Boost_Avail@ + +@Geant4Data_Variables_sh@ + +export G3SYS="@Geant3_SYSTEM_DIR@" +export PYTHIA8DATA="@PYTHIA8DATA@" +if [ -e @Geant4_DIR@/env.sh ]; then + . @Geant4_DIR@/env.sh +fi + +cd @new_path@ + +source @my_script_name@