diff --git a/compilation_flags.file b/compilation_flags.file
index 2a2b061c720..e8c605e269e 100644
--- a/compilation_flags.file
+++ b/compilation_flags.file
@@ -1,4 +1,4 @@
-%define lto_build_flags -flto -fipa-icf -flto-odr-type-merging -fno-fat-lto-objects -Wodr
+#Special architecture related flags
%if "%{?arch_build_flags:set}" != "set"
%ifarch ppc64le
%define arch_build_flags -mcpu=power8 -mtune=power8 --param=l1-cache-size=64 --param=l1-cache-line-size=128 --param=l2-cache-size=512
diff --git a/compilation_flags_lto.file b/compilation_flags_lto.file
new file mode 100644
index 00000000000..80fc3a2cea0
--- /dev/null
+++ b/compilation_flags_lto.file
@@ -0,0 +1,13 @@
+#Enable/disable LTO builds
+%define enable_lto 0
+
+#LTO related flags
+%ifarch ppc64le
+%undefine enable_lto
+%define enable_lto 0
+%endif
+%if "%{enable_lto}" == "1"
+%define lto_build_flags -flto -fipa-icf -flto-odr-type-merging -fno-fat-lto-objects -Wodr
+%else
+%define lto_build_flags %{nil}
+%endif
diff --git a/dd4hep.spec b/dd4hep.spec
index 0b9e8288181..4dee12aa682 100644
--- a/dd4hep.spec
+++ b/dd4hep.spec
@@ -1,4 +1,6 @@
### RPM external dd4hep v01-23x
+## INCLUDE compilation_flags
+## INCLUDE compilation_flags_lto
%define tag 5c3b494f047ee025b2e32303c16ad854bfbb342d
%define branch master
@@ -9,6 +11,28 @@ Source: git+https://github.com/%{github_user}/DD4hep.git?obj=%{branch}/%{tag}&ex
BuildRequires: cmake
Requires: root boost clhep xerces-c geant4
+%if "%{?arch_build_flags}"
+%define build_flags -fPIC %{arch_build_flags} %{lto_build_flags}
+%else
+%define build_flags -fPIC %{lto_build_flags}
+%endif
+
+%define cmake_fixed_args \\\
+ -DCMAKE_INSTALL_PREFIX='%{i}' \\\
+ -DCMAKE_CXX_FLAGS="%{build_flags}" \\\
+ -DCMAKE_STATIC_LIBRARY_CXX_FLAGS="%{build_flags}" \\\
+ -DCMAKE_STATIC_LIBRARY_C_FLAGS="%{build_flags}" \\\
+ -DBoost_NO_BOOST_CMAKE=ON \\\
+ -DDD4HEP_USE_XERCESC=ON \\\
+ -DDD4HEP_USE_PYROOT=ON \\\
+ -DCMAKE_AR=$(which gcc-ar) \\\
+ -DCMAKE_RANLIB=$(which gcc-ranlib) \\\
+ -DCMAKE_CXX_STANDARD=17 \\\
+ -DCMAKE_BUILD_TYPE=Release \\\
+ -DDD4HEP_USE_GEANT4_UNITS=ON \\\
+ -DXERCESC_ROOT_DIR=${XERCES_C_ROOT} \\\
+ -DCMAKE_PREFIX_PATH="${CLHEP_ROOT};${XERCES_C_ROOT}"
+
%prep
%setup -n %{n}-%{realversion}
@@ -16,25 +40,16 @@ Requires: root boost clhep xerces-c geant4
%build
export BOOST_ROOT
-CMAKE_ARGS="-DCMAKE_INSTALL_PREFIX='%{i}' \
- -DBoost_NO_BOOST_CMAKE=ON \
- -DDD4HEP_USE_XERCESC=ON \
- -DXERCESC_ROOT_DIR=${XERCES_C_ROOT} \
- -DDD4HEP_USE_PYROOT=ON \
- -DCMAKE_CXX_STANDARD=17 \
- -DCMAKE_BUILD_TYPE=Release \
- -DDD4HEP_USE_GEANT4_UNITS=ON \
- -DCMAKE_PREFIX_PATH=${CLHEP_ROOT};${XERCES_C_ROOT}"
#Build normal Shared D4Hep without Geant4
rm -rf ../build; mkdir ../build; cd ../build
-cmake $CMAKE_ARGS -DBUILD_SHARED_LIBS=ON ../%{n}-%{realversion}
+cmake %{cmake_fixed_args} -DBUILD_SHARED_LIBS=ON ../%{n}-%{realversion}
make %{makeprocesses} VERBOSE=1
make install
#Building DDG4 static
rm -rf ../build-g4; mkdir ../build-g4; cd ../build-g4
-cmake $CMAKE_ARGS -DBUILD_SHARED_LIBS=OFF -DDD4HEP_USE_GEANT4=ON ../%{n}-%{realversion}
+cmake %{cmake_fixed_args} -DBUILD_SHARED_LIBS=OFF -DDD4HEP_USE_GEANT4=ON ../%{n}-%{realversion}
cd DDG4
make %{makeprocesses} VERBOSE=1
for lib in $(ls ../lib/libDDG4*.a | sed 's|.a$||'); do
diff --git a/geant4.spec b/geant4.spec
index 1b05041a504..61ec8a64f56 100644
--- a/geant4.spec
+++ b/geant4.spec
@@ -1,5 +1,6 @@
### RPM external geant4 10.7.2
## INCLUDE compilation_flags
+## INCLUDE compilation_flags_lto
%define use_vecgeom 1
%define tag %{realversion}
%define branch geant4-10.7-release
@@ -17,6 +18,11 @@ Requires: vecgeom
Requires: zlib
%define keep_archives true
+%if "%{?arch_build_flags}"
+%define build_flags -fPIC %{arch_build_flags} %{lto_build_flags}
+%else
+%define build_flags -fPIC %{lto_build_flags}
+%endif
%prep
%setup -n %{n}.%{realversion}
@@ -37,15 +43,9 @@ export VecGeom_DIR=${VECGEOM_ROOT}/lib/cmake/VecGeom
cmake ../%{n}.%{realversion} \
-DCMAKE_CXX_COMPILER="g++" \
-%if "%{?arch_build_flags}"
- -DCMAKE_CXX_FLAGS="-fPIC %{arch_build_flags}" \
- -DCMAKE_STATIC_LIBRARY_CXX_FLAGS="-fPIC %{arch_build_flags}" \
- -DCMAKE_STATIC_LIBRARY_C_FLAGS="-fPIC %{arch_build_flags}" \
-%else
- -DCMAKE_CXX_FLAGS="-fPIC" \
- -DCMAKE_STATIC_LIBRARY_CXX_FLAGS="-fPIC" \
- -DCMAKE_STATIC_LIBRARY_C_FLAGS="-fPIC" \
-%endif
+ -DCMAKE_CXX_FLAGS="%{build_flags}" \
+ -DCMAKE_STATIC_LIBRARY_CXX_FLAGS="%{build_flags}" \
+ -DCMAKE_STATIC_LIBRARY_C_FLAGS="%{build_flags}" \
-DCMAKE_AR=$(which gcc-ar) \
-DCMAKE_RANLIB=$(which gcc-ranlib) \
-DCMAKE_INSTALL_PREFIX:PATH="%i" \
diff --git a/scram-project-build.file b/scram-project-build.file
index 4c9d37660ce..578f412d1a4 100644
--- a/scram-project-build.file
+++ b/scram-project-build.file
@@ -1,5 +1,6 @@
### FILE scram-project-build
## NO_AUTO_DEPENDENCY
+## INCLUDE compilation_flags_lto
# FIXME: support building all platforms together like scram does?
# FIXME: automatic sub-packages for "doc" etc?
%define cmssw_libs biglib/%{cmsplatf} lib/%{cmsplatf}
@@ -53,7 +54,7 @@ BuildRequires: dwz
%endif
%if "%{?configtag:set}" != "set"
-%define configtag V07-03-11
+%define configtag V07-03-12
%endif
%if "%{?cvssrc:set}" != "set"
@@ -116,7 +117,9 @@ rm -rf config %{srctree} poison
cd %_builddir
echo %{configtag} > %_builddir/config/config_tag
-%_builddir/config/updateConfig.py -p %{ucprojtype} -v %v -s $SCRAMV1_VERSION -t ${%{toolconf}} --keys SCRAM_COMPILER=%{scram_compiler} \
+%_builddir/config/updateConfig.py -p %{ucprojtype} -v %v -s $SCRAMV1_VERSION -t ${%{toolconf}} \
+ --keys SCRAM_COMPILER=%{scram_compiler} \
+ --keys ENABLE_LTO=%{enable_lto} \
%if "%{?gitcommit:set}" == "set"
--keys PROJECT_GIT_HASH=%{gitcommit}
%else
diff --git a/scram-tools.file/tool-env.file b/scram-tools.file/tool-env.file
index da32bed7994..f49de70ce9a 100644
--- a/scram-tools.file/tool-env.file
+++ b/scram-tools.file/tool-env.file
@@ -1,4 +1,5 @@
## INCLUDE compilation_flags
+## INCLUDE compilation_flags_lto
## INCLUDE cuda-flags
export ROOT_CXXMODULES="0"
@@ -16,5 +17,8 @@ export COMPILER_CXXFLAGS="%{arch_build_flags}"
export ORACLE_ENV_ROOT=""
export CUDA_FLAGS="%{nvcc_cuda_flags}"
export CUDA_HOST_CXXFLAGS="%{nvcc_stdcxx}"
+%if "%{?lto_build_flags}"
+export LTO_FLAGS="%{lto_build_flags}"
+%endif
if [ $(echo ' %requiredtools ' | grep ' python3 ' |wc -l) -gt 0 ] ; then export PYTHON3_LIB_SITE_PACKAGES ; fi
if [ $(echo ' %requiredtools ' | grep ' python ' |wc -l) -gt 0 ] ; then export PYTHON_LIB_SITE_PACKAGES ; fi
diff --git a/scram-tools.file/tools/gcc/gcc-cxxcompiler.xml b/scram-tools.file/tools/gcc/gcc-cxxcompiler.xml
index 72cbb4a6ea4..e99e485287f 100644
--- a/scram-tools.file/tools/gcc/gcc-cxxcompiler.xml
+++ b/scram-tools.file/tools/gcc/gcc-cxxcompiler.xml
@@ -23,6 +23,7 @@
+
diff --git a/vecgeom.spec b/vecgeom.spec
index 385341d35e6..57e9be229ef 100644
--- a/vecgeom.spec
+++ b/vecgeom.spec
@@ -1,5 +1,6 @@
### RPM external vecgeom v1.1.17
## INCLUDE compilation_flags
+## INCLUDE compilation_flags_lto
%define tag ed9a40412c354652262ec80af449f5531206e52c
Source: git+https://gitlab.cern.ch/VecGeom/VecGeom.git?obj=master/%{tag}&export=%{n}-%{realversion}&output=/%{n}-%{realversion}.tgz
BuildRequires: cmake gmake
@@ -32,7 +33,9 @@ cmake ../%{n}-%{realversion} \
-DCMAKE_VERBOSE_MAKEFILE=TRUE \
-DCMAKE_CXX_STANDARD=17 \
%if "%{?arch_build_flags}"
- -DCMAKE_CXX_FLAGS="%{arch_build_flags}" \
+ -DCMAKE_CXX_FLAGS="%{arch_build_flags} %{lto_build_flags}" \
+%else
+ -DCMAKE_CXX_FLAGS="%{lto_build_flags}" \
%endif
-DGEANT4=OFF