242 lines
8.5 KiB
CMake
242 lines
8.5 KiB
CMake
# - CmakeLists.txt for G4mpi interface
|
|
|
|
#------------------------------------------------------------------------------
|
|
set(_projname libG4mpi)
|
|
set(_targetname G4mpi)
|
|
project(${_projname})
|
|
|
|
#------------------------------------------------------------------------------
|
|
#Manadatory dependencies
|
|
|
|
cmake_minimum_required(VERSION 3.3 FATAL_ERROR)
|
|
find_package(MPI REQUIRED)
|
|
find_package(Geant4 10.2.0 REQUIRED)
|
|
include(${Geant4_USE_FILE})
|
|
|
|
#------------------------------------------------------------------------------
|
|
message("-- G4 Examples: ${_projname} uses includes from: "
|
|
"${MPI_CXX_INCLUDE_PATH}")
|
|
message("-- G4 Examples: ${_projname} uses libraries: ${MPI_CXX_LIBRARIES}")
|
|
|
|
#Version of this package is the same as the G4 version
|
|
set(${_targetname}_VERSION ${Geant4_VERSION})
|
|
set(${_targetname}_VERSION_MAJOR ${Geant4_VERSION_MAJOR})
|
|
set(${_targetname}_VERSION_MINOR ${Geant4_VERSION_MINOR})
|
|
set(${_targetname}_VERSION_PATCH ${Geant4_VERSION_PATCH})
|
|
|
|
#------------------------------------------------------------------------------
|
|
#Options for this package
|
|
option(BUILD_SHARED_LIBS "If true build shared library" ON)
|
|
option(BUILD_STATIC_LIBS "If true build static library" OFF)
|
|
option(G4MPI_OLD_MPI "If true use old signatures for MPI_[Un]Pack functions"
|
|
OFF)
|
|
mark_as_advanced(G4MPI_OLD_MPI)
|
|
|
|
# Offer the user the choice of overriding the installation directories
|
|
set(INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries")
|
|
set(INSTALL_BIN_DIR bin CACHE PATH "Installation directory for executables")
|
|
set(INSTALL_INCLUDE_DIR include CACHE PATH
|
|
"Installation directory for header files")
|
|
#INSTALL_CMAKE_DIR is set later
|
|
|
|
#------------------------------------------------------------------------------
|
|
#Setup compilation options specific to this project
|
|
add_definitions(-DTOOLS_USE_NATIVE_MPI)
|
|
if(G4MPI_OLD_MPI)
|
|
message("-- G4 Examples: ${_projname} using old non-const signatures for"
|
|
"MPI_[Un]Pack functions")
|
|
add_definitions(-DTOOLS_USE_MPI_PACK_NOT_CONST)
|
|
add_definitions(-DG4MPI_USE_MPI_PACK_NOT_CONST)
|
|
# Prevent warning with c++11 on old MPI
|
|
add_definitions(-Wno-literal-suffix)
|
|
endif()
|
|
|
|
#------------------------------------------------------------------------------
|
|
#TODO: ??? What is G4 policy on this?
|
|
#if(Geant4_static_FOUND)
|
|
# set(BUILD_STATIC_LIBS ON)
|
|
# set(BUILD_SHARED_LIBS OFF)
|
|
#else()
|
|
# set(BUILD_STATIC_LIBS OFF)
|
|
# set(BUILD_SHARED_LIBS ON)
|
|
#endif()
|
|
|
|
#------------------------------------------------------------------------------
|
|
# Define library
|
|
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include
|
|
${Geant4_INCLUDE_DIR}
|
|
${MPI_CXX_INCLUDE_PATH})
|
|
link_directories(${MPI_CXX_LIBRARY_DIRS})
|
|
|
|
set(_sources
|
|
src/G4MPIbatch.cc
|
|
src/G4MPImanager.cc
|
|
src/G4MPImessenger.cc
|
|
src/G4MPIrandomSeedGenerator.cc
|
|
src/G4MPIsession.cc
|
|
src/G4MPIstatus.cc
|
|
src/G4UImpish.cc
|
|
src/G4VMPIseedGenerator.cc
|
|
src/G4VMPIsession.cc
|
|
src/G4MPIscorerMerger.cc
|
|
src/G4MPIhistoMerger.cc
|
|
src/G4VUserMPIrunMerger.cc
|
|
src/G4MPIutils.cc
|
|
)
|
|
|
|
#TODO: This works only if both BUILD_STATIC_LIBS=ON && BUILD_SHARED_LIBS=OFF
|
|
# are explicitly specified, what should be the behavior if only
|
|
# BUILD_STATIC_LIBS is specified?
|
|
# In Geant4 both are created: libXXX.so and libXXX.a with two target names
|
|
# XXX and XXX-static. I should study how to do that...
|
|
if(NOT BUILD_SHARED_LIBS AND NOT BUILD_STATIC_LIBS)
|
|
message(FATAL "-- G4 Examples: ${_projname} neither static of shared build selected")
|
|
return()
|
|
endif()
|
|
if(BUILD_STATIC_LIBS)
|
|
add_library(${_targetname}-static STATIC ${_sources})
|
|
set_target_properties(${_targetname}-static PROPERTIES OUTPUT_NAME ${_targetname})
|
|
target_link_libraries(${_targetname}-static ${MPI_CXX_LIBRARIES} ${Geant4_LIBRARIES})
|
|
endif()
|
|
if(BUILD_SHARED_LIBS)
|
|
add_library(${_targetname} SHARED ${_sources})
|
|
target_link_libraries(${_targetname} ${MPI_CXX_LIBRARIES} ${Geant4_LIBRARIES})
|
|
endif()
|
|
|
|
|
|
# headers
|
|
set(HEADERS
|
|
include/G4MPIbatch.hh
|
|
include/G4MPImanager.hh
|
|
include/G4MPImessenger.hh
|
|
include/G4MPIrandomSeedGenerator.hh
|
|
include/G4MPIsession.hh
|
|
include/G4MPIstatus.hh
|
|
include/G4UImpish.hh
|
|
include/G4VMPIseedGenerator.hh
|
|
include/G4VMPIsession.hh
|
|
include/G4MPIscorerMerger.hh
|
|
include/G4MPIrunMerger.hh
|
|
include/G4MPIhistoMerger.hh
|
|
include/G4VUserMPIrunMerger.hh
|
|
include/G4MPIutils.hh
|
|
)
|
|
|
|
#------------------------------------------------------------------------------
|
|
# Overwrite "lib" path w/ "lib64" if needed
|
|
set(_LIBDIR_DEFAULT "lib")
|
|
set(_dolib64 FALSE)
|
|
if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
|
|
set(_dolib64 TRUE)
|
|
endif()
|
|
#If this is built as part of G4 CMAKE_INSTALL_LIBDIR is defined, we need to
|
|
#so force check of what we should use
|
|
include(Geant4MacroLibraryTargets OPTIONAL RESULT_VARIABLE _internal_build)
|
|
if(_internal_build)
|
|
set(_dolib64 TRUE)
|
|
endif()
|
|
if(${_dolib64})
|
|
# Override this default 'lib' with 'lib64' iff:
|
|
# - we are on Linux system but NOT cross-compiling
|
|
# - we are NOT on debian
|
|
# - we are on a 64 bits system
|
|
# reason is: amd64 ABI: http://www.x86-64.org/documentation/abi.pdf
|
|
# Note that the future of multi-arch handling may be even
|
|
# more complicated than that: http://wiki.debian.org/Multiarch
|
|
if(CMAKE_SYSTEM_NAME MATCHES "Linux"
|
|
AND NOT CMAKE_CROSSCOMPILING
|
|
AND NOT EXISTS "/etc/debian_version")
|
|
if(NOT DEFINED CMAKE_SIZEOF_VOID_P)
|
|
message(AUTHOR_WARNING
|
|
"Unable to determine default CMAKE_INSTALL_LIBDIR directory because "
|
|
"no target architecture is known. "
|
|
"Please enable at least one language before including GNUInstallDirs.")
|
|
else()
|
|
if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
|
|
set(_LIBDIR_DEFAULT "lib64")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
set(CMAKE_INSTALL_LIBDIR "${_LIBDIR_DEFAULT}" CACHE PATH "object code libraries (${_LIBDIR_DEFAULT})")
|
|
set(INSTALL_LIB_DIR ${CMAKE_INSTALL_LIBDIR})
|
|
endif()
|
|
|
|
#Set Location of .cmake files
|
|
if(WIN32 AND NOT CYGWIN)
|
|
set(DEF_INSTALL_CMAKE_DIR CMake)
|
|
else()
|
|
set(DEF_INSTALL_CMAKE_DIR
|
|
${_LIBDIR_DEFAULT}/${_targetname}-${${_targetname}_VERSION})
|
|
endif()
|
|
set(INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH
|
|
"Installation directory for CMake files")
|
|
|
|
# Make relative paths absolute (needed later on)
|
|
foreach(p LIB BIN INCLUDE CMAKE)
|
|
set(var INSTALL_${p}_DIR)
|
|
if(NOT IS_ABSOLUTE "${${var}}")
|
|
set(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}")
|
|
endif()
|
|
endforeach()
|
|
|
|
#------------------------------------------------------------------------------
|
|
#install
|
|
if(BUILD_SHARED_LIBS)
|
|
INSTALL(TARGETS ${_targetname}
|
|
EXPORT ${_targetname}Targets
|
|
LIBRARY DESTINATION ${INSTALL_LIB_DIR} COMPONENT shlib)
|
|
endif()
|
|
if(BUILD_STATIC_LIBS)
|
|
INSTALL(TARGETS ${_targetname}-static
|
|
EXPORT ${_targetname}Targets
|
|
ARCHIVE DESTINATION ${INSTALL_LIB_DIR} COMPONENT dev)
|
|
endif()
|
|
INSTALL(FILES ${HEADERS} DESTINATION include)
|
|
|
|
#G4mpiTargets.cmake files
|
|
if(BUILD_SHARED_LIBS)
|
|
export(TARGETS ${_targetname}
|
|
FILE "${PROJECT_BINARY_DIR}/${_targetname}Targets.cmake")
|
|
endif()
|
|
if(BUILD_STATIC_LIBS)
|
|
export(TARGETS ${_targetname}-static
|
|
FILE "${PROJECT_BINARY_DIR}/${_targetname}Targets.cmake")
|
|
endif()
|
|
# Export the package for use from the build-tree
|
|
# (this registers the build-tree with a global CMake-registry)
|
|
export(PACKAGE ${_projname})
|
|
|
|
# Create the G4mpiConfig.cmake and G4mpiConfigVersion files
|
|
set(TARGET_STATIC OFF)
|
|
if(BUILD_STATIC_LIBS AND NOT BUILD_SHARED_LIBS)#If both are activated, prefer shared
|
|
set(TARGET_STATIC ON)
|
|
endif()
|
|
file(RELATIVE_PATH REL_INCLUDE_DIR "${INSTALL_CMAKE_DIR}"
|
|
"${INSTALL_INCLUDE_DIR}")
|
|
# ... for the build tree
|
|
set(TARGET_NAME ${_targetname})
|
|
set(CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/include")
|
|
file(RELATIVE_PATH REL_INCLUDE_DIR "${INSTALL_CMAKE_DIR}"
|
|
"${INSTALL_INCLUDE_DIR}")
|
|
configure_file(G4mpiConfig.cmake.in
|
|
"${PROJECT_BINARY_DIR}/${_targetname}Config.cmake" @ONLY)
|
|
# ... for the install tree
|
|
set(CONF_INCLUDE_DIRS "\${${_targetname}_CMAKE_DIR}/${REL_INCLUDE_DIR}")
|
|
configure_file(${_targetname}Config.cmake.in
|
|
"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${_targetname}Config.cmake" @ONLY)
|
|
# ... for both
|
|
set(THE_VERSION ${${_targetname}_VERSION})
|
|
configure_file(G4mpiConfigVersion.cmake.in
|
|
"${PROJECT_BINARY_DIR}/${_targetname}ConfigVersion.cmake" @ONLY)
|
|
|
|
# Install the G4mpiConfig.cmake
|
|
install(FILES
|
|
"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${_targetname}Config.cmake"
|
|
"${PROJECT_BINARY_DIR}/${_targetname}ConfigVersion.cmake"
|
|
DESTINATION "${INSTALL_CMAKE_DIR}" COMPONENT dev)
|
|
# Install the export set for use with the install-tree
|
|
install(EXPORT ${_targetname}Targets DESTINATION
|
|
"${INSTALL_CMAKE_DIR}" COMPONENT dev)
|
|
|
|
|