diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1cfdaea6950f3fbc90c0a131dfc742e01d7d8615..a4d0b4e30146636b18287bd999d8e7f3e6f703d2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,7 +16,7 @@ endif()
#-----------------------------------------------------------------------
# - Define CMake requirements and override make rules as needed
#
-cmake_minimum_required(VERSION 3.8 FATAL_ERROR)
+cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
# - Any policy requirements should go here
diff --git a/cmake/Modules/G4BuildSettings.cmake b/cmake/Modules/G4BuildSettings.cmake
index 7d04e253ac8540e27fd0986fcd5f87f878dc3b93..ddf6cf8a3912d79494ca06d0550e18f86c13f2b7 100644
--- a/cmake/Modules/G4BuildSettings.cmake
+++ b/cmake/Modules/G4BuildSettings.cmake
@@ -340,20 +340,16 @@ endif()
# both types. If neither is selected, an error is emitted.
#
option(BUILD_SHARED_LIBS "Build Geant4 shared libraries" ON)
-option(BUILD_SHARED_SINGLE_LIB "Build Geant4 into a single dynamic library" OFF) #CM
option(BUILD_STATIC_LIBS "Build Geant4 static libraries" OFF)
-mark_as_advanced(BUILD_SHARED_LIBS BUILD_SHARED_SINGLE_LIB BUILD_STATIC_LIBS) #CM
+option(BUILD_SINGLE_LIB "Build Geant4 into a single library" OFF)
+mark_as_advanced(BUILD_SHARED_LIBS BUILD_SINGLE_LIB BUILD_STATIC_LIBS)
# Because both could be switched off accidently, FATAL_ERROR if neither
# option has been selected.
-if(NOT BUILD_STATIC_LIBS AND NOT BUILD_SHARED_LIBS AND NOT BUILD_SHARED_SINGLE_LIB) #CM
+if(NOT BUILD_STATIC_LIBS AND NOT BUILD_SHARED_LIBS)
message(FATAL_ERROR "Neither static nor shared libraries will be built")
endif()
-if(BUILD_SHARED_SINGLE_LIB) #CM
- set(BUILD_SHARED_LIBS ON)
-endif()
-
# Always build global libraries - always FATAL_ERROR if old
# granular library switch is set, e.g. from command line
if(GEANT4_BUILD_GRANULAR_LIBS)
diff --git a/cmake/Modules/G4DeveloperAPI_OLD.cmake b/cmake/Modules/G4DeveloperAPI_OLD.cmake
index 6eb7b205c6c1dd4294abc720c0b9dc1464a3a0ad..5dc8e7674d441b619d96d4b1025699a36f37fbe9 100644
--- a/cmake/Modules/G4DeveloperAPI_OLD.cmake
+++ b/cmake/Modules/G4DeveloperAPI_OLD.cmake
@@ -230,21 +230,26 @@ macro(geant4_library_target)
"NAME" "SOURCES;GEANT4_LINK_LIBRARIES;LINK_LIBRARIES"
${ARGN}
)
- if(BUILD_SHARED_SINGLE_LIB AND BUILD_SHARED_LIBS)
- set_property(GLOBAL APPEND PROPERTY ALL_LIBS_NAME "${G4LIBTARGET_NAME}")
- set_property(GLOBAL APPEND PROPERTY ALL_LIBS_OBJ "$<TARGET_OBJECTS:${G4LIBTARGET_NAME}>")
- set_property(GLOBAL APPEND PROPERTY ALL_LIBS_GEANT4_LINK_LIBRARIES "${G4LIBTARGET_GEANT4_LINK_LIBRARIES} ")
- set_property(GLOBAL APPEND PROPERTY ALL_LIBS_LINK_LIBRARIES "${G4LIBTARGET_LINK_LIBRARIES} ")
- add_library(${G4LIBTARGET_NAME} OBJECT ${G4LIBTARGET_SOURCES})
- #target_compile_definitions(${G4LIBTARGET_NAME} PUBLIC ${G4LIBTARGET_NAME})
+
+ # Need to store for use later to ensure final linking of single library to externals
+ if(BUILD_SINGLE_LIB)
+ set_property(GLOBAL APPEND PROPERTY ALL_LIBS_LINK_LIBRARIES "${G4LIBTARGET_LINK_LIBRARIES}")
endif()
geant4_format_target(NAME ${G4LIBTARGET_NAME}-format SOURCES ${G4LIBTARGET_SOURCES})
- if(BUILD_SHARED_LIBS AND NOT BUILD_SHARED_SINGLE_LIB)
+ if(BUILD_SHARED_LIBS)
# Add the shared library target and link its dependencies
# - Common shared lib commands
- add_library(${G4LIBTARGET_NAME} SHARED ${G4LIBTARGET_SOURCES})
+ if(NOT BUILD_SINGLE_LIB)
+ add_library(${G4LIBTARGET_NAME} SHARED ${G4LIBTARGET_SOURCES})
+ else()
+ add_library(${G4LIBTARGET_NAME} OBJECT ${G4LIBTARGET_SOURCES})
+ set_property(TARGET ${G4LIBTARGET_NAME} PROPERTY POSITION_INDEPENDENT_CODE ON)
+ set_property(GLOBAL APPEND PROPERTY ALL_LIBS_NAME "${G4LIBTARGET_NAME}")
+ set_property(GLOBAL APPEND PROPERTY ALL_LIBS_OBJ "$<TARGET_OBJECTS:${G4LIBTARGET_NAME}>")
+ endif()
+
target_compile_definitions(${G4LIBTARGET_NAME} PRIVATE GEANT4_DEVELOPER_$<CONFIG>)
target_compile_features(${G4LIBTARGET_NAME} PUBLIC ${GEANT4_TARGET_COMPILE_FEATURES})
target_link_libraries(${G4LIBTARGET_NAME}
@@ -277,18 +282,20 @@ macro(geant4_library_target)
)
endif()
- # Alias the library for transparent internal use in build or link contexts
- add_library(Geant4::${G4LIBTARGET_NAME} ALIAS ${G4LIBTARGET_NAME})
-
- # Install the library - note the use of RUNTIME, LIBRARY and ARCHIVE
- # this helps with later DLL builds.
- # Export to standard depends file for later install
- install(TARGETS ${G4LIBTARGET_NAME}
- EXPORT Geant4LibraryDepends
- RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT Runtime
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Runtime
- ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Development
- INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
+ if(NOT BUILD_SINGLE_LIB)
+ # Alias the library for transparent internal use in build or link contexts
+ add_library(Geant4::${G4LIBTARGET_NAME} ALIAS ${G4LIBTARGET_NAME})
+
+ # Install the library - note the use of RUNTIME, LIBRARY and ARCHIVE
+ # this helps with later DLL builds.
+ # Export to standard depends file for later install
+ install(TARGETS ${G4LIBTARGET_NAME}
+ EXPORT Geant4LibraryDepends
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT Runtime
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Runtime
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Development
+ INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
+ endif()
endif()
#
@@ -298,7 +305,14 @@ macro(geant4_library_target)
# name. Link its dependencies, and ensure we actually link to the
# -static targets (We should strictly do this for the external
# libraries as well if we want a pure static build).
- add_library(${G4LIBTARGET_NAME}-static STATIC ${G4LIBTARGET_SOURCES})
+ if(NOT BUILD_SINGLE_LIB)
+ add_library(${G4LIBTARGET_NAME}-static STATIC ${G4LIBTARGET_SOURCES})
+ else()
+ add_library(${G4LIBTARGET_NAME}-static OBJECT ${G4LIBTARGET_SOURCES})
+ set_property(GLOBAL APPEND PROPERTY ALL_LIBS_NAME_STATIC "${G4LIBTARGET_NAME}-static")
+ set_property(GLOBAL APPEND PROPERTY ALL_LIBS_OBJ_STATIC "$<TARGET_OBJECTS:${G4LIBTARGET_NAME}-static>")
+ endif()
+
target_compile_definitions(${G4LIBTARGET_NAME}-static PRIVATE GEANT4_DEVELOPER_$<CONFIG>)
target_compile_features(${G4LIBTARGET_NAME}-static PUBLIC ${GEANT4_TARGET_COMPILE_FEATURES})
target_include_directories(${G4LIBTARGET_NAME}-static PUBLIC "$<BUILD_INTERFACE:${${G4LIBTARGET_NAME}_BUILDTREE_INCLUDES}>")
@@ -333,15 +347,17 @@ macro(geant4_library_target)
set_target_properties(${G4LIBTARGET_NAME}-static
PROPERTIES CLEAN_DIRECT_OUTPUT 1)
- # Alias the library for transparent internal use in build or link contexts
- add_library(Geant4::${G4LIBTARGET_NAME}-static ALIAS ${G4LIBTARGET_NAME}-static)
+ if(NOT BUILD_SINGLE_LIB)
+ # Alias the library for transparent internal use in build or link contexts
+ add_library(Geant4::${G4LIBTARGET_NAME}-static ALIAS ${G4LIBTARGET_NAME}-static)
- install(TARGETS ${G4LIBTARGET_NAME}-static
- EXPORT Geant4LibraryDepends
- RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT Runtime
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Runtime
- ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Development
- INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
+ install(TARGETS ${G4LIBTARGET_NAME}-static
+ EXPORT Geant4LibraryDepends
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT Runtime
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Runtime
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Development
+ INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
+ endif()
endif()
endmacro()
diff --git a/cmake/Modules/G4SingleLibrary.cmake b/cmake/Modules/G4SingleLibrary.cmake
index 3dfadf22b27eac8095f0be80a4e4175dec7d4d4b..66e0836646255765b99197f69388bfc2438d299a 100644
--- a/cmake/Modules/G4SingleLibrary.cmake
+++ b/cmake/Modules/G4SingleLibrary.cmake
@@ -5,57 +5,63 @@ else()
return()
endif()
-if (BUILD_SHARED_SINGLE_LIB)
+if(BUILD_SINGLE_LIB)
+ # Filter out internal targets as these are contained in the single library
+ # We have to relink here because some libraries may rely on transitive linkage
+ # to pick up external libraries.
+ get_property(__geant4_all_libs_link_libs GLOBAL PROPERTY ALL_LIBS_LINK_LIBRARIES)
+ set(__geant4_single_link_list)
+ foreach(__g4link ${__geant4_all_libs_link_libs})
+ if((NOT (__g4link MATCHES "^G4")) AND (NOT TARGET __g4link))
+ list(APPEND __geant4_single_link_list "${__g4link}")
+ endif()
+ endforeach()
- message(STATUS "===========================================================================")
- message(STATUS "Starting SingleLibrary section")
+ if(__geant4_single_link_list)
+ list(REMOVE_DUPLICATES __geant4_single_link_list)
+ endif()
- get_property(__geant4_all_libs_name GLOBAL PROPERTY ALL_LIBS_NAME)
+ # Get overall include directory settings
+ get_property(__geant4_buildtree_include_dirs GLOBAL PROPERTY GEANT4_BUILDTREE_INCLUDE_DIRS)
+
+ if(BUILD_SHARED_LIBS)
get_property(__geant4_all_libs_obj GLOBAL PROPERTY ALL_LIBS_OBJ)
- get_property(__geant4_all_libs_g4_link_libs GLOBAL PROPERTY ALL_LIBS_GEANT4_LINK_LIBRARIES)
- get_property(__geant4_all_libs_link_libs GLOBAL PROPERTY ALL_LIBS_LINK_LIBRARIES)
-
-
- message(STATUS ${__geant4_all_libs_obj})
- add_library(single_dynamic SHARED ${__geant4_all_libs_obj})
-
-
- geant4_compile_definitions_config(single_dynamic)
- target_compile_features(single_dynamic PUBLIC ${GEANT4_TARGET_COMPILE_FEATURES})
-# target_link_libraries(single_dynamic PUBLIC ${__geant4_all_libs_name})
-# target_link_libraries(single_dynamic ${__geant4_all_libs_link_libs})
-# ${__geant4_all_libs_g4_link_libs}
-# ${__geant4_all_libs_link_libs})
- message(STATUS "===========================================================================")
- message(STATUS ${__geant4_all_libs_link_libs})
- message(STATUS "===========================================================================")
- message(STATUS ${__geant4_all_libs_g4_link_libs})
- target_link_libraries(single_dynamic /usr/lib64/libfreetype.so
- /data/cmarcon/Libraries/libexpat/install/lib64/libexpat.so
- /usr/lib64/libXm.so
- /usr/lib64/libSM.so
- /usr/lib64/libICE.so
- /usr/lib64/libX11.so
- /usr/lib64/libXext.so
- /usr/lib64/libXt.so
- /usr/lib64/libXmu.so
- /data/cmarcon/Libraries/libxerces/install/lib/libxerces-c.so
- /usr/lib64/libGL.so
- /usr/lib64/libGLU.so)
- target_compile_definitions(single_dynamic PUBLIC G4LIB_BUILD_DLL)
- set_target_properties(single_dynamic PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)
- set_target_properties(single_dynamic PROPERTIES CLEAN_DIRECT_OUTPUT 1)
- set_target_properties(single_dynamic PROPERTIES MACOSX_RPATH 1)
-
- install(TARGETS single_dynamic
+ add_library(geant4_shared SHARED ${__geant4_all_libs_obj})
+ target_compile_definitions(geant4_shared PUBLIC G4LIB_BUILD_DLL)
+ target_compile_features(geant4_shared PUBLIC ${GEANT4_TARGET_COMPILE_FEATURES})
+ target_include_directories(geant4_shared PUBLIC $<BUILD_INTERFACE:${__geant4_buildtree_include_dirs}>)
+ target_link_libraries(geant4_shared PUBLIC ${__geant4_single_link_list})
+ set_target_properties(geant4_shared
+ PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON
+ CLEAN_DIRECT_OUTPUT 1
+ MACOSX_RPATH 1)
+
+ install(TARGETS geant4_shared
EXPORT Geant4LibraryDepends
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT Runtime
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Runtime
- ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Development)
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Development
+ INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
+
+ set_property(GLOBAL APPEND PROPERTY GEANT4_EXPORTED_TARGETS geant4_shared)
+ set_property(TARGET geant4_shared PROPERTY POSITION_INDEPENDENT_CODE ON)
+ endif()
+
+ if(BUILD_STATIC_LIBS)
+ get_property(__geant4_all_libs_obj GLOBAL PROPERTY ALL_LIBS_OBJ_STATIC)
+ add_library(geant4_static STATIC ${__geant4_all_libs_obj})
+ target_compile_features(geant4_static PUBLIC ${GEANT4_TARGET_COMPILE_FEATURES})
+ target_include_directories(geant4_static PUBLIC $<BUILD_INTERFACE:${__geant4_buildtree_include_dirs}>)
+ target_link_libraries(geant4_static PUBLIC ${__geant4_single_link_list})
+ set_target_properties(geant4_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
- set_property(GLOBAL APPEND PROPERTY GEANT4_EXPORTED_TARGETS single_dynamic)
- set_property(TARGET single_dynamic PROPERTY POSITION_INDEPENDENT_CODE ON)
+ install(TARGETS geant4_static
+ EXPORT Geant4LibraryDepends
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT Runtime
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Runtime
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Development
+ INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
- message(STATUS "End of SingleLibrary section")
- message(STATUS "===========================================================================")
+ set_property(GLOBAL APPEND PROPERTY GEANT4_EXPORTED_TARGETS geant4_static)
+ endif()
endif()
diff --git a/cmake/Templates/Geant4Config.cmake.in b/cmake/Templates/Geant4Config.cmake.in
index fa9c1598a27d691ad45839d9189816cbc67fcd51..5fc1d4cfc8cab95f7aa8f670c6cb4ef3dabc169c 100644
--- a/cmake/Templates/Geant4Config.cmake.in
+++ b/cmake/Templates/Geant4Config.cmake.in
@@ -556,113 +556,126 @@ if(("static" IN_LIST Geant4_FIND_COMPONENTS) AND Geant4_static_FOUND)
set(_geant4_lib_use_suffix "-static")
endif()
-# The list of libraries probably should be autogenerated, but we hard code
-# for now. We don't have to divide the list of shared libraries, but we
-# do so for consistency with the way we'll need to do it for static.
-# - Always on Vis Components
-set(_geant4_internal_libraries
- Geant4::G4Tree${_geant4_lib_use_suffix}
- Geant4::G4FR${_geant4_lib_use_suffix}
- Geant4::G4GMocren${_geant4_lib_use_suffix}
- Geant4::G4visHepRep${_geant4_lib_use_suffix}
- Geant4::G4RayTracer${_geant4_lib_use_suffix}
- Geant4::G4VRML${_geant4_lib_use_suffix}
- )
-
-# - G4OpenGL if it's requested.
-if(_geant4_use_opengl_library)
- list(APPEND _geant4_internal_libraries
- Geant4::G4OpenGL${_geant4_lib_use_suffix}
- Geant4::G4gl2ps${_geant4_lib_use_suffix}
+# Library list depends on whether we built multi/single lib
+set(Geant4_single_library_FOUND @BUILD_SINGLE_LIB@)
+
+if(NOT Geant4_single_library_FOUND)
+ # The list of libraries probably should be autogenerated, but we hard code
+ # for now. We don't have to divide the list of shared libraries, but we
+ # do so for consistency with the way we'll need to do it for static.
+ # - Always on Vis Components
+ set(_geant4_internal_libraries
+ Geant4::G4Tree${_geant4_lib_use_suffix}
+ Geant4::G4FR${_geant4_lib_use_suffix}
+ Geant4::G4GMocren${_geant4_lib_use_suffix}
+ Geant4::G4visHepRep${_geant4_lib_use_suffix}
+ Geant4::G4RayTracer${_geant4_lib_use_suffix}
+ Geant4::G4VRML${_geant4_lib_use_suffix}
)
- list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_OPENGL)
-endif()
-# - G4OpenInventor if it's requested.
-if(_geant4_use_inventor_library)
- list(APPEND _geant4_internal_libraries
- Geant4::G4OpenInventor${_geant4_lib_use_suffix}
- )
-endif()
+ # - G4OpenGL if it's requested.
+ if(_geant4_use_opengl_library)
+ list(APPEND _geant4_internal_libraries
+ Geant4::G4OpenGL${_geant4_lib_use_suffix}
+ Geant4::G4gl2ps${_geant4_lib_use_suffix}
+ )
+ list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_OPENGL)
+ endif()
-# - G3toG4 if it's requested
-if(_geant4_use_g3tog4_library)
- set(_geant4_g3tog4_library Geant4::G3toG4${_geant4_lib_use_suffix})
-endif()
-
-# - link to timemory library if activated
-if(_geant4_use_timemory_library)
- list(APPEND _geant4_internal_libraries ${timemory_LIBRARIES})
-endif()
-
-# - Factory registration mechanism in physics_lists requires whole
-# archive to be linked when using static libs, so requires wrapping
-# with suitable compiler dependent flags
-# 2016-05-24: use an alternate means of forcing linking of references for
-# static builds. --whole-archive never was implemented for _WIN32
-# (appears not to even be possible)
-# In order re-implement whole-archive, switch Geant4_FORCE_WHOLE_ARCHIVE ON
-set(_geant4_physicslists_library Geant4::G4physicslists${_geant4_lib_use_suffix})
-
-set(Geant4_FORCE_WHOLE_ARCHIVE OFF)
-if( Geant4_FORCE_WHOLE_ARCHIVE )
-if(_geant4_lib_use_suffix STREQUAL "-static")
- # - Use CMAKE_CXX_COMPILER_ID, which should be reliable enough...
- # Though the GNU/Clang/Intel compilers/linkers *should* use identical
- # flags,keep their sections separate until behaviour confirmed
- #
- if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
- set(_geant4_physicslists_library -Wl,--whole-archive Geant4::G4physicslists${_geant4_lib_use_suffix} -Wl,--no-whole-archive)
- elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
- set(_geant4_physicslists_library -Wl,-force_load Geant4::G4physicslists${_geant4_lib_use_suffix})
- elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
- set(_geant4_physicslists_library -Wl,--whole-archive Geant4::G4physicslists${_geant4_lib_use_suffix} -Wl,--no-whole-archive)
- else()
- # Needs determination of other compiler options.
- # NB: MSVC has /OPT:NOREF, but may apply globally...
- # reading up on this ... doesn't seem that it applies for subtle reasons
- # only real way is to actually reference the static variables
- set(_geant4_physicslists_library Geant4::G4physicslists${_geant4_lib_use_suffix})
+ # - G4OpenInventor if it's requested.
+ if(_geant4_use_inventor_library)
+ list(APPEND _geant4_internal_libraries
+ Geant4::G4OpenInventor${_geant4_lib_use_suffix}
+ )
+ endif()
+
+ # - G3toG4 if it's requested
+ if(_geant4_use_g3tog4_library)
+ set(_geant4_g3tog4_library Geant4::G3toG4${_geant4_lib_use_suffix})
+ endif()
+
+ # - link to timemory library if activated
+ if(_geant4_use_timemory_library)
+ list(APPEND _geant4_internal_libraries ${timemory_LIBRARIES})
endif()
-endif()
-endif()
-# - 'Kernel' libraries
-list(APPEND _geant4_internal_libraries
- Geant4::G4vis_management${_geant4_lib_use_suffix}
- Geant4::G4modeling${_geant4_lib_use_suffix}
- Geant4::G4interfaces${_geant4_lib_use_suffix}
- Geant4::G4persistency${_geant4_lib_use_suffix}
- ${_geant4_g3tog4_library}
- Geant4::G4analysis${_geant4_lib_use_suffix}
- Geant4::G4error_propagation${_geant4_lib_use_suffix}
- Geant4::G4readout${_geant4_lib_use_suffix}
- ${_geant4_physicslists_library}
- Geant4::G4run${_geant4_lib_use_suffix}
- Geant4::G4event${_geant4_lib_use_suffix}
- Geant4::G4tracking${_geant4_lib_use_suffix}
- Geant4::G4parmodels${_geant4_lib_use_suffix}
- Geant4::G4processes${_geant4_lib_use_suffix}
- Geant4::G4digits_hits${_geant4_lib_use_suffix}
- Geant4::G4track${_geant4_lib_use_suffix}
- Geant4::G4particles${_geant4_lib_use_suffix}
- Geant4::G4geometry${_geant4_lib_use_suffix}
- Geant4::G4materials${_geant4_lib_use_suffix}
- Geant4::G4graphics_reps${_geant4_lib_use_suffix}
- Geant4::G4intercoms${_geant4_lib_use_suffix}
- Geant4::G4global${_geant4_lib_use_suffix}
- )
-
-# - Any externals built by Geant4
-foreach(_extlib @GEANT4_EXTERNALS_TARGETS@)
- list(APPEND
- _geant4_internal_libraries
- Geant4::${_extlib}${_geant4_lib_use_suffix}
+ # - Factory registration mechanism in physics_lists requires whole
+ # archive to be linked when using static libs, so requires wrapping
+ # with suitable compiler dependent flags
+ # 2016-05-24: use an alternate means of forcing linking of references for
+ # static builds. --whole-archive never was implemented for _WIN32
+ # (appears not to even be possible)
+ # In order re-implement whole-archive, switch Geant4_FORCE_WHOLE_ARCHIVE ON
+ set(_geant4_physicslists_library Geant4::G4physicslists${_geant4_lib_use_suffix})
+
+ set(Geant4_FORCE_WHOLE_ARCHIVE OFF)
+ if( Geant4_FORCE_WHOLE_ARCHIVE )
+ if(_geant4_lib_use_suffix STREQUAL "-static")
+ # - Use CMAKE_CXX_COMPILER_ID, which should be reliable enough...
+ # Though the GNU/Clang/Intel compilers/linkers *should* use identical
+ # flags,keep their sections separate until behaviour confirmed
+ #
+ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
+ set(_geant4_physicslists_library -Wl,--whole-archive Geant4::G4physicslists${_geant4_lib_use_suffix} -Wl,--no-whole-archive)
+ elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+ set(_geant4_physicslists_library -Wl,-force_load Geant4::G4physicslists${_geant4_lib_use_suffix})
+ elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
+ set(_geant4_physicslists_library -Wl,--whole-archive Geant4::G4physicslists${_geant4_lib_use_suffix} -Wl,--no-whole-archive)
+ else()
+ # Needs determination of other compiler options.
+ # NB: MSVC has /OPT:NOREF, but may apply globally...
+ # reading up on this ... doesn't seem that it applies for subtle reasons
+ # only real way is to actually reference the static variables
+ set(_geant4_physicslists_library Geant4::G4physicslists${_geant4_lib_use_suffix})
+ endif()
+ endif()
+ endif()
+
+ # - 'Kernel' libraries
+ list(APPEND _geant4_internal_libraries
+ Geant4::G4vis_management${_geant4_lib_use_suffix}
+ Geant4::G4modeling${_geant4_lib_use_suffix}
+ Geant4::G4interfaces${_geant4_lib_use_suffix}
+ Geant4::G4persistency${_geant4_lib_use_suffix}
+ ${_geant4_g3tog4_library}
+ Geant4::G4analysis${_geant4_lib_use_suffix}
+ Geant4::G4error_propagation${_geant4_lib_use_suffix}
+ Geant4::G4readout${_geant4_lib_use_suffix}
+ ${_geant4_physicslists_library}
+ Geant4::G4run${_geant4_lib_use_suffix}
+ Geant4::G4event${_geant4_lib_use_suffix}
+ Geant4::G4tracking${_geant4_lib_use_suffix}
+ Geant4::G4parmodels${_geant4_lib_use_suffix}
+ Geant4::G4processes${_geant4_lib_use_suffix}
+ Geant4::G4digits_hits${_geant4_lib_use_suffix}
+ Geant4::G4track${_geant4_lib_use_suffix}
+ Geant4::G4particles${_geant4_lib_use_suffix}
+ Geant4::G4geometry${_geant4_lib_use_suffix}
+ Geant4::G4materials${_geant4_lib_use_suffix}
+ Geant4::G4graphics_reps${_geant4_lib_use_suffix}
+ Geant4::G4intercoms${_geant4_lib_use_suffix}
+ Geant4::G4global${_geant4_lib_use_suffix}
)
-endforeach()
-# - Now set them to Geant4_LIBRARIES
-set(Geant4_LIBRARIES ${_geant4_internal_libraries})
+ # - Any externals built by Geant4
+ foreach(_extlib @GEANT4_EXTERNALS_TARGETS@)
+ list(APPEND
+ _geant4_internal_libraries
+ Geant4::${_extlib}${_geant4_lib_use_suffix}
+ )
+ endforeach()
+
+ # - Now set them to Geant4_LIBRARIES
+ set(Geant4_LIBRARIES ${_geant4_internal_libraries})
+else()
+ # Have a single library, default is dynamic
+ set(Geant4_LIBRARIES Geant4::geant4_shared)
+
+ # ... unless we requested static
+ if(_geant4_lib_use_suffix STREQUAL "-static")
+ set(Geant4_LIBRARIES Geant4::geant4_static)
+ endif()
+endif()
#-----------------------------------------------------------------------
# Remove any duplicates from the Geant4_{DEFINITIONS,INCLUDE_DIRS,LIBRARIES}