12add0d91Sopenharmony_ci#!/usr/bin/env sh
22add0d91Sopenharmony_ci
32add0d91Sopenharmony_ci# Disable SC2086 as it confuses the docker command.
42add0d91Sopenharmony_ci# shellcheck disable=SC2086
52add0d91Sopenharmony_ci
62add0d91Sopenharmony_ci# Small script to run tests for a target (or all targets) inside all the
72add0d91Sopenharmony_ci# respective docker images.
82add0d91Sopenharmony_ci
92add0d91Sopenharmony_ciset -ex
102add0d91Sopenharmony_ci
112add0d91Sopenharmony_ci# Default to assuming the CARGO_HOME is one directory up (to account for a `bin`
122add0d91Sopenharmony_ci# subdir) from where the `cargo` binary in `$PATH` lives.
132add0d91Sopenharmony_ciDEFAULT_CARGO_HOME="$(dirname "$(dirname "$(command -v cargo)")")"
142add0d91Sopenharmony_ci# If the CARGO_HOME env var is already set, use that. If it isn't set use the
152add0d91Sopenharmony_ci# default.
162add0d91Sopenharmony_ciCARGO_HOME="${CARGO_HOME:-$DEFAULT_CARGO_HOME}"
172add0d91Sopenharmony_ci
182add0d91Sopenharmony_ciecho "${HOME}"
192add0d91Sopenharmony_cipwd
202add0d91Sopenharmony_ci
212add0d91Sopenharmony_ci# Avoid "no space left on device" failure.
222add0d91Sopenharmony_ciif [ "${1}" = "aarch64-linux-android" ] ; then
232add0d91Sopenharmony_ci  docker system prune -af
242add0d91Sopenharmony_ci  docker system df
252add0d91Sopenharmony_cifi
262add0d91Sopenharmony_ci
272add0d91Sopenharmony_cirun() {
282add0d91Sopenharmony_ci    echo "Building docker container for target ${1}"
292add0d91Sopenharmony_ci
302add0d91Sopenharmony_ci    # use -f so we can use ci/ as build context
312add0d91Sopenharmony_ci    docker build -t libc -f "ci/docker/${1}/Dockerfile" ci/
322add0d91Sopenharmony_ci    mkdir -p target
332add0d91Sopenharmony_ci    if [ -w /dev/kvm ]; then
342add0d91Sopenharmony_ci        kvm="--volume /dev/kvm:/dev/kvm"
352add0d91Sopenharmony_ci    else
362add0d91Sopenharmony_ci        kvm=""
372add0d91Sopenharmony_ci    fi
382add0d91Sopenharmony_ci
392add0d91Sopenharmony_ci    docker run \
402add0d91Sopenharmony_ci      --rm \
412add0d91Sopenharmony_ci      --user "$(id -u)":"$(id -g)" \
422add0d91Sopenharmony_ci      --env LIBC_CI \
432add0d91Sopenharmony_ci      --env LIBC_CI_ZBUILD_STD \
442add0d91Sopenharmony_ci      --env CARGO_HOME=/cargo \
452add0d91Sopenharmony_ci      --env CARGO_TARGET_DIR=/checkout/target \
462add0d91Sopenharmony_ci      --volume "$CARGO_HOME":/cargo \
472add0d91Sopenharmony_ci      --volume "$(rustc --print sysroot)":/rust:ro \
482add0d91Sopenharmony_ci      --volume "$(pwd)":/checkout:ro \
492add0d91Sopenharmony_ci      --volume "$(pwd)"/target:/checkout/target \
502add0d91Sopenharmony_ci      $kvm \
512add0d91Sopenharmony_ci      --init \
522add0d91Sopenharmony_ci      --workdir /checkout \
532add0d91Sopenharmony_ci      libc \
542add0d91Sopenharmony_ci      sh -c "HOME=/tmp PATH=\$PATH:/rust/bin exec ci/run.sh ${1}"
552add0d91Sopenharmony_ci}
562add0d91Sopenharmony_ci
572add0d91Sopenharmony_cibuild_switch() {
582add0d91Sopenharmony_ci    echo "Building docker container for target switch"
592add0d91Sopenharmony_ci
602add0d91Sopenharmony_ci    # use -f so we can use ci/ as build context
612add0d91Sopenharmony_ci    docker build -t libc -f "ci/docker/switch/Dockerfile" ci/
622add0d91Sopenharmony_ci    mkdir -p target
632add0d91Sopenharmony_ci    if [ -w /dev/kvm ]; then
642add0d91Sopenharmony_ci        kvm="--volume /dev/kvm:/dev/kvm"
652add0d91Sopenharmony_ci    else
662add0d91Sopenharmony_ci        kvm=""
672add0d91Sopenharmony_ci    fi
682add0d91Sopenharmony_ci
692add0d91Sopenharmony_ci    cp "$(command -v rustup)" "$(rustc --print sysroot)/bin"
702add0d91Sopenharmony_ci
712add0d91Sopenharmony_ci    docker run \
722add0d91Sopenharmony_ci      --rm \
732add0d91Sopenharmony_ci      --user "$(id -u)":"$(id -g)" \
742add0d91Sopenharmony_ci      --env LIBC_CI \
752add0d91Sopenharmony_ci      --env CARGO_HOME=/cargo \
762add0d91Sopenharmony_ci      --env CARGO_TARGET_DIR=/checkout/target \
772add0d91Sopenharmony_ci      --volume "$CARGO_HOME":/cargo \
782add0d91Sopenharmony_ci      --volume "$(rustc --print sysroot)":/rust:ro \
792add0d91Sopenharmony_ci      --volume "$(pwd)":/checkout:ro \
802add0d91Sopenharmony_ci      --volume "$(pwd)"/target:/checkout/target \
812add0d91Sopenharmony_ci      --volume ~/.rustup:/.rustup:Z \
822add0d91Sopenharmony_ci      $kvm \
832add0d91Sopenharmony_ci      --init \
842add0d91Sopenharmony_ci      --workdir /checkout \
852add0d91Sopenharmony_ci      libc \
862add0d91Sopenharmony_ci      sh -c "HOME=/tmp RUSTUP_HOME=/tmp PATH=\$PATH:/rust/bin rustup default nightly \
872add0d91Sopenharmony_ci        && rustup component add rust-src --target ci/switch.json \
882add0d91Sopenharmony_ci        && cargo build -Z build-std=core,alloc --target ci/switch.json"
892add0d91Sopenharmony_ci}
902add0d91Sopenharmony_ci
912add0d91Sopenharmony_ciif [ -z "${1}" ]; then
922add0d91Sopenharmony_ci  for d in ci/docker/*; do
932add0d91Sopenharmony_ci    run "${d}"
942add0d91Sopenharmony_ci  done
952add0d91Sopenharmony_cielse
962add0d91Sopenharmony_ci  if [ "${1}" != "switch" ]; then
972add0d91Sopenharmony_ci    run "${1}"
982add0d91Sopenharmony_ci  else
992add0d91Sopenharmony_ci    build_switch
1002add0d91Sopenharmony_ci  fi
1012add0d91Sopenharmony_cifi
102