Skip to content

Commit d906009

Browse files
Update spack v1.2.2 + Docker fixes (#359)
* Update spack to v1.2.2 * Add unified build.sh and HIP support to the TPL superbuild - build.sh: single driver for z5tux (cpu/cuda/hip) and LC (matrix, tioga, tuo-cpu, tuo-gpu), cmake+ninja by default, --spack for uberenv builds - CMakeLists: HIP plumbing for raja, chai, caliper and hypre - Make python explicit in the py-sphinx externals (spack v1.2 deprecation) * Remove blueos spack config * Remove Lassen and ESSL support * Use the new spack installer on the LC machines * Disable Trilinos by default * Install xz-devel in the Rocky TPL image * Fix Ubuntu CUDA TPL image builds - Inject the streak2 CA bundle into Ubuntu Dockerfiles, not only Rocky - Patch fmt 11.2.0 so nvcc + clang does not fail on _BitInt - Keep extra .dockerignore rules and add CPU/memory limits to reproduce_ci.sh * Add a logged --all sweep to reproduce_ci.sh * Limit Spack build parallelism * Use Ubuntu CA bundle --------- Co-authored-by: Randolph Settgast <settgast1@llnl.gov>
1 parent 1d4b3de commit d906009

24 files changed

Lines changed: 333 additions & 382 deletions

.dockerignore

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
.git
2+
build
3+
build-*
4+
install
5+
install-*
6+
*_tpls
7+
.rocm-ci-local.*
8+
*.cmake
9+
*.log
10+
__pycache__
11+
vtk-9.6.2-local/
12+
tplMirror/*.tar.gz
13+
tplMirror/chai-develop-060425/

.github/workflows/docker_build_tpls.yml

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,15 @@ jobs:
167167
lfs: true
168168

169169
- name: Set up Docker Buildx
170+
if: matrix.RUNS_ON != 'streak2'
170171
uses: docker/setup-buildx-action@v4
171172

173+
- name: Set up Docker Buildx
174+
if: matrix.RUNS_ON == 'streak2'
175+
uses: docker/setup-buildx-action@v4
176+
with:
177+
driver-opts: network=host
178+
172179
- name: Print environment
173180
run: printenv
174181

@@ -180,8 +187,38 @@ jobs:
180187
- name: Inject CA certificate into Docker build
181188
if: matrix.RUNS_ON == 'streak2'
182189
run: |
190+
set -euo pipefail
183191
cp /etc/pki/tls/certs/ca-bundle.crt ./ca-bundle.crt
184-
sed -i '/RUN dnf clean all/i COPY ca-bundle.crt /etc/pki/ca-trust/source/anchors/ca-bundle.crt\nRUN update-ca-trust extract' ${{ matrix.TPL_DOCKERFILE }}
192+
dockerfile="${{ matrix.TPL_DOCKERFILE }}"
193+
if grep -q 'RUN dnf clean all' "${dockerfile}"; then
194+
sed -i '/RUN dnf clean all/i COPY ca-bundle.crt /etc/pki/ca-trust/source/anchors/ca-bundle.crt\nRUN update-ca-trust extract' "${dockerfile}"
195+
else
196+
# Ubuntu CUDA jobs also run on streak2. Only COPY the host bundle;
197+
# tpl-ubuntu.Dockerfile configures APT before its first update and
198+
# installs the bundle after ca-certificates so the package postinst
199+
# cannot wipe it. ENV covers pip/curl/git.
200+
awk '
201+
BEGIN { inserted=0 }
202+
{
203+
print
204+
if (!inserted && $0 ~ /^FROM /) {
205+
print "COPY ca-bundle.crt /etc/ssl/certs/llnl-ca-bundle.crt"
206+
print "ENV SSL_CERT_FILE=/etc/ssl/certs/llnl-ca-bundle.crt \\"
207+
print " REQUESTS_CA_BUNDLE=/etc/ssl/certs/llnl-ca-bundle.crt \\"
208+
print " CURL_CA_BUNDLE=/etc/ssl/certs/llnl-ca-bundle.crt \\"
209+
print " GIT_SSL_CAINFO=/etc/ssl/certs/llnl-ca-bundle.crt \\"
210+
print " PIP_CERT=/etc/ssl/certs/llnl-ca-bundle.crt"
211+
inserted=1
212+
}
213+
}
214+
END {
215+
if (!inserted) {
216+
print "ERROR: no FROM line in Dockerfile" > "/dev/stderr"
217+
exit 1
218+
}
219+
}
220+
' "${dockerfile}" > "${dockerfile}.ca" && mv "${dockerfile}.ca" "${dockerfile}"
221+
fi
185222
186223
- name: Run the docker build docker script
187224
env:
@@ -196,6 +233,7 @@ jobs:
196233
COMMIT: ${{ github.sha }}
197234
BUILD_DIR: ${{ github.workspace }}
198235
DOCKER_TAG: ${{ github.event.number }}-${{ github.run_number }}
236+
DOCKER_NETWORK: ${{ matrix.RUNS_ON == 'streak2' && 'host' || '' }}
199237
run: bash -x ./scripts/docker-build.sh
200238

201239
- name: Login to DockerHub

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
.project
55
.pydevproject
66
.vscode/
7+
spack/
78
spack-*.txt
89
__pycache__
910
uberenv_*

.uberenv_config.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
"spack_configs_path": "scripts/spack_configs",
77
"spack_packages_path": "scripts/spack_packages/packages",
88
"spack_url": "https://github.com/spack/spack",
9-
"spack_commit": "2e2169d5282d166f63e3ee4db8d4446c43cefa8a",
10-
"spack_commit_note": "v1.1.1 (Jan 14th 2026)",
11-
"spack_packages_commit": "3dd98680871078353a28ee508fa76c7554f918fa",
12-
"spack_packages_note": "Feb 25th 2026"
9+
"spack_commit": "3e19345b6e12f5ff1b874f4059622fc6a1fd804a",
10+
"spack_commit_note": "v1.2.2 (Jul 20th 2026)",
11+
"spack_packages_commit": "bd9b4838fbf9e4ca01ad7b6c6df633ddcc750d71",
12+
"spack_packages_note": "Jul 20th 2026"
1313
}

CMakeLists.txt

Lines changed: 118 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,12 @@ option( BUILD_SHARED_LIBS "" OFF )
4747

4848
option( ENABLE_CALIPER "" ON )
4949
option( ENABLE_HYPRE "" ON )
50-
option( ENABLE_TRILINOS "" ON )
50+
option( ENABLE_TRILINOS "" OFF )
5151
option( ENABLE_PETSC "" OFF )
5252
option( ENABLE_SCOTCH "" ON )
5353
option( ENABLE_SUITESPARSE "" ON )
54+
option( ENABLE_SUPERLU_DIST "" ON )
55+
option( ENABLE_HYPRE_GPU_PROFILING "" OFF )
5456
option( ENABLE_VTK "" ON )
5557
option( ENABLE_VTK_WRAP_PYTHON "" OFF )
5658

@@ -125,6 +127,50 @@ else( TRUE )
125127
endif()
126128

127129

130+
################################
131+
# HIP / ROCm
132+
################################
133+
if( ENABLE_HIP )
134+
if( NOT DEFINED ROCM_PATH )
135+
if( DEFINED HIP_ROOT )
136+
set( ROCM_PATH ${HIP_ROOT} )
137+
elseif( DEFINED ENV{ROCM_PATH} )
138+
set( ROCM_PATH $ENV{ROCM_PATH} )
139+
else()
140+
message( FATAL_ERROR "ENABLE_HIP is ON but neither ROCM_PATH nor HIP_ROOT is defined." )
141+
endif()
142+
endif()
143+
144+
if( NOT DEFINED HIP_ROOT )
145+
set( HIP_ROOT ${ROCM_PATH} )
146+
endif()
147+
148+
if( NOT DEFINED CMAKE_HIP_ARCHITECTURES )
149+
message( FATAL_ERROR "ENABLE_HIP is ON but CMAKE_HIP_ARCHITECTURES is not defined (e.g. gfx90a, gfx942, gfx1100)." )
150+
endif()
151+
152+
# hypre is configured outside of cmake, so it needs the MPI include directory explicitly
153+
# when its sources are compiled for the device.
154+
if( ENABLE_MPI AND NOT DEFINED MPI_INCLUDE_DIR )
155+
if( DEFINED ENV{MPICH_DIR} ) # set by the cray-mpich module on LC
156+
set( MPI_INCLUDE_DIR "$ENV{MPICH_DIR}/include" )
157+
elseif( DEFINED ENV{MPI_ROOT} )
158+
set( MPI_INCLUDE_DIR "$ENV{MPI_ROOT}/include" )
159+
elseif( MPI_C_INCLUDE_DIRS ) # set by find_package( MPI ) through BLT
160+
list( GET MPI_C_INCLUDE_DIRS 0 MPI_INCLUDE_DIR )
161+
elseif( MPI_C_COMPILER ) # <prefix>/bin/mpicc -> <prefix>/include
162+
get_filename_component( MPI_BIN_DIR ${MPI_C_COMPILER} DIRECTORY )
163+
get_filename_component( MPI_PREFIX_DIR ${MPI_BIN_DIR} DIRECTORY )
164+
set( MPI_INCLUDE_DIR "${MPI_PREFIX_DIR}/include" )
165+
else()
166+
message( FATAL_ERROR "ENABLE_HIP is ON but MPI_INCLUDE_DIR is not defined and cannot be deduced." )
167+
endif()
168+
message( STATUS "MPI_INCLUDE_DIR = ${MPI_INCLUDE_DIR}" )
169+
endif()
170+
171+
message( STATUS "ROCM_PATH = ${ROCM_PATH}" )
172+
message( STATUS "CMAKE_HIP_ARCHITECTURES = ${CMAKE_HIP_ARCHITECTURES}" )
173+
endif()
128174

129175

130176
################################
@@ -340,6 +386,13 @@ set(RAJA_URL "${TPL_MIRROR_DIR}/RAJA-v2025.12.0.tar.gz")
340386

341387
message(STATUS "Building RAJA found at ${RAJA_URL}")
342388

389+
# RAJA's vectorization layer does not compile with the ROCm toolchain.
390+
if( ENABLE_HIP )
391+
set( RAJA_ENABLE_VECTORIZATION OFF )
392+
else()
393+
set( RAJA_ENABLE_VECTORIZATION ON )
394+
endif()
395+
343396
ExternalProject_Add( raja
344397
URL ${RAJA_URL}
345398
PREFIX ${PROJECT_BINARY_DIR}/raja
@@ -360,10 +413,18 @@ ExternalProject_Add( raja
360413
-D CUDA_TOOLKIT_ROOT_DIR=${CUDA_TOOLKIT_ROOT_DIR}
361414
-D CMAKE_CUDA_ARCHITECTURES:STRING=${CMAKE_CUDA_ARCHITECTURES}
362415
-D CMAKE_CUDA_FLAGS:STRING=${RAJA_CUDA_FLAGS}
416+
-D ENABLE_HIP:BOOL=${ENABLE_HIP}
417+
-D RAJA_ENABLE_HIP:BOOL=${ENABLE_HIP}
418+
-D CMAKE_HIP_COMPILER=${CMAKE_HIP_COMPILER}
419+
-D RAJA_ENABLE_VECTORIZATION:BOOL=${RAJA_ENABLE_VECTORIZATION}
420+
-D hip_DIR=${HIP_ROOT}/lib/cmake/hip
421+
-D ROCPRIM_DIR=${HIP_ROOT}
422+
-D CMAKE_HIP_ARCHITECTURES:STRING=${CMAKE_HIP_ARCHITECTURES}
363423
-D ENABLE_TESTS:BOOL=OFF
364424
-D ENABLE_EXAMPLES:BOOL=OFF
365425
-D ENABLE_OPENMP:BOOL=${ENABLE_OPENMP}
366426
-D CMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
427+
-D CMAKE_INSTALL_LIBDIR:PATH=lib
367428
-D BUILD_SHARED_LIBS=${BUILD_SHARED_LIBS}
368429
-D CMAKE_POSITION_INDEPENDENT_CODE=${CMAKE_POSITION_INDEPENDENT_CODE}
369430
)
@@ -398,8 +459,14 @@ ExternalProject_Add( chai
398459
-D CUDA_TOOLKIT_ROOT_DIR=${CUDA_TOOLKIT_ROOT_DIR}
399460
-D CMAKE_CUDA_ARCHITECTURES:STRING=${CMAKE_CUDA_ARCHITECTURES}
400461
-D CMAKE_CUDA_FLAGS:STRING=${CHAI_CUDA_FLAGS}
462+
-D ENABLE_HIP:BOOL=${ENABLE_HIP}
463+
-D CHAI_ENABLE_HIP:BOOL=${ENABLE_HIP}
464+
-D CMAKE_HIP_COMPILER=${CMAKE_HIP_COMPILER}
465+
-D hip_DIR=${HIP_ROOT}/lib/cmake/hip
466+
-D CMAKE_HIP_ARCHITECTURES:STRING=${CMAKE_HIP_ARCHITECTURES}
401467
-D ENABLE_OPENMP=${ENABLE_OPENMP}
402468
-D CMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
469+
-D CMAKE_INSTALL_LIBDIR:PATH=lib
403470
-D BUILD_SHARED_LIBS=${BUILD_SHARED_LIBS}
404471
-D ENABLE_TESTS=OFF
405472
-D ENABLE_BENCHMARKS=OFF
@@ -444,6 +511,7 @@ if (ENABLE_CALIPER)
444511
-D MPI_CXX_COMPILER:STRING=${MPI_CXX_COMPILER}
445512
-D CMAKE_POSITION_INDEPENDENT_CODE=${CMAKE_POSITION_INDEPENDENT_CODE}
446513
-D CMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
514+
-D CMAKE_INSTALL_LIBDIR:PATH=lib
447515
-D BLT_SOURCE_DIR=${BLT_SOURCE_DIR}
448516
)
449517

@@ -480,14 +548,23 @@ if (ENABLE_CALIPER)
480548
-D CUDA_TOOLKIT_ROOT_DIR:PATH=${CUDA_TOOLKIT_ROOT_DIR}
481549
-D CMAKE_POSITION_INDEPENDENT_CODE=${CMAKE_POSITION_INDEPENDENT_CODE}
482550
-D CMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
551+
-D CMAKE_INSTALL_LIBDIR:PATH=lib
483552
-D WITH_PAPI:BOOL=${ENABLE_PAPI}
484553
-D PAPI_PREFIX:STRING=${PAPI_PREFIX}
485554
-D WITH_ADIAK:BOOL=ON
486555
-D adiak_DIR:STRING=${ADIAK_DIR}/lib/cmake/adiak/
487556
-D WITH_CUPTI=${CALIPER_WITH_CUPTI}
488557
-D WITH_NVPROF=${ENABLE_CUDA}
558+
-D WITH_ROCM=${ENABLE_ROCTX}
559+
-D ROCM_PREFIX:PATH=${ROCM_PATH}
489560
)
490561

562+
if( BUILD_SHARED_LIBS )
563+
set( CALIPER_LIB "libcaliper.so" )
564+
else()
565+
set( CALIPER_LIB "libcaliper.a" )
566+
endif()
567+
491568
list(APPEND build_list caliper adiak)
492569
else()
493570
set( ENABLE_CALIPER_HYPRE OFF CACHE BOOL "" FORCE )
@@ -589,11 +666,6 @@ if (ENABLE_TRILINOS)
589666
-D TPL_MKL_LIBRARIES:STRING=${MKL_LIBRARIES})
590667
endif()
591668

592-
if ( ENABLE_ESSL )
593-
set( TRILINOS_EXTRA_ARGS ${TRILINOS_EXTRA_ARGS}
594-
-D HAVE_dggsvd3:BOOL=ON)
595-
endif()
596-
597669
if ( DEFINED OpenMP_Fortran_FLAGS )
598670
set( TRILINOS_EXTRA_ARGS ${TRILINOS_EXTRA_ARGS}
599671
-D OpenMP_Fortran_FLAGS:STRING=${OpenMP_Fortran_FLAGS})
@@ -737,7 +809,7 @@ list(APPEND build_list metis )
737809
################################
738810
# SUPERLU --
739811
################################
740-
if( ENABLE_MPI )
812+
if( ENABLE_MPI AND ENABLE_SUPERLU_DIST )
741813
set(SUPERLU_DIR "${CMAKE_INSTALL_PREFIX}/superlu_dist")
742814
set(SUPERLU_URL "${TPL_MIRROR_DIR}/superlu_dist-0f6efc3.tar.gz")
743815

@@ -784,6 +856,7 @@ if( ENABLE_MPI )
784856
-D CMAKE_Fortran_FLAGS_RELEASE=${CMAKE_Fortran_FLAGS_RELEASE}
785857
-D CMAKE_POSITION_INDEPENDENT_CODE=${CMAKE_POSITION_INDEPENDENT_CODE}
786858
-D CMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
859+
-D CMAKE_INSTALL_LIBDIR:PATH=lib
787860
-D enable_openmp=${ENABLE_OPENMP}
788861
)
789862

@@ -814,6 +887,9 @@ if( ENABLE_HYPRE )
814887
set( HYPRE_C_COMPILER ${MPI_C_COMPILER} )
815888
set( HYPRE_CXX_COMPILER ${MPI_CXX_COMPILER} )
816889
set( HYPRE_Fortran_COMPILER ${MPI_Fortran_COMPILER} )
890+
endif()
891+
892+
if( ENABLE_MPI AND ENABLE_SUPERLU_DIST )
817893
set( HYPRE_SUPERLU_LIBS "${SUPERLU_DIR}/lib/libsuperlu_dist.a ${PARMETIS_DIR}/lib/libparmetis.a ${METIS_DIR}/lib/libmetis.a -lstdc++" )
818894
if( ENABLE_OPENMP )
819895
set( HYPRE_SUPERLU_LIBS "${HYPRE_SUPERLU_LIBS} ${OpenMP_C_FLAGS}" ) # Sergey: why is this needed?
@@ -844,9 +920,41 @@ if( ENABLE_HYPRE )
844920
--with-umpire-include=${CHAI_DIR}/include \
845921
--with-umpire-lib-dirs=${CHAI_DIR}/lib \
846922
--with-umpire-libs=umpire " )
923+
924+
if( ENABLE_HYPRE_GPU_AWARE_MPI )
925+
set( HYPRE_CUDA_FLAGS "${HYPRE_CUDA_FLAGS} --enable-gpu-aware-mpi" )
926+
endif()
927+
928+
if( ENABLE_HYPRE_GPU_PROFILING )
929+
set( HYPRE_CUDA_FLAGS "${HYPRE_CUDA_FLAGS} --enable-gpu-profiling" )
930+
endif()
847931
endif()
848932
elseif( ENABLE_HYPRE_DEVICE STREQUAL "HIP" )
849-
message( FATAL_ERROR "hip tpls build only supported through spack" )
933+
if( NOT ENABLE_HIP )
934+
message( FATAL_ERROR "Non-compatible options: HYPRE device cannot be set to HIP when ENABLE_HIP is OFF" )
935+
else()
936+
list( APPEND HYPRE_DEPENDS chai )
937+
set( HYPRE_HIP_FLAGS "\
938+
ROCM_PATH=${ROCM_PATH} \
939+
--with-hip \
940+
--enable-rocblas \
941+
--enable-rocsparse \
942+
--enable-rocsolver \
943+
--with-gpu-arch=${CMAKE_HIP_ARCHITECTURES} \
944+
--with-umpire-device \
945+
--with-umpire-include=${CHAI_DIR}/include \
946+
--with-umpire-lib-dirs=${CHAI_DIR}/lib \
947+
--with-umpire-libs=\"umpire camp\" \
948+
--with-MPI-include=${MPI_INCLUDE_DIR} " )
949+
950+
if( ENABLE_HYPRE_GPU_AWARE_MPI )
951+
set( HYPRE_HIP_FLAGS "${HYPRE_HIP_FLAGS} --enable-gpu-aware-mpi" )
952+
endif()
953+
954+
if( ENABLE_HYPRE_GPU_PROFILING )
955+
set( HYPRE_HIP_FLAGS "${HYPRE_HIP_FLAGS} --enable-gpu-profiling" )
956+
endif()
957+
endif()
850958
endif()
851959

852960
if( CMAKE_HOST_APPLE )
@@ -856,7 +964,7 @@ if( ENABLE_HYPRE )
856964
endif()
857965

858966
if( ENABLE_CALIPER_HYPRE )
859-
set( HYPRE_CALIPER_FLAGS "--with-caliper --with-caliper-include=\"${CALIPER_DIR}/include\" --with-caliper-lib=\"${CALIPER_DIR}/libs/caliper.a\"" )
967+
set( HYPRE_CALIPER_FLAGS "--with-caliper --with-caliper-include=\"${CALIPER_DIR}/include\" --with-caliper-lib=\"${CALIPER_DIR}/lib/${CALIPER_LIB}\"" )
860968
list( APPEND HYPRE_DEPENDS caliper )
861969
endif()
862970

@@ -881,6 +989,7 @@ if( ENABLE_HYPRE )
881989
${HYPRE_SUPERLU_FLAGS} \
882990
${HYPRE_OPENMP_FLAG} \
883991
${HYPRE_CUDA_FLAGS} \
992+
${HYPRE_HIP_FLAGS} \
884993
${HYPRE_CALIPER_FLAGS}\n")
885994

886995
ExternalProject_Add( hypre

cmake/blt

Submodule blt updated 36 files

cmake/thirdparty/FindMathLibraries.cmake

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,6 @@ if( ENABLE_MKL )
1212
set( BLAS_LIBRARIES "${MKL_LIBRARIES}" CACHE STRING "" FORCE )
1313
set( LAPACK_LIBRARIES "${MKL_LIBRARIES}" CACHE STRING "" FORCE)
1414

15-
elseif( ENABLE_ESSL )
16-
if ( NOT DEFINED ESSL_INCLUDE_DIRS )
17-
message( FATAL_ERROR "ESSL is enabled but ESSL_INCLUDE_DIRS is not defined." )
18-
elseif ( NOT DEFINED ESSL_LIBRARIES )
19-
message( FATAL_ERROR "ESSL is enabled but ESSL_LIBRARIES is not defined." )
20-
endif()
21-
22-
set( BLAS_LIBRARIES "${ESSL_LIBRARIES}" CACHE STRING "" FORCE )
23-
set( LAPACK_LIBRARIES "${ESSL_LIBRARIES}" CACHE STRING "" FORCE )
2415
endif()
2516

2617
if( NOT DEFINED BLAS_LIBRARIES )

docker/openssl-non-fips.cnf

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
openssl_conf = openssl_init
2+
3+
[openssl_init]
4+
providers = provider_sect
5+
alg_section = algorithm_sect
6+
7+
[provider_sect]
8+
default = default_sect
9+
10+
[default_sect]
11+
activate = 1
12+
13+
[algorithm_sect]
14+
default_properties = fips=no

docker/pecan-spack.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ spack:
111111
externals:
112112
- spec: py-sphinx@4.3.2
113113
prefix: /usr
114+
dependencies:
115+
- spec: python@3.10.12
114116
python:
115117
buildable: false
116118
externals:

0 commit comments

Comments
 (0)