| #!/bin/bash |
| # |
| # Copyright 2021 Google LLC |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # https://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| # Install the prebuilt RISC-V GCC/LLVM/Kelvin toolchain. |
| |
| function clean { |
| if [[ ! -f "${PREINSTALL_DIR}/${TOOLCHAIN_TARBALL}" ]]; then |
| rm "${DOWNLOAD_DIR}/${TOOLCHAIN_TARBALL}" \ |
| "${DOWNLOAD_DIR}/${TOOLCHAIN_TARBALL}.sha256sum" |
| fi |
| } |
| |
| function die { |
| echo "$@" >/dev/stderr |
| exit 1 |
| } |
| |
| function try { |
| $@ || die "Failed to execute '$@'" |
| } |
| |
| if [[ -z "${ROOTDIR}" ]]; then |
| echo "Source build/setup.sh first" |
| exit 1 |
| fi |
| if [[ -z "$1" ]]; then |
| cat << EOM |
| Usage: install-toolchain.sh target |
| Where target is gcc, llvm, or kelvin |
| EOM |
| exit 1 |
| fi |
| |
| TARGET=${1:-gcc} |
| TOOLCHAIN_TARBALL="" |
| case "${TARGET}" in |
| gcc) |
| TOOLCHAIN_TARBALL="toolchain.tar.gz" |
| ;; |
| |
| llvm) |
| TOOLCHAIN_TARBALL="toolchain_iree_rv32.tar.gz" |
| ;; |
| kelvin) |
| TOOLCHAIN_TARBALL="toolchain_kelvin.tar.gz" |
| ;; |
| |
| *) |
| echo "unsupported target: ${TARGET}" |
| exit 1 |
| ;; |
| esac |
| |
| trap clean EXIT |
| |
| # Used by the CI shodan docker image |
| PREINSTALL_DIR=/usr/src |
| |
| if [[ -f "${PREINSTALL_DIR}/${TOOLCHAIN_TARBALL}" ]]; then |
| echo "${TOOLCHAIN_TARBALL} stored in the machine at ${PREINSTALL_DIR}" |
| DOWNLOAD_DIR=/usr/src |
| else |
| echo "Download ${TOOLCHAIN_TARBALL} from GCS..." |
| DOWNLOAD_URL="https://storage.googleapis.com/shodan-public-artifacts/${TOOLCHAIN_TARBALL}" |
| DOWNLOAD_DIR="${OUT}/tmp" |
| mkdir -p "${DOWNLOAD_DIR}" |
| |
| wget --progress=dot:giga -P "${DOWNLOAD_DIR}" "${DOWNLOAD_URL}" |
| wget -P "${DOWNLOAD_DIR}" "${DOWNLOAD_URL}.sha256sum" |
| pushd "${DOWNLOAD_DIR}" > /dev/null |
| # tarball may be timestamped during build. Update the filename in sha256sum |
| # file to check. |
| sed -i -e "s,_[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}.tar.gz,.tar.gz," "${TOOLCHAIN_TARBALL}.sha256sum" |
| try sha256sum -c "${TOOLCHAIN_TARBALL}.sha256sum" |
| popd > /dev/null |
| fi |
| |
| try tar -C "${CACHE}" -xf "${DOWNLOAD_DIR}/${TOOLCHAIN_TARBALL}" |
| |
| # Prepare a newlib-nano directory for the default link of -lc, -lgloss, etc. |
| # TODO(hcindyl): Remove the duped symlink creation once we switched to a toolchain from CI. |
| if [[ "${TARGET}" == "llvm" ]]; then |
| lib_dir="${CACHE}/toolchain_iree_rv32imf/riscv32-unknown-elf/lib/" |
| try mkdir -p "${lib_dir}/newlib-nano" |
| try ln -rsf "${lib_dir}/libc_nano.a" "${lib_dir}/newlib-nano/libc.a" |
| try ln -rsf "${lib_dir}/libg_nano.a" "${lib_dir}/newlib-nano/libg.a" |
| try ln -rsf "${lib_dir}/libm_nano.a" "${lib_dir}/newlib-nano/libm.a" |
| try ln -rsf "${lib_dir}/libgloss_nano.a" "${lib_dir}/newlib-nano/libgloss.a" |
| fi |