Skip to content

Generated Dockerfiles

The generated Dockerfiles for all images are shown below.

Note

Patch files, which are applied with git apply commands, are found in the git-repository's patches/ directory. This directory is copied to /build/patches at image build time.

base Dockerfile

Dockerfile.base
#syntax=docker/dockerfile:1

ARG BASE_NAME=archlinux
ARG BASE_TAG=latest

FROM ${BASE_NAME}:${BASE_TAG}

ARG IMAGE_NAME=base
ARG NTHREADS=4
ARG CMAKE_BUILD_TYPE=Release
ARG MESON_BUILD_TYPE=release

ARG USER_NAME=clas12user
ARG GROUP_NAME=clas12user
ARG USER_ID=10001
ARG GROUP_ID=10001

LABEL name=$IMAGE_NAME
LABEL maintainer="Christopher Dilks"
LABEL architecture="amd64"

USER root

# CA certificates
ADD https://pki.jlab.org/JLabCA.crt /tmp/JLabCA.crt
RUN trust anchor --store /tmp/JLabCA.crt && rm /tmp/JLabCA.crt

# define user
RUN groupadd \
  --gid ${GROUP_ID}\
  ${GROUP_NAME} && \
useradd \
  --no-log-init \
  --create-home \
  --shell /usr/sbin/bash \
  --uid ${USER_ID} \
  --gid ${GROUP_ID} \
  ${USER_NAME}

# context
RUN mkdir -p /opt
COPY entrypoint /opt/entrypoint
COPY bin/memmon /usr/local/bin/
COPY bin/container_info /usr/local/bin/

# include info about this image
COPY images.yaml /usr/local/etc/
COPY info.yaml /usr/local/etc/

# pacman mirror configuration
COPY etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist

# include patches
COPY patches /build/patches

# databases
COPY *.sqlite /usr/share/clasdb/
RUN ls -lh /usr/share/clasdb/

# dump runner specs
RUN spec() { echo "::::: $@ :::::" && $@ ; } && \
echo '=== CONTROLLED LIMITS ========' && \
echo "CPU: JL_RUNNER_AVAIL_CPU=${JL_RUNNER_AVAIL_CPU-} threads" && \
echo "MEM: JL_RUNNER_AVAIL_MEM=${JL_RUNNER_AVAIL_MEM-} bytes" && \
echo '=== FULL RUNNER SPECS ========' && \
spec nproc && \
spec lscpu && \
spec free -m && \
echo '=== CGROUPS DETAILS ==========' && \
spec cat /sys/fs/cgroup/cpu.max && \
echo "  (ncpu: divide the first number by the second)" && \
spec cat /sys/fs/cgroup/memory.max && \
echo "  (units: bytes)" && \
echo '=============================='

# system update, before anything
RUN pacman -Syu --noconfirm

# system configuration
# NOTE: using `w /dev/stdout` in `sed -i` calls to print what gets replaced to `stdout`
RUN echo '=============== system configuration ===============' && \
echo '>>> set locale, by uncommenting the relevant locale line' && \
sed -i -e '/en_US\.UTF-8/ s;^#;;g w /dev/stdout' /etc/locale.gen && \
echo '>>> regenerate locales' && \
locale-gen && \
echo '>>> allow man pages to be installed, by commenting out the relevant `NoExtract` line' && \
sed -i -e '/^\<NoExtract\>.*\<man\>/ s;^;#; w /dev/stdout' /etc/pacman.conf && \
echo '>>> install manpage for pacman' && \
pacman -S --noconfirm pacman && \
echo '=============== done system configuration ==============='

# `/usr/local` is not in all default search paths
# - already included by default in `$PATH`
# - everything else uses the following env vars:
ENV CMAKE_PREFIX_PATH=/usr/local
ENV LD_LIBRARY_PATH=/usr/local/lib
ENV PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
ENV PYTHONPATH=/usr/local/python
ENV ROOT_INCLUDE_PATH=/usr/local/include

# install upstream packages with pacman
# NOTE: the pacman cache is cleared afterward to minimize image size
RUN pacman -Syu --noconfirm && \
pacman -S --noconfirm --needed \
  bash \
  bc \
  binutils \
  clang \
  cmake \
  curl \
  davix \
  diffutils \
  emacs-nox \
  expac \
  fish \
  fmt \
  fzf \
  gcc-fortran \
  gcc \
  git-lfs \
  git \
  glew \
  glu \
  gradle \
  groovy \
  gsl \
  inetutils \
  jdk21-openjdk \
  jq \
  libx11 \
  libxext \
  libxft \
  libxpm \
  llvm \
  make \
  man-db \
  man-pages \
  mariadb-clients \
  maven \
  meson \
  nano \
  ncdu \
  ninja \
  nvim \
  openssl \
  patch \
  pkgconf \
  plocate \
  python-pip \
  python-sqlalchemy \
  python \
  ripgrep \
  rsync \
  ruby \
  scons \
  sqlite \
  tcsh \
  tree \
  vim \
  wget \
  which \
  xorg-server-xvfb \
  xorg-xeyes \
  yq \
  zsh && \
