| #!/bin/bash | |
| # set explicitly, the workflow invokes this as `bash run.sh`, which ignores the shebang | |
| set -e | |
| echo "Running sumMIT integration tests" | |
| CLANGV=$1 | |
| ENZYME_DIR=$2 | |
| NPROC=${3:-`nproc`} | |
| LLDENZYME=$ENZYME_DIR/LLDEnzyme-$CLANGV.so | |
| # sumMIT lives in a private repository, so the workflow forwards SUMMIT_TOKEN, a | |
| # token with read access to it. Fail early rather than on a bare git credential | |
| # prompt, so an expired or missing token is obvious from the log. | |
| if [ -z "$SUMMIT_URL" ] && [ -z "$SUMMIT_TOKEN" ]; then | |
| echo "SUMMIT_TOKEN is empty; cloning the private sumMIT repository needs a token" >&2 | |
| echo "with read access to MIT-PSAAP-IV/sumMIT. If the secret exists, it has" >&2 | |
| echo "most likely expired and needs to be reissued." >&2 | |
| exit 1 | |
| fi | |
| SUMMIT_URL=${SUMMIT_URL:-https://${SUMMIT_TOKEN:+x-access-token:$SUMMIT_TOKEN@}github.com/MIT-PSAAP-IV/sumMIT.git} | |
| # the Enzyme tests live on the enzyme-ad branch; switch to main once it lands | |
| SUMMIT_BRANCH=${SUMMIT_BRANCH:-enzyme-ad} | |
| echo "CLANGV: $CLANGV" | |
| echo "ENZYME_DIR: $ENZYME_DIR" | |
| echo "LLDENZYME: $LLDENZYME" | |
| echo "NPROC: $NPROC" | |
| echo "SUMMIT_BRANCH: $SUMMIT_BRANCH" | |
| if [ ! -f "$LLDENZYME" ]; then | |
| echo "LLDEnzyme plugin not found at $LLDENZYME" >&2 | |
| exit 1 | |
| fi | |
| WORKDIR=$PWD | |
| echo "Installing dependencies" | |
| apt-get update | |
| # lld is required because sumMIT links the Enzyme tests through LLDEnzyme, the | |
| # remaining packages are sumMIT's documented dependency set (doc/wiki/installing) | |
| apt-get install -y \ | |
| lld-$CLANGV gfortran cmake git ca-certificates \ | |
| libgtest-dev libopenmpi-dev libmetis-dev libparmetis-dev \ | |
| petsc-dev slepc-dev libhdf5-dev libhdf5-openmpi-dev \ | |
| libeigen3-dev libgsl-dev libyaml-cpp-dev libjsoncpp-dev \ | |
| libvtk9-dev python3-vtk9 qtbase5-dev qtchooser qt5-qmake qttools5-dev-tools \ | |
| pybind11-dev libpython3-dev python3-pip | |
| echo "Building pyre" | |
| # pyre is not packaged for Ubuntu, so build it from source. The clone cannot be | |
| # shallow because pyre derives its version with git describe, which needs tags. | |
| git clone https://github.com/pyre/pyre.git | |
| cmake -S pyre -B pyre-build \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DCMAKE_PREFIX_PATH="/usr" \ | |
| -DCMAKE_MODULE_PATH="$WORKDIR/pyre/.cmake" \ | |
| -DCMAKE_INSTALL_PREFIX="$WORKDIR/pyre-install" | |
| cmake --build pyre-build --target install -j $NPROC | |
| echo "Cloning sumMIT" | |
| # not shallow: summit_getVersion runs git describe --tags --long --always, and | |
| # without tags reachable from HEAD that yields a bare sha, which sumMIT rejects | |
| git clone -b $SUMMIT_BRANCH "$SUMMIT_URL" sumMIT | |
| echo "Writing sumMIT toolchain file" | |
| # sumMIT resolves its dependencies through a toolchain file rather than through | |
| # plain cmake variables; see doc/wiki/installing/cmake.md in the sumMIT tree | |
| cat > $WORKDIR/enzyme_toolchain.cmake <<EOF | |
| include(summit_init) | |
| set(CMAKE_C_COMPILER "clang-$CLANGV" CACHE FILEPATH "" FORCE) | |
| set(CMAKE_CXX_COMPILER "clang++-$CLANGV" CACHE FILEPATH "" FORCE) | |
| set(CMAKE_Fortran_COMPILER "gfortran" CACHE FILEPATH "" FORCE) | |
| set(SYS_PREFIX "/usr") | |
| set(HDF5_PREFER_PARALLEL ON) | |
| set(PYBIND11_FINDPYTHON ON) | |
| summit_set_dependency(Eigen3 "\${SYS_PREFIX}" "Eigen3::Eigen") | |
| summit_set_dependency(GTEST "\${SYS_PREFIX}" "GTest::gtest") | |
| summit_set_dependency(GSL "\${SYS_PREFIX}" "GSL::gsl") | |
| summit_set_dependency(HDF5 "\${SYS_PREFIX}" "HDF5::HDF5") | |
| summit_set_dependency(METIS "\${SYS_PREFIX}" "METIS::METIS") | |
| summit_set_dependency(MPI "\${SYS_PREFIX}/lib/x86_64-linux-gnu/openmpi" "MPI::MPI_CXX") | |
| summit_set_dependency(ParMETIS "\${SYS_PREFIX}" "ParMETIS::ParMETIS") | |
| summit_set_dependency(PETSc "\${SYS_PREFIX}" "PETSc::PETSc") | |
| summit_set_dependency(pybind11 "\${SYS_PREFIX}" "pybind11::module") | |
| summit_set_dependency(PYRE "$WORKDIR/pyre-install" "pyre::pyre") | |
| summit_set_dependency(Python "\${SYS_PREFIX}" "Python3::Python") | |
| summit_set_dependency(SLEPc "\${SYS_PREFIX}" "SLEPc::SLEPc") | |
| summit_set_dependency(VTK "\${SYS_PREFIX}" "VTK::CommonCore") | |
| summit_set_dependency(VTK "\${SYS_PREFIX}" "VTK::IOXML") | |
| summit_set_dependency(VTK "\${SYS_PREFIX}" "VTK::CommonDataModel") | |
| summit_set_dependency(yaml-cpp "\${SYS_PREFIX}" "yaml-cpp") | |
| list(REMOVE_DUPLICATES CMAKE_PREFIX_PATH) | |
| set(CMAKE_PREFIX_PATH "\${CMAKE_PREFIX_PATH}" CACHE STRING "" FORCE) | |
| summit_generate_features_file() | |
| EOF | |
| echo "Configuring sumMIT" | |
| cmake -S sumMIT -B summit-build \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DCMAKE_TOOLCHAIN_FILE=$WORKDIR/enzyme_toolchain.cmake \ | |
| -DSUMMIT_COMPILER_SET=CLANG \ | |
| -DSUMMIT_BUILD_TESTING=ON \ | |
| -DSUMMIT_DEBUG=OFF \ | |
| -DWITH_ENZYME=ON \ | |
| -DSUMMIT_ENZYME_LLD_PLUGIN=$LLDENZYME | |
| # The Enzyme test drivers are EXCLUDE_FROM_ALL, and the ctest name of each one is | |
| # its target name, so ask ctest which ones exist rather than hardcoding the list. | |
| TARGETS=`ctest --test-dir summit-build -N -R enzyme | sed -n 's/^ *Test *#[0-9]*: *//p'` | |
| if [ -z "$TARGETS" ]; then | |
| echo "No sumMIT Enzyme tests were registered" >&2 | |
| exit 1 | |
| fi | |
| echo "Building Enzyme test drivers:" | |
| echo "$TARGETS" | |
| cmake --build summit-build --target $TARGETS -j $NPROC | |
| ctest --test-dir summit-build -R enzyme --output-on-failure |