diff --git a/spack/README.md b/spack/README.md index 40b709143e6ce6c10a4ddf6b03bbe072db4eb379..24dbd820cb648f9f1aee471515f59a10f42886c6 100644 --- a/spack/README.md +++ b/spack/README.md @@ -18,6 +18,7 @@ Then use spack as you normally would. * Package overrides * `acts`: Patch bug for simple disk geometries * `dd4hep`: Fix package hash which somehow is wrong in spack... + * `Geant4`: Add extra hardcoded materials with Birks constant * `fmt`: Modified compiler flags to build shared library version. * `madx`: Add madx package * `mesa`: fix issue in meson step diff --git a/spack/packages/geant4/CLHEP-10.03.03.patch b/spack/packages/geant4/CLHEP-10.03.03.patch new file mode 100644 index 0000000000000000000000000000000000000000..b865f3bde24c1eead5cf2237289dfe7f886faaee --- /dev/null +++ b/spack/packages/geant4/CLHEP-10.03.03.patch @@ -0,0 +1,34 @@ +diff --git a/cmake/Modules/FindCLHEP.cmake b/cmake/Modules/FindCLHEP.cmake +index 8b59f1c0a..f616d678e 100644 +--- a/cmake/Modules/FindCLHEP.cmake ++++ b/cmake/Modules/FindCLHEP.cmake +@@ -180,7 +180,10 @@ if(UNIX) + execute_process(COMMAND ${CLHEP_CONFIG_EXECUTABLE} --prefix + OUTPUT_VARIABLE _clhep_config_prefix + OUTPUT_STRIP_TRAILING_WHITESPACE) +- ++ if (_clhep_config_prefix) ++ # Remove wrapping double quotes. ++ string(REGEX REPLACE "\"(.*)\"" "\\1" _clhep_config_prefix "${_clhep_config_prefix}") ++ endif() + list(APPEND _clhep_root_hints ${_clhep_config_prefix}) + endif() + elseif(WIN32 AND NOT UNIX) +diff --git a/cmake/Templates/Geant4Config.cmake.in b/cmake/Templates/Geant4Config.cmake.in +index d6fe408b3..f355be2af 100644 +--- a/cmake/Templates/Geant4Config.cmake.in ++++ b/cmake/Templates/Geant4Config.cmake.in +@@ -268,13 +268,7 @@ set(Geant4_builtin_clhep_FOUND @GEANT4_USE_BUILTIN_CLHEP@) + if(NOT Geant4_builtin_clhep_FOUND) + set(Geant4_system_clhep_ISGRANULAR @GEANT4_USE_SYSTEM_CLHEP_GRANULAR@) + +- set(CLHEP_ROOT_DIR "@CLHEP_ROOT_DIR@") +- set(__GEANT4_OLD_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}) +- set(CMAKE_MODULE_PATH "${_geant4_thisdir}/Modules" ${CMAKE_MODULE_PATH}) + find_package(CLHEP @CLHEP_VERSION@ REQUIRED @__g4_clhep_components@) +- set(CMAKE_MODULE_PATH ${__GEANT4_OLD_CMAKE_MODULE_PATH}) +- unset(CLHEP_ROOT_DIR) +- unset(__GEANT4_OLD_CMAKE_MODULE_PATH) + #CLHEP doesn't use target properties fully yet, so always include_directories + include_directories(${CLHEP_INCLUDE_DIRS}) + endif() diff --git a/spack/packages/geant4/birks.patch b/spack/packages/geant4/birks.patch new file mode 100644 index 0000000000000000000000000000000000000000..afaa29f9d437182e10e1ba94542b9639a6996550 --- /dev/null +++ b/spack/packages/geant4/birks.patch @@ -0,0 +1,36 @@ +diff --git a/source/processes/electromagnetic/utils/src/G4EmSaturation.cc b/source/processes/electromagnetic/utils/src/G4EmSaturation.cc +index 9fb850dd7c..a67b31ced8 100644 +--- a/source/processes/electromagnetic/utils/src/G4EmSaturation.cc ++++ b/source/processes/electromagnetic/utils/src/G4EmSaturation.cc +@@ -269,7 +269,7 @@ void G4EmSaturation::DumpG4BirksCoefficients() + + void G4EmSaturation::InitialiseG4materials() + { +- nG4Birks = 4; ++ nG4Birks = 10; + g4MatData.reserve(nG4Birks); + + // M.Hirschberg et al., IEEE Trans. Nuc. Sci. 39 (1992) 511 +@@ -306,6 +306,22 @@ void G4EmSaturation::InitialiseG4materials() + g4MatNames.push_back("G4_PbWO4"); + g4MatData.push_back(0.0333333*mm/MeV); + ++ g4MatNames.push_back("polystyrene"); ++ g4MatData.push_back(0.07943*mm/MeV); ++ g4MatNames.push_back("Polystyrene"); ++ g4MatData.push_back(0.07943*mm/MeV); ++ ++ g4MatNames.push_back("PlasticScint"); ++ g4MatData.push_back(0.126*mm/MeV); ++ g4MatNames.push_back("PlasticScintillator"); ++ g4MatData.push_back(0.126*mm/MeV); ++ ++ g4MatNames.push_back("PlasticScint079"); ++ g4MatData.push_back(0.126*mm/MeV); ++ ++ g4MatNames.push_back("PlasticScint153"); ++ g4MatData.push_back(0.153*mm/MeV); ++ + //G4_Lucite + + } diff --git a/spack/packages/geant4/cxx17.patch b/spack/packages/geant4/cxx17.patch new file mode 100644 index 0000000000000000000000000000000000000000..3845e9e20bb6534467f6713285817b11310ee30d --- /dev/null +++ b/spack/packages/geant4/cxx17.patch @@ -0,0 +1,22 @@ +diff -Naur geant4.10.03.p03/cmake/Modules/Geant4LibraryBuildOptions.cmake geant4.10.03.p03/cmake/Modules/Geant4LibraryBuildOptions.cmake +--- geant4.10.03.p03/cmake/Modules/Geant4LibraryBuildOptions.cmake 2017-10-20 06:30:46.000000000 -0500 ++++ geant4.10.03.p03/cmake/Modules/Geant4LibraryBuildOptions.cmake 2018-04-16 16:48:02.194321171 -0500 +@@ -76,7 +76,7 @@ + # Mark as advanced because most users will not need it + enum_option(GEANT4_BUILD_CXXSTD + DOC "C++ Standard to compile against" +- VALUES 11 14 c++11 c++14 ++ VALUES 11 14 17 c++11 c++14 c++17 + CASE_INSENSITIVE + ) + +@@ -106,6 +106,9 @@ + + # Add Definition to flags for temporary back compatibility + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DG4USE_STD11") ++if(GEANT4_BUILD_CXXSTD GREATER 14) ++ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES=1") ++endif() + + # Hold any appropriate compile flag(s) in variable for later export to + # config files. Needed to support late CMake 2.8 where compile features diff --git a/spack/packages/geant4/cxx17_geant4_10_0.patch b/spack/packages/geant4/cxx17_geant4_10_0.patch new file mode 100644 index 0000000000000000000000000000000000000000..228985ebc446c30acf7975f3280e7f4be9431d27 --- /dev/null +++ b/spack/packages/geant4/cxx17_geant4_10_0.patch @@ -0,0 +1,22 @@ +diff -Naur geant4/cmake/Modules/G4BuildSettings.cmake geant4/cmake/Modules/G4BuildSettings.cmake +--- geant4/cmake/Modules/G4BuildSettings.cmake 2017-10-20 06:30:46.000000000 -0500 ++++ geant4/cmake/Modules/G4BuildSettings.cmake 2018-04-16 16:48:02.194321171 -0500 +@@ -76,7 +76,7 @@ + # Mark as advanced because most users will not need it + enum_option(GEANT4_BUILD_CXXSTD + DOC "C++ Standard to compile against" +- VALUES 11 14 c++11 c++14 ++ VALUES 11 14 17 c++11 c++14 c++17 + CASE_INSENSITIVE + ) + +@@ -106,6 +106,9 @@ + + # Add Definition to flags for temporary back compatibility + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DG4USE_STD11") ++if(GEANT4_BUILD_CXXSTD GREATER 14) ++ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES=1") ++endif() + + # Hold any appropriate compile flag(s) in variable for later export to + # config files. Needed to support late CMake 2.8 where compile features diff --git a/spack/packages/geant4/geant4-10.4.3-cxx17-removed-features.patch b/spack/packages/geant4/geant4-10.4.3-cxx17-removed-features.patch new file mode 100644 index 0000000000000000000000000000000000000000..a4938876794fab4c60ab35102fb25da84159192f --- /dev/null +++ b/spack/packages/geant4/geant4-10.4.3-cxx17-removed-features.patch @@ -0,0 +1,18 @@ +diff --git a/cmake/Modules/G4BuildSettings.cmake b/cmake/Modules/G4BuildSettings.cmake +index f68cb0a44..6bf4b6948 100644 +--- a/cmake/Modules/G4BuildSettings.cmake ++++ b/cmake/Modules/G4BuildSettings.cmake +@@ -205,6 +205,13 @@ endif() + # Add Definition to flags for temporary back compatibility + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DG4USE_STD11") + ++# Spack patch to support use of C++ features deprecated/removed in C++17 ++# Only checked on AppleClang for now ++if(GEANT4_BUILD_CXXSTD GREATER 14) ++ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES=1") ++endif() ++#---- ++ + # Hold any appropriate compile flag(s) in variable for later export to + # config files. Needed to support clients using late CMake 2.8 where compile features + # are not available. diff --git a/spack/packages/geant4/package.py b/spack/packages/geant4/package.py new file mode 100644 index 0000000000000000000000000000000000000000..beabb6b8e0644e81c6a80e186a9d8614a620313d --- /dev/null +++ b/spack/packages/geant4/package.py @@ -0,0 +1,181 @@ +# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack import * + + +class Geant4(CMakePackage): + """Geant4 is a toolkit for the simulation of the passage of particles + through matter. Its areas of application include high energy, nuclear + and accelerator physics, as well as studies in medical and space + science.""" + + homepage = "http://geant4.cern.ch/" + url = "https://gitlab.cern.ch/geant4/geant4/-/archive/v10.7.1/geant4-v10.7.1.tar.gz" + + tags = ['hep'] + + maintainers = ['drbenmorgan'] + + version('10.7.2', sha256='593fc85883a361487b17548ba00553501f66a811b0a79039276bb75ad59528cf') + version('10.7.1', sha256='2aa7cb4b231081e0a35d84c707be8f35e4edc4e97aad2b233943515476955293') + version('10.7.0', sha256='c991a139210c7f194720c900b149405090058c00beb5a0d2fac5c40c42a262d4') + version('10.6.3', sha256='bf96d6d38e6a0deabb6fb6232eb00e46153134da645715d636b9b7b4490193d3') + version('10.6.2', sha256='e381e04c02aeade1ed8cdd9fdbe7dcf5d6f0f9b3837a417976b839318a005dbd') + version('10.6.1', sha256='4fd64149ae26952672a81ce5579d3806fda4bd251d486897093ac57633a42b7e') + version('10.6.0', sha256='eebe6a170546064ff81ab3b00f513ccd1d4122a026514982368d503ac55a4ee4') + version('10.5.1', sha256='2397eb859dc4de095ff66059d8bda9f060fdc42e10469dd7890946293eeb0e39') + version('10.4.3', sha256='67f3bb6405a2c77e573936c2b933f5a4a33915aa379626a2eb3012009b91e1da') + version('10.4.0', sha256='e919b9b0a88476e00c0b18ab65d40e6a714b55ee4778f66bac32a5396c22aa74') + version('10.3.3', sha256='bcd36a453da44de9368d1d61b0144031a58e4b43a6d2d875e19085f2700a89d8') + + _cxxstd_values = ('11', '14', '17') + variant('cxxstd', + default=_cxxstd_values[0], + values=_cxxstd_values, + multi=False, + description='Use the specified C++ standard when building.') + + variant('threads', default=True, description='Build with multithreading') + variant('vecgeom', default=False, description='Enable vecgeom support') + variant('opengl', default=False, description='Optional OpenGL support') + variant('x11', default=False, description='Optional X11 support') + variant('motif', default=False, description='Optional motif support') + variant('qt', default=False, description='Enable Qt support') + variant('python', default=False, description='Enable Python bindings') + + depends_on('cmake@3.5:', type='build') + depends_on('cmake@3.8:', type='build', when='@10.6.0:') + + depends_on('geant4-data@10.7.2', when='@10.7.2') + depends_on('geant4-data@10.7.1', when='@10.7.1') + depends_on('geant4-data@10.7.0', when='@10.7.0') + depends_on('geant4-data@10.6.3', when='@10.6.3') + depends_on('geant4-data@10.6.2', when='@10.6.2') + depends_on('geant4-data@10.6.1', when='@10.6.1') + depends_on('geant4-data@10.6.0', when='@10.6.0') + depends_on('geant4-data@10.5.1', when='@10.5.1') + depends_on('geant4-data@10.4.3', when='@10.4.3') + depends_on('geant4-data@10.4.0', when='@10.4.0') + depends_on('geant4-data@10.3.3', when='@10.3.3') + + depends_on("expat") + depends_on("zlib") + + # Python, with boost requirement dealt with in cxxstd section + depends_on('python@3:', when='+python') + extends('python', when='+python') + conflicts('+python', when='@:10.6.1', + msg='Geant4 <= 10.6.1 cannot be built with Python bindings') + + for std in _cxxstd_values: + # CLHEP version requirements to be reviewed + depends_on('clhep@2.4.4.0: cxxstd=' + std, + when='@10.7.0: cxxstd=' + std) + + depends_on('clhep@2.3.3.0: cxxstd=' + std, + when='@10.3.3:10.6.99 cxxstd=' + std) + + # Spack only supports Xerces-c 3 and above, so no version req + depends_on('xerces-c netaccessor=curl cxxstd=' + std, when='cxxstd=' + std) + + # Vecgeom specific versions for each Geant4 version + depends_on('vecgeom@1.1.8 cxxstd=' + std, + when='@10.7.0: +vecgeom cxxstd=' + std) + depends_on('vecgeom@1.1.5 cxxstd=' + std, + when='@10.6.0:10.6.99 +vecgeom cxxstd=' + std) + depends_on('vecgeom@1.1.0 cxxstd=' + std, + when='@10.5.0:10.5.99 +vecgeom cxxstd=' + std) + depends_on('vecgeom@0.5.2 cxxstd=' + std, + when='@10.4.0:10.4.99 +vecgeom cxxstd=' + std) + depends_on('vecgeom@0.3rc cxxstd=' + std, + when='@10.3.0:10.3.99 +vecgeom cxxstd=' + std) + + # Boost.python, conflict handled earlier + depends_on('boost@1.70: +python cxxstd=' + std, + when='+python cxxstd=' + std) + + # Visualization driver dependencies + depends_on("gl", when='+opengl') + depends_on("glu", when='+opengl') + depends_on("glx", when='+opengl+x11') + depends_on("libx11", when='+x11') + depends_on("libxmu", when='+x11') + depends_on("motif", when='+motif') + depends_on("qt@5: +opengl", when="+qt") + + # As released, 10.03.03 has issues with respect to using external + # CLHEP. + patch('CLHEP-10.03.03.patch', level=1, when='@10.3.3') + # These patches can be applied independent of the cxxstd value? + patch('cxx17.patch', when='@:10.3.99 cxxstd=17') + patch('cxx17_geant4_10_0.patch', level=1, when='@10.4.0 cxxstd=17') + patch('geant4-10.4.3-cxx17-removed-features.patch', + level=1, when='@10.4.3 cxxstd=17') + + ## Add to the hardcoded GEANT4 Birk's constants + patch('birks.patch', when='@10.7.0:') + + def cmake_args(self): + spec = self.spec + + # Core options + options = [ + self.define_from_variant('GEANT4_BUILD_CXXSTD', 'cxxstd'), + '-DGEANT4_USE_SYSTEM_CLHEP=ON', + '-DGEANT4_USE_SYSTEM_EXPAT=ON', + '-DGEANT4_USE_SYSTEM_ZLIB=ON', + '-DGEANT4_USE_G3TOG4=ON', + '-DGEANT4_USE_GDML=ON', + '-DXERCESC_ROOT_DIR={0}'.format(spec['xerces-c'].prefix) + ] + + # Don't install the package cache file as Spack will set + # up CMAKE_PREFIX_PATH etc for the dependencies + if spec.version > Version('10.5.99'): + options.append('-DGEANT4_INSTALL_PACKAGE_CACHE=OFF') + + # Multithreading + options.append(self.define_from_variant('GEANT4_BUILD_MULTITHREADED', + 'threads')) + if '+threads' in spec: + # Locked at global-dynamic to allow use cases that load the + # geant4 libs at application runtime + options.append('-DGEANT4_BUILD_TLS_MODEL=global-dynamic') + + # install the data with geant4 + datadir = spec['geant4-data'].prefix.share + dataver = '{0}-{1}'.format(spec['geant4-data'].name, + spec['geant4-data'].version.dotted) + datapath = join_path(datadir, dataver) + options.append('-DGEANT4_INSTALL_DATADIR={0}'.format(datapath)) + + # Vecgeom + if '+vecgeom' in spec: + options.append('-DGEANT4_USE_USOLIDS=ON') + options.append('-DUSolids_DIR=%s' % spec[ + 'vecgeom'].prefix.lib.CMake.USolids) + + # Visualization options + if 'platform=darwin' not in spec: + if "+x11" in spec and "+opengl" in spec: + options.append('-DGEANT4_USE_OPENGL_X11=ON') + if "+motif" in spec and "+opengl" in spec: + options.append('-DGEANT4_USE_XM=ON') + if "+x11" in spec: + options.append('-DGEANT4_USE_RAYTRACER_X11=ON') + + if '+qt' in spec: + options.append('-DGEANT4_USE_QT=ON') + options.append( + '-DQT_QMAKE_EXECUTABLE=%s' % + spec['qt'].prefix.bin.qmake) + + # Python + if spec.version > Version('10.6.1'): + options.append(self.define_from_variant('GEANT4_USE_PYTHON', + 'python')) + + return options