blob: 4ad48fa607c8c200d2367e6d5071599c1e0d7958 [file] [log] [blame]
#!/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.
# Download toolchain source.
if [[ -z "${ROOTDIR}" ]]; then
echo "Source build/setup.sh first"
exit 1
fi
if [[ -z "$1" ]]; then
echo "Usage: download-toolchain.sh <gcc dir> [<TARGET> | GCC | LLVM | KELVIN | CHERIOT]"
exit 1
fi
TOOLCHAIN_TARGET=${2:-GCC}
TOOLCHAIN_GCC_SRC="$1"
TOOLCHAIN_SRC="${OUT}/tmp/toolchain"
LLVM_SRC="${TOOLCHAIN_SRC}/llvm-project"
# Download from the http://github.com/riscv/riscv-gnu-toolchain. For proper
# support of GDB symbol rendering, it requires a tag points to gcc 10.2.
# NB: the riscv-binutils has to point to upstream binutil-gdb regardless of
# what it is in .gitmodules
TOOLCHAIN_TAG="2021.06.18"
TOOLCHAIN_GCC_URL="https://github.com/riscv/riscv-gnu-toolchain"
TOOLCHAINLLVM_BINUTILS_URL="git://sourceware.org/git/binutils-gdb.git"
#TOOLCHAIN_CHERIOT_TAG=
#TOOLCHAIN_CHERIOT_URL="https://github.com/CHERIoT-Platform/llvm-project"
TOOLCHAIN_CHERIOT_URL="https://github.com/sleffler/llvm-project"
TOOLCHAIN_CHERIOT_TAG="cheriot-merge-cleanup-1"
TOOLCHAIN_CHERIOT_SRC="${TOOLCHAIN_SRC}/cheriot-llvm-project"
if [[ ! "${TOOLCHAIN_TARGET}" == "GCC" ]] &&
[[ ! "${TOOLCHAIN_TARGET}" == "LLVM" ]] &&
[[ ! "${TOOLCHAIN_TARGET}" == "KELVIN" ]] &&
[[ ! "${TOOLCHAIN_TARGET}" == "CHERIOT" ]]; then
echo "Unsupported toochain target: ${TOOLCHAIN_TARGET}"
exit 1
fi
function git_clone() {
local url="$1"
local src_dir="$2"
local opt_tag="$3"
if [[ -d "${src_dir}" ]]; then
echo "Remove existing ${src_dir}..."
rm -rf "${src_dir}"
fi
if [[ -n "${opt_tag}" ]]; then
echo "Downloading the toolchain source code from tag ${opt_tag}"
git clone "${url}" -b "${opt_tag}" "${src_dir}"
else
echo "Downloading the toolchain source code"
git clone "${url}" "${src_dir}"
fi
}
echo "Download toolchain for target ${TOOLCHAIN_TARGET}"
case "${TOOLCHAIN_TARGET}" in
GCC)
git_clone "${TOOLCHAIN_GCC_URL}" "${TOOLCHAIN_GCC_SRC}" "${TOOLCHAIN_TAG}"
# Update submodules.
pushd "${TOOLCHAIN_GCC_SRC}" > /dev/null
git submodule update --init --jobs=8 riscv-*
popd > /dev/null
;;
LLVM)
git_clone "${TOOLCHAIN_GCC_URL}" "${TOOLCHAIN_GCC_SRC}" "${TOOLCHAIN_TAG}"
# Update submodules.
pushd "${TOOLCHAIN_GCC_SRC}" > /dev/null
git submodule update --init --jobs=8 riscv-*
cd "riscv-binutils"
git remote set-url origin "${TOOLCHAINLLVM_BINUTILS_URL}"
git pull -f origin master --jobs=8 --depth=1
git checkout FETCH_HEAD
popd > /dev/null
# Download LLVM project if necessary. Always pull from main ToT.
if [[ -d "${LLVM_SRC}" ]]; then
echo "Removing existing ${LLVM_SRC}..."
rm -rf "${LLVM_SRC}"
fi
mkdir -p "${LLVM_SRC}"
pushd "${LLVM_SRC}" > /dev/null
git init
git remote add origin https://github.com/llvm/llvm-project
git pull origin main --jobs=8 --depth=1
popd > /dev/null
;;
KELVIN)
git_clone "${TOOLCHAIN_GCC_URL}" "${TOOLCHAIN_GCC_SRC}" "${TOOLCHAIN_TAG}"
# Update submodules.
pushd "${TOOLCHAIN_GCC_SRC}" > /dev/null
# CentOS7 git does not support parellel jobs.
git submodule update --init riscv-*
# Update riscv-binutils for kelvin to binutils 2.40
cd "riscv-binutils"
git remote set-url origin "${TOOLCHAINLLVM_BINUTILS_URL}"
git fetch -f origin binutils-2_40 --depth=1
git checkout FETCH_HEAD
popd > /dev/null
# Patch Kelvin custom ops
pushd "${TOOLCHAIN_GCC_SRC}/riscv-binutils" > /dev/null
git am "${ROOTDIR}/build/patches/kelvin/0001-Kelvin-riscv-binutils-patch.patch"
cp "${ROOTDIR}/build/patches/kelvin/kelvin-opc.h" "include/opcode/kelvin-opc.h"
cp "${ROOTDIR}/build/patches/kelvin/kelvin-opc.c" "opcodes/kelvin-opc.c"
popd > /dev/null
pushd "${TOOLCHAIN_GCC_SRC}/riscv-gcc" > /dev/null
git am "${ROOTDIR}/build/patches/riscv-gcc/0001-Define-__KELVIN__.patch"
popd > /dev/null
pushd "${TOOLCHAIN_GCC_SRC}/riscv-newlib" > /dev/null
git am "${ROOTDIR}/build/patches/riscv-newlib/0001-Add-memcpy-kelvin.c.patch"
popd > /dev/null
;;
CHERIOT)
git_clone "${TOOLCHAIN_CHERIOT_URL}" "${TOOLCHAIN_CHERIOT_SRC}" "${TOOLCHAIN_CHERIOT_TAG}"
;;
*)
echo "Unexpected target ${TARGET}!"
exit -1
;;
esac