112a9d9c8Sopenharmony_ci#!/usr/bin/env bash
212a9d9c8Sopenharmony_ci# Bail on first error
312a9d9c8Sopenharmony_ciset -e
412a9d9c8Sopenharmony_ci# Bail if an unset variable is encountered
512a9d9c8Sopenharmony_ciset -u
612a9d9c8Sopenharmony_ci# Enable debugging output
712a9d9c8Sopenharmony_ciset -x
812a9d9c8Sopenharmony_ci# Give a pipeline a non-zero exit code if one of its constituents fails
912a9d9c8Sopenharmony_ciset -o pipefail
1012a9d9c8Sopenharmony_ci
1112a9d9c8Sopenharmony_cifunction llvm_linux_target_triple() {
1212a9d9c8Sopenharmony_ci  echo "x86_64-linux-gnu-ubuntu-16.04"
1312a9d9c8Sopenharmony_ci}
1412a9d9c8Sopenharmony_ci
1512a9d9c8Sopenharmony_cifunction llvm_macos_target_triple() {
1612a9d9c8Sopenharmony_ci  case "$1" in
1712a9d9c8Sopenharmony_ci    [0-8].* | 9.0.0)    echo "x86_64-darwin-apple" ;;
1812a9d9c8Sopenharmony_ci    # Starting with 9.0.1, triple swapped ordering
1912a9d9c8Sopenharmony_ci    *)                  echo "x86_64-apple-darwin" ;;
2012a9d9c8Sopenharmony_ci  esac
2112a9d9c8Sopenharmony_ci}
2212a9d9c8Sopenharmony_ci
2312a9d9c8Sopenharmony_cifunction llvm_version_triple() {
2412a9d9c8Sopenharmony_ci  case "$1" in
2512a9d9c8Sopenharmony_ci    5.0) echo "5.0.1" ;;
2612a9d9c8Sopenharmony_ci    # By default, take the .0 patch release
2712a9d9c8Sopenharmony_ci    *)   echo "$1.0"  ;;
2812a9d9c8Sopenharmony_ci  esac
2912a9d9c8Sopenharmony_ci}
3012a9d9c8Sopenharmony_ci
3112a9d9c8Sopenharmony_cifunction llvm_base_url() {
3212a9d9c8Sopenharmony_ci  local llvm_version_triple=$1
3312a9d9c8Sopenharmony_ci
3412a9d9c8Sopenharmony_ci  case "$llvm_version_triple" in
3512a9d9c8Sopenharmony_ci    [0-8].* | 9.0.0)
3612a9d9c8Sopenharmony_ci      echo "http://releases.llvm.org/$llvm_version_triple"
3712a9d9c8Sopenharmony_ci      ;;
3812a9d9c8Sopenharmony_ci    # Starting with 9.0.1, releases are hosted on github
3912a9d9c8Sopenharmony_ci    *)
4012a9d9c8Sopenharmony_ci      echo "https://github.com/llvm/llvm-project/releases/download/llvmorg-$llvm_version_triple"
4112a9d9c8Sopenharmony_ci      ;;
4212a9d9c8Sopenharmony_ci  esac
4312a9d9c8Sopenharmony_ci}
4412a9d9c8Sopenharmony_ci
4512a9d9c8Sopenharmony_cifunction llvm_download() {
4612a9d9c8Sopenharmony_ci  local base_url=$1
4712a9d9c8Sopenharmony_ci  local arch=$2
4812a9d9c8Sopenharmony_ci
4912a9d9c8Sopenharmony_ci  export LLVM=clang+llvm-${LLVM_VERSION_TRIPLE}-$arch
5012a9d9c8Sopenharmony_ci  export LLVM_DIRECTORY="$HOME/.llvm/${LLVM}"
5112a9d9c8Sopenharmony_ci
5212a9d9c8Sopenharmony_ci  if [ -d "${LLVM_DIRECTORY}" ]; then
5312a9d9c8Sopenharmony_ci    echo "Using cached LLVM download for ${LLVM}..."
5412a9d9c8Sopenharmony_ci  else
5512a9d9c8Sopenharmony_ci    wget --no-verbose $base_url/${LLVM}.tar.xz
5612a9d9c8Sopenharmony_ci    mkdir -p "${LLVM_DIRECTORY}"
5712a9d9c8Sopenharmony_ci    tar xf ${LLVM}.tar.xz -C "${LLVM_DIRECTORY}" --strip-components=1
5812a9d9c8Sopenharmony_ci  fi
5912a9d9c8Sopenharmony_ci
6012a9d9c8Sopenharmony_ci  export LIBCLANG_PATH="${LLVM_DIRECTORY}/lib"
6112a9d9c8Sopenharmony_ci  export LLVM_CONFIG_PATH="${LLVM_DIRECTORY}/bin/llvm-config"
6212a9d9c8Sopenharmony_ci}
6312a9d9c8Sopenharmony_ci
6412a9d9c8Sopenharmony_ci# Download and set up a sane LLVM version
6512a9d9c8Sopenharmony_ciset_llvm_env() {
6612a9d9c8Sopenharmony_ci  export LLVM_VERSION_TRIPLE=`llvm_version_triple ${LLVM_VERSION}`
6712a9d9c8Sopenharmony_ci  local base_url=`llvm_base_url ${LLVM_VERSION_TRIPLE}`
6812a9d9c8Sopenharmony_ci
6912a9d9c8Sopenharmony_ci  if [ "$GITHUB_ACTIONS_OS" == "ubuntu-latest" ]; then
7012a9d9c8Sopenharmony_ci    llvm_download $base_url `llvm_linux_target_triple ${LLVM_VERSION_TRIPLE}`
7112a9d9c8Sopenharmony_ci    export LD_LIBRARY_PATH="${LLVM_DIRECTORY}/lib":${LD_LIBRARY_PATH:-}
7212a9d9c8Sopenharmony_ci  else
7312a9d9c8Sopenharmony_ci    llvm_download $base_url `llvm_macos_target_triple ${LLVM_VERSION_TRIPLE}`
7412a9d9c8Sopenharmony_ci    export DYLD_LIBRARY_PATH="${LLVM_DIRECTORY}/lib":${DYLD_LIBRARY_PATH:-}
7512a9d9c8Sopenharmony_ci  fi
7612a9d9c8Sopenharmony_ci}
7712a9d9c8Sopenharmony_ci
7812a9d9c8Sopenharmony_ci# Need rustfmt to compare the test expectations.
7912a9d9c8Sopenharmony_ciset_rustfmt_env() {
8012a9d9c8Sopenharmony_ci  local toolchain="nightly-$(curl https://rust-lang.github.io/rustup-components-history/$(rustup target list --installed | tail -1)/rustfmt)"
8112a9d9c8Sopenharmony_ci  rustup update "$toolchain"
8212a9d9c8Sopenharmony_ci  rustup component add rustfmt --toolchain "$toolchain"
8312a9d9c8Sopenharmony_ci  export RUSTFMT="$(rustup which --toolchain "$toolchain" rustfmt)"
8412a9d9c8Sopenharmony_ci}
8512a9d9c8Sopenharmony_ci
8612a9d9c8Sopenharmony_ciassert_no_diff() {
8712a9d9c8Sopenharmony_ci  git add -u
8812a9d9c8Sopenharmony_ci  git diff @
8912a9d9c8Sopenharmony_ci  git diff-index --quiet HEAD
9012a9d9c8Sopenharmony_ci}
9112a9d9c8Sopenharmony_ci
9212a9d9c8Sopenharmony_ciset_llvm_env
9312a9d9c8Sopenharmony_ciset_rustfmt_env
9412a9d9c8Sopenharmony_ci
9512a9d9c8Sopenharmony_ciget_cargo_args() {
9612a9d9c8Sopenharmony_ci  local args=""
9712a9d9c8Sopenharmony_ci  if [ ! -z "$RUST_TARGET" ]; then
9812a9d9c8Sopenharmony_ci    args+=" --target $RUST_TARGET"
9912a9d9c8Sopenharmony_ci  fi
10012a9d9c8Sopenharmony_ci  if [ "$BINDGEN_RELEASE_BUILD" == "1" ]; then
10112a9d9c8Sopenharmony_ci    args+=" --release"
10212a9d9c8Sopenharmony_ci  fi
10312a9d9c8Sopenharmony_ci  if [ "$BINDGEN_NO_DEFAULT_FEATURES" == "1" ]; then
10412a9d9c8Sopenharmony_ci    args+=" --no-default-features"
10512a9d9c8Sopenharmony_ci  fi
10612a9d9c8Sopenharmony_ci  local features=""
10712a9d9c8Sopenharmony_ci  if [ "$BINDGEN_FEATURE_RUNTIME" == "1"  ]; then
10812a9d9c8Sopenharmony_ci    features+="runtime"
10912a9d9c8Sopenharmony_ci  fi
11012a9d9c8Sopenharmony_ci  if [ "$BINDGEN_FEATURE_EXTRA_ASSERTS" == "1"  ]; then
11112a9d9c8Sopenharmony_ci    features+=" testing_only_extra_assertions"
11212a9d9c8Sopenharmony_ci  fi
11312a9d9c8Sopenharmony_ci  if [ "$BINDGEN_FEATURE_TESTING_ONLY_DOCS" == "1"  ]; then
11412a9d9c8Sopenharmony_ci    features+=" testing_only_docs"
11512a9d9c8Sopenharmony_ci  fi
11612a9d9c8Sopenharmony_ci  if [ ! -z "$features" ]; then
11712a9d9c8Sopenharmony_ci    args+=" --features $(echo $features | tr ' ' ',')"
11812a9d9c8Sopenharmony_ci  fi
11912a9d9c8Sopenharmony_ci  echo $args
12012a9d9c8Sopenharmony_ci}
12112a9d9c8Sopenharmony_ci
12212a9d9c8Sopenharmony_ciif [ ! -z "$RUST_CROSS_COMPILER" ]; then
12312a9d9c8Sopenharmony_ci  export RUSTFLAGS="-C linker=${RUST_CROSS_COMPILER}-gcc"
12412a9d9c8Sopenharmony_cifi
12512a9d9c8Sopenharmony_ci
12612a9d9c8Sopenharmony_ciCARGO_ARGS=`get_cargo_args`
12712a9d9c8Sopenharmony_ci
12812a9d9c8Sopenharmony_ci# Ensure we build without warnings
12912a9d9c8Sopenharmony_ciRUSTFLAGS="-Dwarnings" cargo check $CARGO_ARGS
13012a9d9c8Sopenharmony_ci
13112a9d9c8Sopenharmony_ciif [ "$BINDGEN_MAIN_TESTS" == "1" ]; then
13212a9d9c8Sopenharmony_ci  # Run the tests
13312a9d9c8Sopenharmony_ci  (cd bindgen-tests && cargo test $CARGO_ARGS)
13412a9d9c8Sopenharmony_cifi
13512a9d9c8Sopenharmony_ci
13612a9d9c8Sopenharmony_ciassert_no_diff
13712a9d9c8Sopenharmony_ci
13812a9d9c8Sopenharmony_ci# Run the integration tests
13912a9d9c8Sopenharmony_ci(cd bindgen-integration && cargo test $CARGO_ARGS)
140