blob: 0304c47349d004bcb5225a23d5db322cbcc2ba15 [file] [log] [blame]
#! /bin/bash
#
# Copyright 2020 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.
# This script is derived from work by mwitkowski@antmicro.com
# Script for building a CAmkES test setup using the minimal bits from
# KataOS. This is meant for testing kata-os-common portability and as
# a pathway to public use of the Rust code bits.
#
# This script assumes you have a gnu toolchain setup for the target
# platform and the associated "bin" dir in your shell's search path.
# The rust compiler likewise must be in your search path; the script
# suggests using rustup to request target support.
#
# Beware the KataOS Rust code currently uses a nightly build of Rust.
# Check projects/kata/apps/system/rust.cmake for cargo usage.
#
# The riscv* and arm/aarch* targets are build tested and in some cases
# tested under simulation. The x86* targets are untested and unsupported.
# There are many arm target flavors and only the basic stuff may work;
# in particular don't expect any hypervisor support to work without effort.
# TODO(sleffler): maybe add install-* scripts for necessary toolchains
# TODO(sleffler): maybe import dependent simulators as needed: qemu, spike, renode
set -e
TARGET_ARCH=${1:-aarch64}
EXTRA_INIT_ARGS=
MACHINE=
case ${TARGET_ARCH} in
arm|aarch32)
EXTRA_INIT_ARGS="${EXTRA_INIT_ARGS} -DSIMULATION=TRUE -DAARCH32=TRUE"
CROSS_COMPILER_PREFIX=${CROSS_COMPILER_PREFIX:-"arm-none-eabi-"}
RUST_TARGET=${RUST_TARGET:-"arm-unknown-linux-gnueabi"}
PLATFORM=${PLATFORM:-"omap3"}
;;
aarch64)
EXTRA_INIT_ARGS="${EXTRA_INIT_ARGS} -DSIMULATION=TRUE -DAARCH64=TRUE"
CROSS_COMPILER_PREFIX=${CROSS_COMPILER_PREFIX:-"aarch64-none-linux-gnu-"}
RUST_TARGET=${RUST_TARGET:-"${TARGET_ARCH}-unknown-none"}
PLATFORM=${PLATFORM:-"rpi3"}
MACHINE=${MACHINE:-"raspi3b"}
;;
riscv32)
# https://docs.sel4.systems/Hardware/spike.html
# assumes --enable-multilib toolchain
EXTRA_INIT_ARGS="${EXTRA_INIT_ARGS} -DRISCV32=TRUE"
CROSS_COMPILER_PREFIX=${CROSS_COMPILER_PREFIX:-"riscv32-unknown-elf-"}
RUST_TARGET=${RUST_TARGET:-"riscv32imac-unknown-none-elf"}
PLATFORM=${PLATFORM:-"spike"}
;;
riscv64)
# https://docs.sel4.systems/Hardware/spike.html
# assumes --enable-multilib toolchain
EXTRA_INIT_ARGS="${EXTRA_INIT_ARGS} -DRISCV64=TRUE"
CROSS_COMPILER_PREFIX=${CROSS_COMPILER_PREFIX:-"riscv64-unknown-linux-gnu-"}
RUST_TARGET=${RUST_TARGET:-"riscv64imac-unknown-none-elf"}
PLATFORM=${PLATFORM:-"spike"}
;;
esac
BUILD_DIR="build-${TARGET_ARCH}"
# Export required variables
# TODO: requiring SEL4_DIR & SEL4_OUT_DIR in the environment is
# awkward; maybe add fallback/defaults in the build glue
export ROOTDIR="$(pwd)"
export KATA_RUST_VERSION="nightly-2021-11-05"
export SEL4_DIR="${ROOTDIR}/kernel"
export SEL4_OUT_DIR="${ROOTDIR}/${BUILD_DIR}/kernel"
# NB: the gnu toolchain is expected to be in your shell search PATH; e.g.
# cd ~
# wget https://developer.arm.com/-/media/Files/downloads/gnu/11.2-2022.02/binrel/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz
# tar xf gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz
# PATH=~/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin:$PATH
rustup --version >/dev/null 2>&1 || {
cat <<EOF
It appears you don't have the rust installer on this system; please check here:
https://www.rust-lang.org/tools/install
for help getting started.
EOF
exit 1
}
rustup toolchain list | grep -q "${KATA_RUST_VERSION}" || {
cat <<EOF
It appears your rust toolchains do not include version ${KATA_RUST_VERSION}, this is
required to build this software. Use something like:
rustup toolchain add ${KATA_RUST_VERSION}
to add the necessary version.,
EOF
exit 1
}
rustup "+${KATA_RUST_VERSION}" target list | grep installed | grep -q "${RUST_TARGET}" || {
cat <<EOF
It appears your rust toolchain is not setup for ${RUST_TARGET}, use something like:
rustup target add --toolchain ${KATA_RUST_VERSION}-x86_64-unknown-linux-gnu ${RUST_TARGET}
to add support for ${RUST_TARGET}.
EOF
exit 1
}
# TODO(sleffler): this is slow, maybe cache result
pip list 2>/dev/null | grep -q -i tempita || {
cat <<EOF
It appears your python setup lacks the tempita module; this is necessary to build this software.
Something like:
pip install tempita
should install the necessary module.
EOF
}
# Run cmake to build the ninja files
test -f ${BUILD_DIR}/build.ninja || {
mkdir -p ${BUILD_DIR}
(cd ${BUILD_DIR} && ../init-build.sh \
-DCROSS_COMPILER_PREFIX=${CROSS_COMPILER_PREFIX} \
-DRUST_TARGET=${RUST_TARGET} \
-DPLATFORM=${PLATFORM} \
-DCAPDL_LOADER_APP=kata-os-rootserver \
-DSIMULATION=TRUE \
${EXTRA_INIT_ARGS})
}
# Run ninja to do the actual build
ninja -C ${BUILD_DIR} -j$(nproc)
echo "To run the simulator use: (cd ${BUILD_DIR} && ./simulate -M ${MACHINE})"