|
| 1 | +#!/usr/bin/env bash |
| 2 | +set -euo pipefail |
| 3 | + |
| 4 | +echo -e "=== 🔧 \033[1mRenku R buildpack\033[0m ===" |
| 5 | + |
| 6 | +LAYERS_DIR="${1}" |
| 7 | + |
| 8 | +log() { echo "-----> $*"; } |
| 9 | +info() { echo " $*"; } |
| 10 | + |
| 11 | +read_meta() { |
| 12 | + grep -Po "(?<=^${2} = \")([^\"]+)" "${1}" 2>/dev/null || true |
| 13 | +} |
| 14 | + |
| 15 | +R_VERSION="$(jq -r ".R.Version" "renv.lock" || true)" |
| 16 | + |
| 17 | +# Conda package cache layer |
| 18 | + |
| 19 | +PKG_CACHE_LAYER="${LAYERS_DIR}/r-conda-pkg-cache" |
| 20 | +mkdir -p "${PKG_CACHE_LAYER}" |
| 21 | + |
| 22 | +cat >"${PKG_CACHE_LAYER}.toml" <<TOML |
| 23 | +[types] |
| 24 | +build = false |
| 25 | +launch = false |
| 26 | +cache = true |
| 27 | +TOML |
| 28 | + |
| 29 | +# R layer |
| 30 | + |
| 31 | +R_LAYER="${LAYERS_DIR}/r" |
| 32 | +mkdir -p "${R_LAYER}" |
| 33 | + |
| 34 | +CACHED_R_VERSION="$(read_meta "${R_LAYER}.toml" "r_version")" |
| 35 | + |
| 36 | +cat >"${R_LAYER}.toml" <<TOML |
| 37 | +[types] |
| 38 | +build = true |
| 39 | +launch = true |
| 40 | +cache = true |
| 41 | +
|
| 42 | +[metadata] |
| 43 | +r_version = "${R_VERSION}" |
| 44 | +TOML |
| 45 | + |
| 46 | +if [[ "${CACHED_R_VERSION}" == "${R_VERSION}" && -x "${R_LAYER}/bin/R" ]]; then |
| 47 | + log "Reusing cached R ${R_VERSION}" |
| 48 | +else |
| 49 | + log "Installing R ${R_VERSION} via miniconda (using conda-forge channel only)..." |
| 50 | + |
| 51 | + R_PACKAGE_NAME="r-base" |
| 52 | + if [[ -n "${R_VERSION}" ]]; then |
| 53 | + R_PACKAGE_NAME="r-base=${R_VERSION}" |
| 54 | + fi |
| 55 | + CONDA_PKGS_DIRS="$PKG_CACHE_LAYER" conda create \ |
| 56 | + --prefix "${R_LAYER}" \ |
| 57 | + --channel conda-forge \ |
| 58 | + --channel nodefaults \ |
| 59 | + --yes \ |
| 60 | + "${R_PACKAGE_NAME}" \ |
| 61 | + r-renv \ |
| 62 | + openjdk \ |
| 63 | + cairo \ |
| 64 | + zlib \ |
| 65 | + bzip2 \ |
| 66 | + xz \ |
| 67 | + hdf5 \ |
| 68 | + libxml2 \ |
| 69 | + libpng \ |
| 70 | + libjpeg-turbo \ |
| 71 | + libtiff \ |
| 72 | + 2>&1 | sed 's/^/ /' |
| 73 | + |
| 74 | + info "R ${R_VERSION} installed to ${R_LAYER}" |
| 75 | +fi |
| 76 | + |
| 77 | +# Environment — launch |
| 78 | + |
| 79 | +ENV_LAUNCH="${R_LAYER}/env.launch" |
| 80 | +mkdir -p "${ENV_LAUNCH}" |
| 81 | + |
| 82 | +printf '%s' "${R_LAYER}/bin" >"${ENV_LAUNCH}/PATH.prepend" |
| 83 | +printf ':' >"${ENV_LAUNCH}/PATH.delim" |
| 84 | +printf '%s' "${R_LAYER}/lib" >"${ENV_LAUNCH}/LD_LIBRARY_PATH.prepend" |
| 85 | +printf ':' >"${ENV_LAUNCH}/LD_LIBRARY_PATH.delim" |
| 86 | +printf '%s' "${R_LAYER}" >"${ENV_LAUNCH}/R_HOME.override" |
| 87 | +printf '%s' "${R_LAYER}/lib/R/library" >"${ENV_LAUNCH}/R_LIBS.override" |
| 88 | + |
| 89 | +# Environment — build |
| 90 | + |
| 91 | +ENV_BUILD="${R_LAYER}/env.build" |
| 92 | +mkdir -p "${ENV_BUILD}" |
| 93 | + |
| 94 | +printf '%s' "${R_LAYER}/bin" >"${ENV_BUILD}/PATH.prepend" |
| 95 | +printf ':' >"${ENV_BUILD}/PATH.delim" |
| 96 | +printf '%s' "${R_LAYER}/lib" >"${ENV_BUILD}/LD_LIBRARY_PATH.prepend" |
| 97 | +printf ':' >"${ENV_BUILD}/LD_LIBRARY_PATH.delim" |
| 98 | +printf '%s' "${R_LAYER}" >"${ENV_BUILD}/R_HOME.override" |
| 99 | +printf '%s' "${R_LAYER}/lib/R/library" >"${ENV_BUILD}/R_LIBS.override" |
0 commit comments