yes | pacman -Scc

# create a python virtual environment, for packages not from the Linux package repo
RUN python -m venv --system-site-packages /opt/venv
ENV VIRTUAL_ENV=/opt/venv
ENV PATH=$VIRTUAL_ENV/bin:$PATH

# make a temporary build directory; all build instructions below should
# assume this is the current working directory
WORKDIR /build

# install asprof, version 4.2 (ref 'v4.2')
RUN git clone \
  --depth 1 \
  --single-branch \
  --branch v4.2 \
  https://github.com/async-profiler/async-profiler.git && \
cd async-profiler && \
git apply /build/patches/asprof/v4.2.patch && \
make -j $NTHREADS && \
install -t /usr/local/lib ./build/lib/* && \
install -t /usr/local/bin ./build/bin/*

# install rcdb, version 1.99.7 (ref '8f797c632f1891b5efd8fc331e1ccf7a4cf7911c')
ENV RCDB_HOME=/opt/rcdb
ENV RCDB_CONNECTION=sqlite:////usr/share/clasdb/rcdb_latest.sqlite
ENV PATH=$RCDB_HOME/bin:$PATH
ENV PYTHONPATH=$RCDB_HOME/python:$PYTHONPATH
RUN git clone \
  --revision 8f797c632f1891b5efd8fc331e1ccf7a4cf7911c \
  https://code.jlab.org/hallb/clas12/rcdb.git \
  $RCDB_HOME

# install ccdb, version 1.99.6 (ref '1.99.6')
ENV CCDB_HOME=/usr/local
ENV CCDB_CONNECTION=sqlite:////usr/share/clasdb/ccdb_latest.sqlite
RUN git clone \
  --depth 1 \
  --single-branch \
  --branch 1.99.6 \
  https://code.jlab.org/hallb/clas12/ccdb.git && \
cmake -S ccdb -B ccdb_build --install-prefix $CCDB_HOME && \
cmake --build ccdb_build -j $NTHREADS && \
cmake --install ccdb_build

# install qadb, version 3.4.1 (ref 'v3.4.1')
# NOTE: this is the only repo that uses JYPATH (for coatjava's `run-groovy`)
ENV QADB=/opt/clas12-qadb
ENV JYPATH=$QADB/src
ENV PATH=$QADB/bin:$PATH
RUN git clone \
  --depth 1 \
  --single-branch \
  --branch v3.4.1 \
  https://github.com/JeffersonLab/clas12-qadb.git \
  --recurse-submodules \
  --shallow-submodules \
  $QADB

# install hipo, version 4.3.0 (ref '4.3.0')
ENV HIPO=/usr/local
RUN git clone \
  --depth 1 \
  --single-branch \
  --branch 4.3.0 \
  https://code.jlab.org/hallb/clas12/hipo-cpp.git && \
meson setup hipo-cpp/build hipo-cpp \
  --prefix=$HIPO \
  -D buildtype=$MESON_BUILD_TYPE \
  && \
meson compile -C hipo-cpp/build -j $NTHREADS && \
meson install -C hipo-cpp/build

# cleanup
WORKDIR /home/${USER_NAME}
RUN rm -rf /build

# remove .git directories, leftover from `git clone` to `/opt/`
RUN find /opt -type d -name .git | xargs -I{} sh -c 'echo "REMOVING {}" && rm -rf {}'

# update plocate DB
RUN updatedb

# set entrypoint
CMD ["/usr/sbin/bash", "--rcfile", "/opt/entrypoint/bashrc"]

# switch back to non-root user
USER ${USER_NAME}

base_root Dockerfile

Dockerfile.base_root
#syntax=docker/dockerfile:1

ARG BASE_NAME=base
ARG BASE_TAG=latest

FROM ${BASE_NAME}:${BASE_TAG}

ARG IMAGE_NAME=base_root
ARG NTHREADS=4
ARG NTHREADS_ROOT=3
ARG CMAKE_BUILD_TYPE=Release
ARG MESON_BUILD_TYPE=release

LABEL name=$IMAGE_NAME
LABEL maintainer="Christopher Dilks"
LABEL architecture="amd64"

# switch from non-root user to root
RUN user_name=$(whoami)
USER root

# include patches
COPY patches /build/patches

# include info about this image
COPY info.yaml /usr/local/etc/

# dump runner specs
RUN spec() { echo "::::: $@ :::::" && $@ ; } && \
echo '=== CONTROLLED LIMITS ========' && \
echo "CPU: JL_RUNNER_AVAIL_CPU=${JL_RUNNER_AVAIL_CPU-} threads" && \
echo "MEM: JL_RUNNER_AVAIL_MEM=${JL_RUNNER_AVAIL_MEM-} bytes" && \
echo '=== FULL RUNNER SPECS ========' && \
spec nproc && \
spec lscpu && \
spec free -m && \
echo '=== CGROUPS DETAILS ==========' && \
spec cat /sys/fs/cgroup/cpu.max && \
echo "  (ncpu: divide the first number by the second)" && \
spec cat /sys/fs/cgroup/memory.max && \
echo "  (units: bytes)" && \
echo '=============================='


# make a temporary build directory; all build instructions below should
# assume this is the current working directory
WORKDIR /build

# install root, version 6.36.06 (ref 'v6-36-06')
# prefer to isolate its installation, so we can more clearly see CLAS12-software in /usr/local
ENV ROOTSYS=/opt/root
ENV PATH=$ROOTSYS/bin:$PATH
ENV LD_LIBRARY_PATH=$ROOTSYS/lib:$LD_LIBRARY_PATH
ENV PYTHONPATH=$ROOTSYS/lib:$PYTHONPATH
ENV CMAKE_PREFIX_PATH=$ROOTSYS:$CMAKE_PREFIX_PATH
RUN git clone \
  --depth 1 \
  --single-branch \
  --branch v6-36-06 \
  https://github.com/root-project/root.git \
  root && \
cmake -S root -B root_build \
  --install-prefix $ROOTSYS \
  -D CMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE \
  -D fftw3=ON \
  -D mathmore=ON \
  -D proof=ON \
  && \
memmon 1 cmake --build root_build -j $NTHREADS_ROOT && \
cmake --install root_build

# install hipo, version 4.3.0 (ref '4.3.0')
ENV HIPO=/usr/local
RUN git clone \
  --depth 1 \
  --single-branch \
  --branch 4.3.0 \
  https://code.jlab.org/hallb/clas12/hipo-cpp.git && \
meson setup hipo-cpp/build hipo-cpp \
  --prefix=$HIPO \
  -D buildtype=$MESON_BUILD_TYPE \
  && \
meson compile -C hipo-cpp/build -j $NTHREADS && \
meson install -C hipo-cpp/build

# cleanup
WORKDIR /home/$user_name
RUN rm -rf /build

# remove .git directories, leftover from `git clone` to `/opt/`
RUN find /opt -type d -name .git | xargs -I{} sh -c 'echo "REMOVING {}" && rm -rf {}'

# update plocate DB
RUN updatedb

# switch back to non-root user
USER $user_name

base_root_debug Dockerfile

Dockerfile.base_root_debug
#syntax=docker/dockerfile:1

ARG BASE_NAME=base
ARG BASE_TAG=latest

FROM ${BASE_NAME}:${BASE_TAG}

ARG IMAGE_NAME=base_root_debug
ARG NTHREADS=4
ARG NTHREADS_ROOT=3
ARG CMAKE_BUILD_TYPE=Release
ARG MESON_BUILD_TYPE=release

LABEL name=$IMAGE_NAME
LABEL maintainer="Christopher Dilks"
LABEL architecture="amd64"

# switch from non-root user to root
RUN user_name=$(whoami)
USER root

# include patches
COPY patches /build/patches

# include info about this image
COPY info.yaml /usr/local/etc/

# dump runner specs
RUN spec() { echo "::::: $@ :::::" && $@ ; } && \
echo '=== CONTROLLED LIMITS ========' && \
echo "CPU: JL_RUNNER_AVAIL_CPU=${JL_RUNNER_AVAIL_CPU-} threads" && \
echo "MEM: JL_RUNNER_AVAIL_MEM=${JL_RUNNER_AVAIL_MEM-} bytes" && \
echo '=== FULL RUNNER SPECS ========' && \
spec nproc && \
spec lscpu && \
spec free -m && \
echo '=== CGROUPS DETAILS ==========' && \
spec cat /sys/fs/cgroup/cpu.max && \
echo "  (ncpu: divide the first number by the second)" && \
spec cat /sys/fs/cgroup/memory.max && \
echo "  (units: bytes)" && \
echo '=============================='


# make a temporary build directory; all build instructions below should
# assume this is the current working directory
WORKDIR /build

# install root, version 6.36.06 (ref 'v6-36-06')
# prefer to isolate its installation, so we can more clearly see CLAS12-software in /usr/local
ENV ROOTSYS=/opt/root
ENV PATH=$ROOTSYS/bin:$PATH
ENV LD_LIBRARY_PATH=$ROOTSYS/lib:$LD_LIBRARY_PATH
ENV PYTHONPATH=$ROOTSYS/lib:$PYTHONPATH
ENV CMAKE_PREFIX_PATH=$ROOTSYS:$CMAKE_PREFIX_PATH
RUN git clone \
  --depth 1 \
  --single-branch \
  --branch v6-36-06 \
  https://github.com/root-project/root.git \
  root && \
cmake -S root -B root_build \
  --install-prefix $ROOTSYS \
  -D CMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE \
  -D fftw3=ON \
  -D mathmore=ON \
  -D proof=ON \
  && \
memmon 1 cmake --build root_build -j $NTHREADS_ROOT && \
cmake --install root_build

# install hipo, version 4.3.0 (ref '4.3.0')
ENV HIPO=/usr/local
RUN git clone \
  --depth 1 \
  --single-branch \
  --branch 4.3.0 \
  https://code.jlab.org/hallb/clas12/hipo-cpp.git && \
meson setup hipo-cpp/build hipo-cpp \
  --prefix=$HIPO \
  -D buildtype=$MESON_BUILD_TYPE \
  && \
meson compile -C hipo-cpp/build -j $NTHREADS && \
meson install -C hipo-cpp/build

# cleanup
WORKDIR /home/$user_name
RUN rm -rf /build

# remove .git directories, leftover from `git clone` to `/opt/`
RUN find /opt -type d -name .git | xargs -I{} sh -c 'echo "REMOVING {}" && rm -rf {}'

# update plocate DB
RUN updatedb

# switch back to non-root user
USER $user_name

analysis Dockerfile

Dockerfile.analysis
#syntax=docker/dockerfile:1

ARG BASE_NAME=base_root
ARG BASE_TAG=latest

FROM ${BASE_NAME}:${BASE_TAG}

ARG IMAGE_NAME=analysis
ARG NTHREADS=4
ARG NTHREADS_ROOT=3
ARG CMAKE_BUILD_TYPE=Release
ARG MESON_BUILD_TYPE=release

LABEL name=$IMAGE_NAME
LABEL maintainer="Christopher Dilks"
LABEL architecture="amd64"

# switch from non-root user to root
RUN user_name=$(whoami)
USER root

# include patches
COPY patches /build/patches

# include info about this image
COPY info.yaml /usr/local/etc/

# dump runner specs
RUN spec() { echo "::::: $@ :::::" && $@ ; } && \
echo '=== CONTROLLED LIMITS ========' && \
echo "CPU: JL_RUNNER_AVAIL_CPU=${JL_RUNNER_AVAIL_CPU-} threads" && \
echo "MEM: JL_RUNNER_AVAIL_MEM=${JL_RUNNER_AVAIL_MEM-} bytes" && \
echo '=== FULL RUNNER SPECS ========' && \
spec nproc && \
spec lscpu && \
spec free -m && \
echo '=== CGROUPS DETAILS ==========' && \
spec cat /sys/fs/cgroup/cpu.max && \
echo "  (ncpu: divide the first number by the second)" && \
spec cat /sys/fs/cgroup/memory.max && \
echo "  (units: bytes)" && \
echo '=============================='

# install upstream packages with pacman
# NOTE: the pacman cache is cleared afterward to minimize image size
RUN pacman -Syu --noconfirm && \
pacman -S --noconfirm --needed \
  python-awkward \
  python-matplotlib \
  python-numpy \
  python-pandas \
  python-seaborn \
  python-uproot \
  python-vector \
  yaml-cpp && \
yes | pacman -Scc

# make a temporary build directory; all build instructions below should
# assume this is the current working directory
WORKDIR /build

# install clara, version main (ref 'main')
ENV CLARA_HOME=/opt/clara-home
ENV PATH=$CLARA_HOME/bin:$PATH
RUN git clone \
  --depth 1 \
  --single-branch \
  --branch main \
  https://code.jlab.org/hallb/clas12/clara-java.git && \
cd clara-java && \
./gradlew deploy

# install clas12-config, version main (ref 'main')
RUN git clone \
  --depth 1 \
  --single-branch \
  --branch main \
  https://github.com/JeffersonLab/clas12-config.git \
  /opt/clas12-config

# install clas12root, version 1.9.0 (ref '1.9.0')
ENV CLAS12ROOT=/opt/clas12root
ENV PATH=$CLAS12ROOT/bin:$PATH
ENV LD_LIBRARY_PATH=$CLAS12ROOT/lib:$LD_LIBRARY_PATH
ENV ROOT_INCLUDE_PATH=$CLAS12ROOT/Clas12Root:$CLAS12ROOT/Clas12Banks:$ROOT_INCLUDE_PATH
RUN git clone \
  --depth 1 \
  --single-branch \
  --branch 1.9.0 \
  https://github.com/JeffersonLab/clas12root.git \
  $CLAS12ROOT && \
cd $CLAS12ROOT && \
./installC12Root

# install coatjava, version 13.5.1 (ref '13.5.1')
ENV COATJAVA=/opt/coatjava
ENV CLAS12DIR=/opt/coatjava
ENV PATH=$COATJAVA/bin:$PATH
RUN git clone \
  --depth 1 \
  --single-branch \
  --branch 13.5.1 \
  https://github.com/JeffersonLab/coatjava.git && \
cd coatjava && \
./build-coatjava.sh --lfs --data -T $NTHREADS && \
cd validation/advanced-tests && \
./run-eb-tests.sh electronproton && \
./run-eb-tests.sh electrongamma && \
./run-eb-tests.sh electronprotonC && \
./run-eb-tests.sh electronneutronC && \
./run-eb-tests.sh electronFTpion && \
cd - && \
mv coatjava /opt/ && \
mv validation/advanced-tests/out_*.hipo /opt/coatjava/etc/data/test

# install iguana, version 1.1.0 (ref 'v1.1.0')
# NOTE: environment variable IGUANA is only needed for clas12root
ENV IGUANA=/usr/local
ENV IGUANA_CONFIG_PATH=$IGUANA/etc/iguana
RUN git clone \
  --depth 1 \
  --single-branch \
  --branch v1.1.0 \
  https://github.com/JeffersonLab/iguana.git && \
meson setup iguana/build iguana \
  --prefix=$IGUANA \
  -D buildtype=release \
  -D bind_fortran=true \
  -D bind_python=true \
  -D install_examples=true \
  -D z_install_envfile=false \
  -D z_require_root=true \
  -D rcdb:home=$RCDB_HOME \
  && \
meson compile -C iguana/build -j $NTHREADS && \
meson install -C iguana/build

# install hipopy, version 2.0.1 (ref 'v2.0.1')
RUN python -m pip install hipopy==v2.0.1

# cleanup
WORKDIR /home/$user_name
RUN rm -rf /build

# remove .git directories, leftover from `git clone` to `/opt/`
RUN find /opt -type d -name .git | xargs -I{} sh -c 'echo "REMOVING {}" && rm -rf {}'

# update plocate DB
RUN updatedb

# switch back to non-root user
USER $user_name

simulation Dockerfile

Dockerfile.simulation
#syntax=docker/dockerfile:1

ARG BASE_NAME=base_root
ARG BASE_TAG=latest

FROM ${BASE_NAME}:${BASE_TAG}

ARG IMAGE_NAME=simulation
ARG NTHREADS=4
ARG NTHREADS_ROOT=3
ARG CMAKE_BUILD_TYPE=Release
ARG MESON_BUILD_TYPE=release

LABEL name=$IMAGE_NAME
LABEL maintainer="Christopher Dilks"
LABEL architecture="amd64"

# switch from non-root user to root
RUN user_name=$(whoami)
USER root

# include patches
COPY patches /build/patches

# include info about this image
COPY info.yaml /usr/local/etc/

# dump runner specs
RUN spec() { echo "::::: $@ :::::" && $@ ; } && \
echo '=== CONTROLLED LIMITS ========' && \
echo "CPU: JL_RUNNER_AVAIL_CPU=${JL_RUNNER_AVAIL_CPU-} threads" && \
echo "MEM: JL_RUNNER_AVAIL_MEM=${JL_RUNNER_AVAIL_MEM-} bytes" && \
echo '=== FULL RUNNER SPECS ========' && \
spec nproc && \
spec lscpu && \
spec free -m && \
echo '=== CGROUPS DETAILS ==========' && \
spec cat /sys/fs/cgroup/cpu.max && \
echo "  (ncpu: divide the first number by the second)" && \
spec cat /sys/fs/cgroup/memory.max && \
echo "  (units: bytes)" && \
echo '=============================='

# install upstream packages with pacman
# NOTE: the pacman cache is cleared afterward to minimize image size
RUN pacman -Syu --noconfirm && \
pacman -S --noconfirm --needed \
  boost \
  onetbb \
  openmotif \
  qt5-base \
  qt5-tools \
  soqt \
  xerces-c && \
yes | pacman -Scc

# make a temporary build directory; all build instructions below should
# assume this is the current working directory
WORKDIR /build

# install clas12-mcgen, version 3.18 (ref '65b3fbfa824cd58f9d04d7b631da99ee250e4779')
# NOTE: the Makefile is not thread safe, see <https://github.com/JeffersonLab/clas12-mcgen/issues/48>
# common env
ENV MCGEN_HOME=/opt/mcgen
ENV PATH=$MCGEN_HOME/bin:$PATH
ENV LD_LIBRARY_PATH=$MCGEN_HOME:$LD_LIBRARY_PATH
# generators
ENV TCSGEN_DIR=$MCGEN_HOME/TCSGen
ENV CLASDIS_PDF=$MCGEN_HOME/clasdis/pdf/
ENV CLASPYTHIA_DECLIST=$MCGEN_HOME/claspyth/
ENV CLASDVCS_PDF=$MCGEN_HOME/dvcsgen
ENV DataKYandOnePion=$MCGEN_HOME/genKYandOnePion/data
ENV DISRAD_PDF=$MCGEN_HOME/inclusive-dis-rad/xgrid
ENV TWOPEG_DATA_DIR=$MCGEN_HOME/twopeg
ENV C12ELSPECTRO=$MCGEN_HOME/clas12-elSpectro
ENV ELSPECTRO=$MCGEN_HOME/clas12-elSpectro/elSpectro
ENV MCEGENpiN_radcorr_path=$MCGEN_HOME/MCEGENpiN_radcorr
ENV CLAS_PARMS=$MCGEN_HOME/onepigen
ENV GENEPI=$MCGEN_HOME/genepi
ENV GENIE=$MCGEN_HOME/genie
ENV GIBUU=$MCGEN_HOME/gibuu
# pythia
ENV PYTHIA8DATA=$MCGEN_HOME/share/Pythia8/xmldoc
# lhapdf
ENV LHAPDF_DATA_PATH=$MCGEN_HOME/share/LHAPDF/
# elspectro headers
ENV ROOT_INCLUDE_PATH=$ELSPECTRO/core:$ROOT_INCLUDE_PATH
ENV ROOT_INCLUDE_PATH=$ELSPECTRO/jpacPhoto/include:$ROOT_INCLUDE_PATH
ENV ROOT_INCLUDE_PATH=$ELSPECTRO/jpacPhoto/include/amplitudes:$ROOT_INCLUDE_PATH
# build and install
RUN git clone \
  --revision 65b3fbfa824cd58f9d04d7b631da99ee250e4779 \
  --recurse-submodules https://github.com/jeffersonlab/clas12-mcgen.git $MCGEN_HOME && \
cd $MCGEN_HOME && \
make && \
make install && \
make slim

# install clhep, version 2.4.7.2 (ref 'CLHEP_2_4_7_2')
ENV CLHEP_VERSION=2.4.7.2
ENV CLHEP_BASE_DIR=/opt/clhep
ENV CLHEP_DIR=$CLHEP_BASE_DIR
ENV LD_LIBRARY_PATH=$CLHEP_BASE_DIR/lib:$LD_LIBRARY_PATH
ENV PKG_CONFIG_PATH=$CLHEP_BASE_DIR/lib/pkgconfig:$PKG_CONFIG_PATH
RUN git clone \
  --depth 1 \
  --single-branch \
  --branch CLHEP_2_4_7_2 \
  https://gitlab.cern.ch/CLHEP/CLHEP.git && \
cmake -B clhep-build -S CLHEP \
  --install-prefix $CLHEP_BASE_DIR \
  -D BUILD_STATIC_LIBS=ON \
  -D CLHEP_BUILD_DOCS=OFF \
  -D CMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE \
  -D CMAKE_POSITION_INDEPENDENT_CODE=ON \
  && \
echo "[+] Building clhep..." && \
cmake --build clhep-build -j $NTHREADS > /dev/null && \
echo "[+] Installing clhep..." && \
cmake --install clhep-build > /dev/null

# install geant4, version 10.7.4 (ref 'v10.7.4')
# NOTE: silenced `stdout` from `cmake`, to avoid surpassing CI runner log limits
ENV G4_VERSION=10.7.4
ENV G4INSTALL=/opt/Geant4/Geant4
ENV G4DATA_DIR=/opt/Geant4/Libraries
ENV G4LIB=$G4INSTALL/lib
ENV PATH=$G4INSTALL/bin:$PATH
ENV LD_LIBRARY_PATH=$G4LIB:$LD_LIBRARY_PATH
ENV PKG_CONFIG_PATH=$G4LIB/pkgconfig:$PKG_CONFIG_PATH
ENV CMAKE_PREFIX_PATH=$G4INSTALL:$CMAKE_PREFIX_PATH
RUN git clone \
  --depth 1 \
  --single-branch \
  --branch v10.7.4 \
  https://github.com/Geant4/geant4.git && \
cd geant4 && \
git apply /build/patches/geant4/v10.7.4.patch.1 && \
git apply /build/patches/geant4/v10.7.4.patch.2 && \
git apply /build/patches/geant4/v10.7.4.patch.3 && \
cmake -B build -S . \
  --install-prefix $G4INSTALL \
  -D BUILD_STATIC_LIBS=ON \
  -D CLHEP_ROOT_DIR=$CLHEP_BASE_DIR \
  -D CMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE \
  -D CMAKE_POLICY_VERSION_MINIMUM=4.0 \
  -D CMAKE_POSITION_INDEPENDENT_CODE=ON \
  -D GEANT4_BUILD_BUILTIN_BACKTRACE=OFF \
  -D GEANT4_BUILD_MULTITHREADED=ON \
  -D GEANT4_INSTALL_DATA=ON \
  -D GEANT4_INSTALL_DATADIR=$G4DATA_DIR \
  -D GEANT4_INSTALL_PACKAGE_CACHE=ON \
  -D GEANT4_USE_GDML=ON \
  -D GEANT4_USE_OPENGL_X11=ON \
  -D GEANT4_USE_QT=ON \
  -D GEANT4_USE_RAYTRACER_X11=ON \
  -D GEANT4_USE_SYSTEM_EXPAT=ON \
  -D GEANT4_USE_SYSTEM_ZLIB=ON \
  && \
echo "[+] Building geant4..." && \
cmake --build build -j $NTHREADS > /dev/null && \
echo "[+] Installing geant4..." && \
cmake --install build > /dev/null

# geant4 data environment variables
# NOTE: copied from $G4INSTALL/bin/geant4.sh
# - depends on the geant4 version
# - prefer hard-coded `ENV` instructions to make sure they are set now,
#   otherwise we'd need to `source geant4.sh` every time they're needed
RUN cat $G4INSTALL/bin/geant4.sh
ENV G4NEUTRONHPDATA=$G4DATA_DIR/G4NDL4.6
ENV G4LEDATA=$G4DATA_DIR/G4EMLOW7.13
ENV G4LEVELGAMMADATA=$G4DATA_DIR/PhotonEvaporation5.7
ENV G4RADIOACTIVEDATA=$G4DATA_DIR/RadioactiveDecay5.6
ENV G4PARTICLEXSDATA=$G4DATA_DIR/G4PARTICLEXS3.1.1
ENV G4PIIDATA=$G4DATA_DIR/G4PII1.3
ENV G4REALSURFACEDATA=$G4DATA_DIR/RealSurface2.2
ENV G4SAIDXSDATA=$G4DATA_DIR/G4SAIDDATA2.0
ENV G4ABLADATA=$G4DATA_DIR/G4ABLA3.1
ENV G4INCLDATA=$G4DATA_DIR/G4INCL1.0
ENV G4ENSDFSTATEDATA=$G4DATA_DIR/G4ENSDFSTATE2.3
# verify the directories exist
RUN for d in \
$G4NEUTRONHPDATA \
$G4LEDATA \
$G4LEVELGAMMADATA \
$G4RADIOACTIVEDATA \
$G4PARTICLEXSDATA \
$G4PIIDATA \
$G4REALSURFACEDATA \
$G4SAIDXSDATA \
$G4ABLADATA \
$G4INCLDATA \
$G4ENSDFSTATEDATA \
; do \
  if [ ! -d "$d" ]; then \
    echo "ERROR: geant4 data env var set to nonexistent dir '$d'"; \
    exit 1; \
  fi; \
done

# install clas12-cmag, version 1.1 (ref 'v1.1')
ENV CMAG_VERSION=1.1
ENV CLAS12_CMAG=/opt/cmag
ENV C12BFIELDS=$CLAS12_CMAG
ENV PATH=$CLAS12_CMAG/bin:$PATH
ENV LD_LIBRARY_PATH=$CLAS12_CMAG/lib:$LD_LIBRARY_PATH
RUN git clone \
  --depth 1 \
  --single-branch \
  --branch v1.1 \
  https://github.com/JeffersonLab/clas12-cmag.git $CLAS12_CMAG && \
cd $CLAS12_CMAG && \
git apply /build/patches/clas12-cmag/v1.1.patch && \
make -C src -j $NTHREADS

# install scons_bm, version 1.14 (ref 'a177f194fe9494316cd26a9eed70f21714314fef')
# NOTE: env var `QTDIR` must point to the system QT installation
# NOTE: env var `XERCESCROOT` must point to the system xerces-c installation
ENV SCONS_BM_VERSION=1.14
ENV SCONS_BM=/opt/scons_bm
ENV SCONSFLAGS=--site-dir=$SCONS_BM
ENV PYTHONPATH=$SCONS_BM:$PYTHONPATH
ENV QTDIR=/usr
ENV XERCESCROOT=/usr
RUN git clone \
  --revision a177f194fe9494316cd26a9eed70f21714314fef \
  https://github.com/maureeungaro/scons_bm.git $SCONS_BM

# install mlibrary, version 1.9 (ref 'cf4b5069b2ab0aebef9fe676a25c73850112e658')
ENV MLIBRARY_VERSION=1.9
ENV MLIBRARY=/opt/mlibrary
ENV LD_LIBRARY_PATH=$MLIBRARY/lib:$LD_LIBRARY_PATH
# build cadmesh first
RUN git clone \
  --revision cf4b5069b2ab0aebef9fe676a25c73850112e658 \
  https://github.com/gemc/mlibrary.git $MLIBRARY && \
cd $MLIBRARY && \
git apply /build/patches/mlibrary/cf4b5069b2ab0aebef9fe676a25c73850112e658.patch && \
cmake -B cadmesh-build -S cadmesh \
  --install-prefix $MLIBRARY \
  -D CMAKE_POLICY_VERSION_MINIMUM=3.5 \
  && \
echo "[+] Building cadmesh..." && \
cmake --build cadmesh-build -j $NTHREADS > /dev/null && \
echo "[+] Installing cadmesh..." && \
cmake --install cadmesh-build > /dev/null && \
cp -r cadmesh-build/lib/* lib/ && \
rm -rf cadmesh-build
# then build mlibrary
RUN cd $MLIBRARY && \
scons -j $NTHREADS SHOWENV=1 && \
rm -f .sconsign.dblite && \
find . -name "*.o" -delete

# install magfield, version ceInstall@3f0f87364e7f1552bef5cc1255afbf6deba34936 (ref '3f0f87364e7f1552bef5cc1255afbf6deba34936')
# NOTE: using `ceInstall` to get all the field maps, rather than the LFS repo,
# which currently only has production maps
ENV FIELD_DIR=/opt/magfield
RUN git clone \
  --revision 3f0f87364e7f1552bef5cc1255afbf6deba34936 \
  https://github.com/JeffersonLab/ceInstall.git && \
ceInstall/install/install_fields

# install gemc, version 5.12 (ref '5.12')
ENV GEMC_VERSION=5.12
ENV GEMC=/opt/gemc
ENV GEMC_DATA_DIR=$GEMC
ENV PATH=$GEMC/bin:$PATH
ENV PATH=$GEMC/api:$PATH
ENV LD_LIBRARY_PATH=$GEMC/lib:$LD_LIBRARY_PATH
ENV PKG_CONFIG_PATH=$GEMC/lib/pkgconfig:$PKG_CONFIG_PATH
ENV PYTHONPATH=$GEMC/api:$PYTHONPATH
RUN git clone \
  --depth 1 \
  --single-branch \
  --branch 5.12 \
  https://github.com/gemc/clas12Tags.git $GEMC && \
cd $GEMC/source && \
scons -j $NTHREADS && \
mkdir -p $GEMC/bin && \
mv gemc $GEMC/bin && \
mv lib $GEMC/ && \
rm -f .sconsign.dblite && \
find ./ -name "*.o" -delete

# cleanup
WORKDIR /home/$user_name
RUN rm -rf /build

# remove .git directories, leftover from `git clone` to `/opt/`
RUN find /opt -type d -name .git | xargs -I{} sh -c 'echo "REMOVING {}" && rm -rf {}'

# update plocate DB
RUN updatedb

# switch back to non-root user
USER $user_name