• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env bash
2# Bail on first error
3set -e
4# Bail if an unset variable is encountered
5set -u
6# Enable debugging output
7set -x
8# Give a pipeline a non-zero exit code if one of its constituents fails
9set -o pipefail
10
11function llvm_linux_target_triple() {
12  echo "x86_64-linux-gnu-ubuntu-16.04"
13}
14
15function llvm_macos_target_triple() {
16  case "$1" in
17    [0-8].* | 9.0.0)    echo "x86_64-darwin-apple" ;;
18    # Starting with 9.0.1, triple swapped ordering
19    *)                  echo "x86_64-apple-darwin" ;;
20  esac
21}
22
23function llvm_version_triple() {
24  case "$1" in
25    5.0) echo "5.0.1" ;;
26    # By default, take the .0 patch release
27    *)   echo "$1.0"  ;;
28  esac
29}
30
31function llvm_base_url() {
32  local llvm_version_triple=$1
33
34  case "$llvm_version_triple" in
35    [0-8].* | 9.0.0)
36      echo "http://releases.llvm.org/$llvm_version_triple"
37      ;;
38    # Starting with 9.0.1, releases are hosted on github
39    *)
40      echo "https://github.com/llvm/llvm-project/releases/download/llvmorg-$llvm_version_triple"
41      ;;
42  esac
43}
44
45function llvm_download() {
46  local base_url=$1
47  local arch=$2
48
49  export LLVM=clang+llvm-${LLVM_VERSION_TRIPLE}-$arch
50  export LLVM_DIRECTORY="$HOME/.llvm/${LLVM}"
51
52  if [ -d "${LLVM_DIRECTORY}" ]; then
53    echo "Using cached LLVM download for ${LLVM}..."
54  else
55    wget --no-verbose $base_url/${LLVM}.tar.xz
56    mkdir -p "${LLVM_DIRECTORY}"
57    tar xf ${LLVM}.tar.xz -C "${LLVM_DIRECTORY}" --strip-components=1
58  fi
59
60  export LIBCLANG_PATH="${LLVM_DIRECTORY}/lib"
61  export LLVM_CONFIG_PATH="${LLVM_DIRECTORY}/bin/llvm-config"
62}
63
64# Download and set up a sane LLVM version
65set_llvm_env() {
66  export LLVM_VERSION_TRIPLE=`llvm_version_triple ${LLVM_VERSION}`
67  local base_url=`llvm_base_url ${LLVM_VERSION_TRIPLE}`
68
69  if [ "$GITHUB_ACTIONS_OS" == "ubuntu-latest" ]; then
70    llvm_download $base_url `llvm_linux_target_triple ${LLVM_VERSION_TRIPLE}`
71    export LD_LIBRARY_PATH="${LLVM_DIRECTORY}/lib":${LD_LIBRARY_PATH:-}
72  else
73    llvm_download $base_url `llvm_macos_target_triple ${LLVM_VERSION_TRIPLE}`
74    export DYLD_LIBRARY_PATH="${LLVM_DIRECTORY}/lib":${DYLD_LIBRARY_PATH:-}
75  fi
76}
77
78# Need rustfmt to compare the test expectations.
79set_rustfmt_env() {
80  local toolchain="nightly-$(curl https://rust-lang.github.io/rustup-components-history/$(rustup target list --installed | tail -1)/rustfmt)"
81  rustup update "$toolchain"
82  rustup component add rustfmt --toolchain "$toolchain"
83  export RUSTFMT="$(rustup which --toolchain "$toolchain" rustfmt)"
84}
85
86assert_no_diff() {
87  git add -u
88  git diff @
89  git diff-index --quiet HEAD
90}
91
92set_llvm_env
93set_rustfmt_env
94
95get_cargo_args() {
96  local args=""
97  if [ ! -z "$RUST_TARGET" ]; then
98    args+=" --target $RUST_TARGET"
99  fi
100  if [ "$BINDGEN_RELEASE_BUILD" == "1" ]; then
101    args+=" --release"
102  fi
103  if [ "$BINDGEN_NO_DEFAULT_FEATURES" == "1" ]; then
104    args+=" --no-default-features"
105  fi
106  local features=""
107  if [ "$BINDGEN_FEATURE_RUNTIME" == "1"  ]; then
108    features+="runtime"
109  fi
110  if [ "$BINDGEN_FEATURE_EXTRA_ASSERTS" == "1"  ]; then
111    features+=" testing_only_extra_assertions"
112  fi
113  if [ "$BINDGEN_FEATURE_TESTING_ONLY_DOCS" == "1"  ]; then
114    features+=" testing_only_docs"
115  fi
116  if [ ! -z "$features" ]; then
117    args+=" --features $(echo $features | tr ' ' ',')"
118  fi
119  echo $args
120}
121
122if [ ! -z "$RUST_CROSS_COMPILER" ]; then
123  export RUSTFLAGS="-C linker=${RUST_CROSS_COMPILER}-gcc"
124fi
125
126CARGO_ARGS=`get_cargo_args`
127
128# Ensure we build without warnings
129RUSTFLAGS="-Dwarnings" cargo check $CARGO_ARGS
130
131if [ "$BINDGEN_MAIN_TESTS" == "1" ]; then
132  # Run the tests
133  (cd bindgen-tests && cargo test $CARGO_ARGS)
134fi
135
136assert_no_diff
137
138# Run the integration tests
139(cd bindgen-integration && cargo test $CARGO_ARGS)
140