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}