Files
musrsim/cmake/FindROOT.cmake

222 lines
6.7 KiB
CMake

# - Find a ROOT installation through root-config.
#
# Defines ROOT_FOUND, ROOT_VERSION, ROOTSYS, ROOT_INCLUDE_DIR,
# ROOT_LIBRARY_DIR, ROOT_BINARY_DIR, ROOT_LIBRARIES, and ROOT_CINT_EXECUTABLE.
message(STATUS "Looking for ROOT...")
set(ROOT_DEFINITIONS "")
set(ROOT_INSTALLED_VERSION_TOO_OLD FALSE)
find_program(ROOT_CONFIG_EXECUTABLE
NAMES root-config
HINTS
"$ENV{ROOTSYS}/bin"
"${SIMPATH}/tools/root/bin"
)
if(NOT ROOT_CONFIG_EXECUTABLE)
message(FATAL_ERROR
"ROOT was not found. Set ROOTSYS or add root-config to PATH."
)
endif()
function(_root_config output_variable option)
execute_process(
COMMAND "${ROOT_CONFIG_EXECUTABLE}" "${option}"
RESULT_VARIABLE result
OUTPUT_VARIABLE output
ERROR_VARIABLE error
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT result EQUAL 0)
message(FATAL_ERROR
"root-config ${option} failed with exit code ${result}: ${error}"
)
endif()
set("${output_variable}" "${output}" PARENT_SCOPE)
endfunction()
_root_config(ROOTSYS --prefix)
_root_config(ROOT_VERSION --version)
if(NOT ROOT_MIN_VERSION)
set(ROOT_MIN_VERSION "5.00.00")
endif()
string(REGEX MATCH "^[0-9]+[./][0-9]+([./][0-9]+)?"
ROOT_VERSION_NUMBER "${ROOT_VERSION}")
if(NOT ROOT_VERSION_NUMBER)
message(FATAL_ERROR "Could not parse ROOT version '${ROOT_VERSION}'")
endif()
string(REPLACE "/" "." ROOT_VERSION_NUMBER "${ROOT_VERSION_NUMBER}")
string(REPLACE "/" "." ROOT_MIN_VERSION_NUMBER "${ROOT_MIN_VERSION}")
if(ROOT_VERSION_NUMBER VERSION_LESS ROOT_MIN_VERSION_NUMBER)
set(ROOT_INSTALLED_VERSION_TOO_OLD TRUE)
message(FATAL_ERROR
"ROOT ${ROOT_VERSION} is too old; version ${ROOT_MIN_VERSION} or newer is required"
)
endif()
_root_config(ROOT_LIBRARY_DIR --libdir)
_root_config(ROOT_BINARY_DIR --bindir)
_root_config(ROOT_INCLUDE_DIR --incdir)
_root_config(ROOT_LIBRARIES --glibs)
if(NOT IS_DIRECTORY "${ROOT_LIBRARY_DIR}")
message(FATAL_ERROR
"root-config reported a missing library directory: ${ROOT_LIBRARY_DIR}"
)
endif()
if(NOT IS_DIRECTORY "${ROOT_INCLUDE_DIR}")
message(FATAL_ERROR
"root-config reported a missing include directory: ${ROOT_INCLUDE_DIR}"
)
endif()
set(ROOT_FOUND TRUE)
set(ROOT_INCLUDES "${ROOT_INCLUDE_DIR}")
set(LD_LIBRARY_PATH ${LD_LIBRARY_PATH} "${ROOT_LIBRARY_DIR}")
find_program(ROOT_CINT_EXECUTABLE
NAMES rootcint rootcling
HINTS "${ROOT_BINARY_DIR}"
)
mark_as_advanced(
ROOT_CONFIG_EXECUTABLE
ROOT_CINT_EXECUTABLE
ROOT_LIBRARY_DIR
ROOT_INCLUDE_DIR
ROOT_DEFINITIONS
)
message(STATUS
"Looking for ROOT... found ${ROOTSYS} (version ${ROOT_VERSION})"
)
###########################################
#
# Macros for building ROOT dictionary
#
###########################################
MACRO (ROOT_GENERATE_DICTIONARY_OLD )
set(INFILES "")
foreach (_current_FILE ${ARGN})
IF (${_current_FILE} MATCHES "^.*\\.h$")
IF (${_current_FILE} MATCHES "^.*Link.*$")
set(LINKDEF_FILE ${_current_FILE})
ELSE (${_current_FILE} MATCHES "^.*Link.*$")
set(INFILES ${INFILES} ${_current_FILE})
ENDIF (${_current_FILE} MATCHES "^.*Link.*$")
ELSE (${_current_FILE} MATCHES "^.*\\.h$")
IF (${_current_FILE} MATCHES "^.*\\.cxx$")
set(OUTFILE ${_current_FILE})
ELSE (${_current_FILE} MATCHES "^.*\\.cxx$")
set(INCLUDE_DIRS ${INCLUDE_DIRS} -I${_current_FILE})
ENDIF (${_current_FILE} MATCHES "^.*\\.cxx$")
ENDIF (${_current_FILE} MATCHES "^.*\\.h$")
endforeach (_current_FILE ${ARGN})
# MESSAGE("INFILES: ${INFILES}")
# MESSAGE("OutFILE: ${OUTFILE}")
# MESSAGE("LINKDEF_FILE: ${LINKDEF_FILE}")
# MESSAGE("INCLUDE_DIRS: ${INCLUDE_DIRS}")
STRING(REGEX REPLACE "(^.*).cxx" "\\1.h" bla "${OUTFILE}")
# MESSAGE("BLA: ${bla}")
SET (OUTFILES ${OUTFILE} ${bla})
ADD_CUSTOM_COMMAND(OUTPUT ${OUTFILES}
COMMAND ${ROOT_CINT_EXECUTABLE}
ARGS -f ${OUTFILE} -c -DHAVE_CONFIG_H ${INCLUDE_DIRS} ${INFILES} ${LINKDEF_FILE} DEPENDS ${INFILES})
# MESSAGE("ROOT_CINT_EXECUTABLE has created the dictionary ${OUTFILE}")
ENDMACRO (ROOT_GENERATE_DICTIONARY_OLD)
###########################################
#
# Macros for building ROOT dictionary
#
###########################################
MACRO (ROOT_GENERATE_DICTIONARY INFILES LINKDEF_FILE OUTFILE INCLUDE_DIRS_IN)
set(INCLUDE_DIRS)
foreach (_current_FILE ${INCLUDE_DIRS_IN})
set(INCLUDE_DIRS ${INCLUDE_DIRS} -I${_current_FILE})
endforeach (_current_FILE ${INCLUDE_DIRS_IN})
# MESSAGE("INFILES: ${INFILES}")
# MESSAGE("OutFILE: ${OUTFILE}")
# MESSAGE("LINKDEF_FILE: ${LINKDEF_FILE}")
# MESSAGE("INCLUDE_DIRS: ${INCLUDE_DIRS}")
STRING(REGEX REPLACE "^(.*)\\.(.*)$" "\\1.h" bla "${OUTFILE}")
# MESSAGE("BLA: ${bla}")
SET (OUTFILES ${OUTFILE} ${bla})
if (CMAKE_SYSTEM_NAME MATCHES Linux)
ADD_CUSTOM_COMMAND(OUTPUT ${OUTFILES}
COMMAND LD_LIBRARY_PATH=${ROOT_LIBRARY_DIR} ROOTSYS=${ROOTSYS} ${ROOT_CINT_EXECUTABLE}
ARGS -f ${OUTFILE} -c -DHAVE_CONFIG_H ${INCLUDE_DIRS} ${INFILES} ${LINKDEF_FILE} DEPENDS ${INFILES} ${LINKDEF_FILE})
else (CMAKE_SYSTEM_NAME MATCHES Linux)
if (CMAKE_SYSTEM_NAME MATCHES Darwin)
ADD_CUSTOM_COMMAND(OUTPUT ${OUTFILES}
COMMAND DYLD_LIBRARY_PATH=${ROOT_LIBRARY_DIR} ROOTSYS=${ROOTSYS} ${ROOT_CINT_EXECUTABLE}
ARGS -f ${OUTFILE} -c -DHAVE_CONFIG_H ${INCLUDE_DIRS} ${INFILES} ${LINKDEF_FILE} DEPENDS ${INFILES} ${LINKDEF_FILE})
endif (CMAKE_SYSTEM_NAME MATCHES Darwin)
endif (CMAKE_SYSTEM_NAME MATCHES Linux)
ENDMACRO (ROOT_GENERATE_DICTIONARY)
MACRO (GENERATE_ROOT_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")
#MESSAGE("PATH: ${path_name}")
#MESSAGE("Ext: ${file_extension}")
#MESSAGE("Name: ${file_name}")
#MESSAGE("Shell Name: ${shell_script_name}")
string(REPLACE ${PROJECT_SOURCE_DIR}
${PROJECT_BINARY_DIR} new_path ${path_name}
)
#MESSAGE("New PATH: ${new_path}")
file(MAKE_DIRECTORY ${new_path}/data)
CONVERT_LIST_TO_STRING(${LD_LIBRARY_PATH})
set(MY_LD_LIBRARY_PATH ${output})
set(my_script_name ${SCRIPT_FULL_NAME})
if(CMAKE_SYSTEM MATCHES Darwin)
configure_file(${PROJECT_SOURCE_DIR}/cmake/scripts/root_macro_macos.sh.in
${new_path}/${shell_script_name}
)
else(CMAKE_SYSTEM MATCHES Darwin)
configure_file(${PROJECT_SOURCE_DIR}/cmake/scripts/root_macro.sh.in
${new_path}/${shell_script_name}
)
endif(CMAKE_SYSTEM MATCHES Darwin)
execute_process(COMMAND /bin/chmod u+x "${new_path}/${shell_script_name}")
ENDMACRO (GENERATE_ROOT_TEST_SCRIPT)