From 85135fe7db8051fffeedc0b6b10d59e462ffee76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ole=20Sch=C3=BCtt?= Date: Sun, 10 Dec 2023 15:09:18 +0100 Subject: [PATCH] Docker: Install dependencies for CMake test via Spack --- tools/docker/Dockerfile.test_cmake | 104 ++++++++++----------- tools/docker/generate_dockerfiles.py | 68 ++++++++++++-- tools/docker/scripts/test_regtest_cmake.sh | 23 +++-- tools/spack/cp2k-dependencies.yaml | 40 ++++++++ 4 files changed, 164 insertions(+), 71 deletions(-) create mode 100644 tools/spack/cp2k-dependencies.yaml diff --git a/tools/docker/Dockerfile.test_cmake b/tools/docker/Dockerfile.test_cmake index 083fcbc665..b67ef08f2e 100644 --- a/tools/docker/Dockerfile.test_cmake +++ b/tools/docker/Dockerfile.test_cmake @@ -5,64 +5,58 @@ FROM ubuntu:22.04 -# Install requirements for the toolchain. -WORKDIR /opt/cp2k-toolchain -COPY ./tools/toolchain/install_requirements*.sh ./ -RUN ./install_requirements.sh ubuntu:22.04 +# Install common dependencies as pre-built Ubuntu packages. +RUN apt-get update -qq && apt-get install -qq --no-install-recommends \ + autoconf \ + autogen \ + automake \ + autotools-dev \ + bzip2 \ + ca-certificates \ + g++ \ + gcc \ + gfortran \ + git \ + less \ + libtool \ + libtool-bin \ + make \ + nano \ + ninja-build \ + patch \ + pkgconf \ + python3 \ + unzip \ + wget \ + xxd \ + zlib1g-dev \ + cmake \ + gnupg \ + m4 \ + xz-utils \ + libssl-dev \ + libssh-dev \ + mpich \ + libmpich-dev \ + && rm -rf /var/lib/apt/lists/* -# Install the toolchain. -RUN mkdir scripts -COPY ./tools/toolchain/scripts/VERSION \ - ./tools/toolchain/scripts/parse_if.py \ - ./tools/toolchain/scripts/tool_kit.sh \ - ./tools/toolchain/scripts/common_vars.sh \ - ./tools/toolchain/scripts/signal_trap.sh \ - ./tools/toolchain/scripts/get_openblas_arch.sh \ - ./scripts/ -COPY ./tools/toolchain/install_cp2k_toolchain.sh . -RUN ./install_cp2k_toolchain.sh \ - --install-all \ - --with-gcc=system \ - --dry-run +# Install a recent developer version of Spack. +WORKDIR /opt/spack +RUN git init --quiet && \ + git remote add origin https://github.com/spack/spack.git && \ + git fetch --quiet --depth 1 origin 8bcb1f8766ffbf097ec685bdafad53bc8b6e9e30 && \ + git checkout --quiet FETCH_HEAD +ENV PATH="/opt/spack/bin:${PATH}" -# Dry-run leaves behind config files for the followup install scripts. -# This breaks up the lengthy installation into smaller docker build steps. -COPY ./tools/toolchain/scripts/stage0/ ./scripts/stage0/ -RUN ./scripts/stage0/install_stage0.sh && rm -rf ./build +# Find all external packages and compilers. +RUN spack external find --all --not-buildable +RUN spack compiler find -COPY ./tools/toolchain/scripts/stage1/ ./scripts/stage1/ -RUN ./scripts/stage1/install_stage1.sh && rm -rf ./build - -COPY ./tools/toolchain/scripts/stage2/ ./scripts/stage2/ -RUN ./scripts/stage2/install_stage2.sh && rm -rf ./build - -COPY ./tools/toolchain/scripts/stage3/ ./scripts/stage3/ -RUN ./scripts/stage3/install_stage3.sh && rm -rf ./build - -COPY ./tools/toolchain/scripts/stage4/ ./scripts/stage4/ -RUN ./scripts/stage4/install_stage4.sh && rm -rf ./build - -COPY ./tools/toolchain/scripts/stage5/ ./scripts/stage5/ -RUN ./scripts/stage5/install_stage5.sh && rm -rf ./build - -COPY ./tools/toolchain/scripts/stage6/ ./scripts/stage6/ -RUN ./scripts/stage6/install_stage6.sh && rm -rf ./build - -COPY ./tools/toolchain/scripts/stage7/ ./scripts/stage7/ -RUN ./scripts/stage7/install_stage7.sh && rm -rf ./build - -COPY ./tools/toolchain/scripts/stage8/ ./scripts/stage8/ -RUN ./scripts/stage8/install_stage8.sh && rm -rf ./build - -COPY ./tools/toolchain/scripts/arch_base.tmpl \ - ./tools/toolchain/scripts/generate_arch_files.sh \ - ./scripts/ -RUN ./scripts/generate_arch_files.sh && rm -rf ./build - -# Install DBCSR. -WORKDIR /opt/dbcsr -COPY ./tools/docker/scripts/install_dbcsr.sh . -RUN ./install_dbcsr.sh +# Install CP2K's dependencies via Spack. +WORKDIR / +COPY ./tools/spack/cp2k-dependencies.yaml . +RUN spack env create myenv ./cp2k-dependencies.yaml +RUN spack --env=myenv install # Install CP2K sources. WORKDIR /opt/cp2k diff --git a/tools/docker/generate_dockerfiles.py b/tools/docker/generate_dockerfiles.py index a5a4ddd2c8..76475d6a87 100755 --- a/tools/docker/generate_dockerfiles.py +++ b/tools/docker/generate_dockerfiles.py @@ -39,7 +39,7 @@ def main() -> None: f.write(toolchain_full() + regtest("sdbg", "minimal")) with OutputFile(f"Dockerfile.test_cmake", args.check) as f: - f.write(toolchain_full() + regtest_cmake()) + f.write(spack_env_toolchain() + regtest_cmake()) for version in "ssmp", "psmp": with OutputFile(f"Dockerfile.test_asan-{version}", args.check) as f: @@ -158,11 +158,6 @@ RUN /bin/bash -o pipefail -c " \ def regtest_cmake(testopts: str = "") -> str: return ( rf""" -# Install DBCSR. -WORKDIR /opt/dbcsr -COPY ./tools/docker/scripts/install_dbcsr.sh . -RUN ./install_dbcsr.sh - # Install CP2K sources. WORKDIR /opt/cp2k COPY ./src ./src @@ -753,6 +748,67 @@ RUN ./scripts/generate_arch_files.sh && rm -rf ./build """.lstrip() +# ====================================================================================== +def spack_env_toolchain() -> str: + return rf""" +FROM ubuntu:22.04 + +# Install common dependencies as pre-built Ubuntu packages. +RUN apt-get update -qq && apt-get install -qq --no-install-recommends \ + autoconf \ + autogen \ + automake \ + autotools-dev \ + bzip2 \ + ca-certificates \ + g++ \ + gcc \ + gfortran \ + git \ + less \ + libtool \ + libtool-bin \ + make \ + nano \ + ninja-build \ + patch \ + pkgconf \ + python3 \ + unzip \ + wget \ + xxd \ + zlib1g-dev \ + cmake \ + gnupg \ + m4 \ + xz-utils \ + libssl-dev \ + libssh-dev \ + mpich \ + libmpich-dev \ + && rm -rf /var/lib/apt/lists/* + +# Install a recent developer version of Spack. +WORKDIR /opt/spack +RUN git init --quiet && \ + git remote add origin https://github.com/spack/spack.git && \ + git fetch --quiet --depth 1 origin 8bcb1f8766ffbf097ec685bdafad53bc8b6e9e30 && \ + git checkout --quiet FETCH_HEAD +ENV PATH="/opt/spack/bin:${{PATH}}" + +# Find all external packages and compilers. +RUN spack external find --all --not-buildable +RUN spack compiler find + +# Install CP2K's dependencies via Spack. +WORKDIR / +COPY ./tools/spack/cp2k-dependencies.yaml . +RUN spack env create myenv ./cp2k-dependencies.yaml +RUN spack --env=myenv install +""" + + +# ====================================================================================== def spack_toolchain(distro: str, spec: str) -> str: return rf""" FROM {distro} as builder diff --git a/tools/docker/scripts/test_regtest_cmake.sh b/tools/docker/scripts/test_regtest_cmake.sh index 9a89787052..b6168e65d6 100755 --- a/tools/docker/scripts/test_regtest_cmake.sh +++ b/tools/docker/scripts/test_regtest_cmake.sh @@ -11,26 +11,29 @@ if ((SHM_AVAIL < 1024)); then exit 1 fi -# shellcheck disable=SC1091 -source /opt/cp2k-toolchain/install/setup +eval "$(spack env activate myenv --sh)" + +# Using Ninja because of https://gitlab.kitware.com/cmake/cmake/issues/18188 # Run CMake. mkdir build cd build || exit 1 if ! cmake \ + -GNinja \ + -DCMAKE_C_FLAGS="-fno-lto" \ + -DCMAKE_Fortran_FLAGS="-fno-lto" \ -DCMAKE_INSTALL_PREFIX=/opt/cp2k \ -Werror=dev \ - -DCP2K_USE_VORI=ON \ - -DCP2K_USE_COSMA=NO \ + -DCP2K_USE_VORI=OFF \ + -DCP2K_USE_COSMA=OFF \ -DCP2K_BLAS_VENDOR=OpenBLAS \ -DCP2K_USE_SPGLIB=ON \ - -DCP2K_USE_LIBINT2=ON \ + -DCP2K_USE_LIBINT2=OFF \ -DCP2K_USE_LIBXC=ON \ -DCP2K_USE_LIBTORCH=OFF \ -DCP2K_USE_MPI=ON \ -DCP2K_ENABLE_REGTESTS=ON \ - .. &> ./cmake.log; then - tail -n 100 cmake.log + .. |& tee ./cmake.log; then echo -e "\nSummary: CMake failed." echo -e "Status: FAILED\n" exit 0 @@ -44,12 +47,12 @@ if grep -A5 'CMake Warning' ./cmake.log; then fi # Compile CP2K. -echo -n 'Compiling cp2k...' -if make -j &> make.log; then +echo -en '\nCompiling cp2k...' +if ninja --verbose &> ninja.log; then echo "done." else echo -e "failed.\n\n" - tail -n 100 make.log + tail -n 100 ninja.log echo -e "\nSummary: Compilation failed." echo -e "Status: FAILED\n" exit 0 diff --git a/tools/spack/cp2k-dependencies.yaml b/tools/spack/cp2k-dependencies.yaml new file mode 100644 index 0000000000..d41bbebb5e --- /dev/null +++ b/tools/spack/cp2k-dependencies.yaml @@ -0,0 +1,40 @@ +# This is a Spack Environment file for developing CP2K. + +spack: + specs: + - "cmake @3.22:" # external + - "mpi @4" # external + - "openblas @0.3.24 +fortran threads=openmp" + - "dbcsr@2.6.0 +openmp +mpi" + - "netlib-scalapack @2.2.0" + - "libxsmm @1.17" + - "fftw @3.3.10 +openmp" + - "libxc @6.2.2" + - "spglib @1.16.2" + + # Unfortunately, ScaLAPACK 2.2.1 has not yet been packaged by Spack. + # https://github.com/Reference-ScaLAPACK/scalapack/tree/v2.2.1 + # which contains https://github.com/Reference-ScaLAPACK/scalapack/pull/26 + + # TODO: + # - "libint @2.6.0 +fortran tune=cp2k-lmax-5" # build takes 16 min + # - "sirius @7.4.3 +fortran +shared +openmp" # build fails + # - "plumed @2.9.0 +shared +mpi optional_modules=all" # requires cython + # - "libvori @220621" # is not recompile with -fPIC + # - "cosma @2.6.6" + # - "elpa @2023.05.001 +openmp" + # + # scotch_6.0.0.tar.gz + # superlu_dist_6.1.0.tar.gz: OK + # pexsi_v1.2.0.tar.gz: OK + # QUIP-0.9.10.tar.gz + # hdf5-1.14.2.tar.bz2: OK + # libvdwxc-0.4.0.tar.gz: OK + # libtorch-cxx11-abi-shared-with-deps-1.12.1+cpu.zip: OK + # SpLA-1.5.5.tar.gz: OK + + view: true + concretizer: + unify: true + +#EOF