Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-09-18 08:11:20

0001 #!/bin/bash
0002 set -u
0003 set -e
0004 set -o pipefail
0005 
0006 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
0007 
0008 export SPACK_COLOR=always
0009 
0010 function start_section() {
0011     local section_name="$1"
0012     if [ -n "${GITHUB_ACTIONS:-}" ]; then
0013         echo "::group::${section_name}"
0014     else
0015         echo "${section_name}"
0016     fi
0017 }
0018 
0019 function end_section() {
0020     if [ -n "${GITHUB_ACTIONS:-}" ]; then
0021         echo "::endgroup::"
0022     fi
0023 }
0024 
0025 # Parse command line arguments
0026 while getopts "c:t:d:e:h" opt; do
0027   case ${opt} in
0028     c )
0029       compiler=$OPTARG
0030       ;;
0031     t )
0032       tag=$OPTARG
0033       ;;
0034     d )
0035       destination=$OPTARG
0036       ;;
0037     e )
0038       env_file=$OPTARG
0039       ;;
0040     h )
0041       echo "Usage: $0 [-c compiler] [-t tag] [-d destination]"
0042       echo "Options:"
0043       echo "  -c <compiler>    Specify compiler (defaults to CXX env var)"
0044       echo "  -t <tag>         Specify dependency tag (defaults to DEPENDENCY_TAG env var)"
0045       echo "  -d <destination> Specify install destination (defaults based on CI environment)"
0046       echo "  -e <env_file>    Specify environment file to output environments to"
0047       echo "  -h              Show this help message"
0048       exit 0
0049       ;;
0050     \? )
0051       echo "Invalid option: -$OPTARG" 1>&2
0052       exit 1
0053       ;;
0054     : )
0055       echo "Option -$OPTARG requires an argument" 1>&2
0056       exit 1
0057       ;;
0058   esac
0059 done
0060 
0061 # Set defaults if not specified
0062 if [ -z "${compiler:-}" ]; then
0063   compiler="${CXX:-default}"
0064 fi
0065 
0066 if [ -z "${tag:-}" ]; then
0067   tag="${DEPENDENCY_TAG:-}"
0068   if [ -z "${tag:-}" ]; then
0069     echo "No tag specified via -t or DEPENDENCY_TAG environment variable"
0070     exit 1
0071   fi
0072 fi
0073 
0074 if [ -z "${destination:-}" ]; then
0075   if [ -n "${GITHUB_ACTIONS:-}" ]; then
0076     destination="${GITHUB_WORKSPACE}/dependencies"
0077   elif [ -n "${GITLAB_CI:-}" ]; then
0078     destination="${CI_PROJECT_DIR}/dependencies"
0079   else
0080     echo "No destination specified via -d and not running in CI"
0081     exit 1
0082   fi
0083 fi
0084 
0085 if [ -z "${env_file:-}" ]; then
0086   if [ -n "${GITHUB_ACTIONS:-}" ]; then
0087     env_file="${GITHUB_ENV}"
0088   else
0089     echo "No environment file specified via -e and not running in GitHub Actions"
0090     exit 1
0091   fi
0092 fi
0093 
0094 export env_file
0095 
0096 function set_env {
0097   key="$1"
0098   value="$2"
0099 
0100   echo "=> ${key}=${value}"
0101 
0102   if [ -n "${GITHUB_ACTIONS:-}" ]; then
0103     echo "${key}=${value}" >> "$env_file"
0104   else
0105     echo "export ${key}=${value}" >> "$env_file"
0106   fi
0107 }
0108 
0109 
0110 
0111 
0112 echo "Install tag: $tag"
0113 echo "Install destination: $destination"
0114 
0115 mkdir -p ${destination}
0116 
0117 if [ -n "${GITLAB_CI:-}" ]; then
0118     _spack_folder=${CI_PROJECT_DIR}/spack
0119 else
0120     _spack_folder=${PWD}/spack
0121 fi
0122 
0123 start_section "Install spack if not already installed"
0124 if ! command -v spack &> /dev/null; then
0125   "${SCRIPT_DIR}/setup_spack.sh" "${_spack_folder}"
0126   source "${_spack_folder}/share/spack/setup-env.sh"
0127 fi
0128 
0129 _spack_repo_version=${SPACK_REPO_VERSION:-develop}
0130 _spack_repo_directory="$(realpath "$(spack location --repo builtin)/../../../")"
0131 
0132 echo "Ensure repo is synced with version ${_spack_repo_version}"
0133 
0134 git config --global --add safe.directory "${_spack_repo_directory}"
0135 spack repo update builtin --tag "${_spack_repo_version}"
0136 
0137 end_section
0138 
0139 if [ -n "${GITLAB_CI:-}" ]; then
0140   # Use the project spack config for GitLab CI so we can cache it
0141   mkdir -p ${CI_PROJECT_DIR}/.spack
0142   ln -s ${CI_PROJECT_DIR}/.spack ${HOME}/.spack
0143 fi
0144 
0145 
0146 
0147 if [ -n "${CI:-}" ]; then
0148   start_section "Add buildcache mirror"
0149   mirror_name="acts-spack-buildcache"
0150   mirror_url="oci://ghcr.io/acts-project/spack-buildcache"
0151   if [ -n "${GITLAB_CI:-}" ]; then
0152   # Use CERN mirror for non-Github Actions
0153     mirror_url="oci://registry.cern.ch/ghcr.io/acts-project/spack-buildcache"
0154   fi
0155 
0156   # Check if this buildcache is already configured
0157   if ! spack mirror list | grep -q ${mirror_name}; then
0158     echo "Adding buildcache ${mirror_name}"
0159     spack mirror add ${mirror_name} ${mirror_url} --unsigned
0160   fi
0161   end_section
0162 
0163   start_section "Locate OpenGL"
0164   "${SCRIPT_DIR}/opengl.sh"
0165   end_section
0166 fi
0167 
0168 start_section "Get spack lock file"
0169 arch=$(spack arch --family)
0170 
0171 env_dir="${destination}/env"
0172 view_dir="${destination}/view"
0173 mkdir -p ${env_dir}
0174 
0175 lock_file_path="${destination}/spack.lock"
0176 cmd=(
0177     "${SCRIPT_DIR}/select_lockfile.py"
0178     "--tag" "${tag}"
0179     "--arch" "${arch}"
0180     "--output" "${lock_file_path}"
0181 )
0182 
0183 if [ "${compiler}" != "default" ]; then
0184     cmd+=("--compiler-binary" "${compiler}")
0185 fi
0186 
0187 "${cmd[@]}"
0188 
0189 end_section
0190 
0191 
0192 
0193 start_section "Create spack environment"
0194 time spack env create -d "${env_dir}" "${lock_file_path}" --with-view "$view_dir"
0195 time spack -e "${env_dir}" spec -l
0196 time spack -e "${env_dir}" find
0197 end_section
0198 
0199 start_section "Install spack packages"
0200 time spack -e "${env_dir}" install --fail-fast --use-buildcache only --concurrent-packages 10
0201 end_section
0202 
0203 start_section "Patch up Geant4 data directory"
0204 # ${SCRIPT_DIR}/with_spack_env.sh ${env_dir} geant4-config --install-datasets
0205 geant4_dir=$(spack -e "${env_dir}" location -i geant4)
0206 # Prepare the folder for G4 data, and symlink it to where G4 will look for it
0207 mkdir -p "${geant4_dir}/share/Geant4"
0208 ln -s "${geant4_dir}/share/Geant4/data" "${view_dir}/share/Geant4/data"
0209 end_section
0210 
0211 
0212 start_section "Prepare python environment"
0213 ls -al
0214 venv_dir="${view_dir}/venv"
0215 "${view_dir}"/bin/python3 -m venv \
0216   --system-site-packages \
0217   "$venv_dir"
0218 
0219 "${venv_dir}/bin/python3" -m pip install pyyaml jinja2
0220 
0221 end_section
0222 
0223 start_section "Set environment variables"
0224 if [ -n "${GITHUB_ACTIONS:-}" ]; then
0225   echo "${view_dir}/bin" >> "$GITHUB_PATH"
0226   echo "${venv_dir}/bin" >> "$GITHUB_PATH"
0227 fi
0228 set_env PATH "${venv_dir}/bin:${view_dir}/bin/:${PATH}"
0229 set_env ROOT_SETUP_SCRIPT "${view_dir}/bin/thisroot.sh"
0230 set_env CMAKE_PREFIX_PATH "${venv_dir}:${view_dir}"
0231 set_env LD_LIBRARY_PATH "${view_dir}/lib"
0232 set_env ROOT_INCLUDE_PATH "${view_dir}/include"
0233 end_section