blob: 0ca332bf316899bbfa86ea3d145a6abd0873abe2 [file] [log] [blame]
#!/bin/sh
# This script uses buildah to build the CHERIoT simulator from Sail.
# It will create two container images for caching:
# - A FreeBSD base system image (freebsd-${VERSION})
# - An image with Sail installed from opam and configured (sail)
# The final build runs in an ephemeral container and the simulator is copied
# out before the container is destroyed.
#
# Newer versions of the simulator rarely depend on a newer version of Sail. If
# the build fails, try deleting the sail container image (buildah rmi sail) and
# retrying.
if which -s buildah ; then
echo Buildah found
else
echo Buildah not found, please install with pkg ins buildah
exit 1
fi
# The FreeBSD project does not yet publish container base images. This script
# fetches a release tarball and uses it to initialise a container.
# If no arguments are specified, create a FreeBSD 13.1 release, otherwise use
# the provided argument.
VERSION=13.1
if [ -n "$1" ] ; then
VERSION=$1
fi
# If we have an existing sail container image, use it.
c=$(buildah from sail 2>/dev/null)
if [ $? -ne 0 ] ; then
# If we have an existing FreeBSD base container, use it.
c=$(buildah from freebsd-${VERSION} 2>/dev/null)
if [ $? -ne 0 ] ; then
echo FreeBSD ${VERSION} container does not exist, building...
c=$(buildah from scratch)
BASE=$(mktemp)
echo Fetching base tarball...
fetch -o ${BASE} https://download.freebsd.org/ftp/releases/$(uname -p)/${VERSION}-RELEASE/base.txz
buildah copy ${c} ${BASE} /base.txz
rm ${BASE}
echo Copying tar into container...
buildah copy ${c} /rescue/tar /tar
echo Extracting...
buildah run ${c} /tar -xpf base.txz
echo Deleting temporary files in container
buildah run ${c} rm /tar /base.txz
echo Committing freebsd-${VERSION} image...
buildah commit ${c} freebsd-${VERSION}
fi
echo Sail container does not exist, building...
# Install dependencies
buildah run --env IGNORE_OSVERSION=yes ${c} -- pkg ins --yes ocaml-opam z3 gmp gmake pkgconf
# Set up opam
buildah run --terminal ${c} -- opam init --yes
buildah run --terminal ${c} -- opam install --yes sail
buildah commit ${c} sail
fi
# Clone the CHERIoT Sail repo
buildah run ${c} -- git clone --recurse \
https://github.com/microsoft/cheriot-sail
# Create a shell script that runs the build with the correct environment
# variables set, we'll run that as a single build step.
BUILDSH=$(mktemp)
# The patch step turns each patch into a git commit, so needs an owner set.
echo 'git config --global user.email "root@localhost"' > ${BUILDSH}
echo 'git config --global user.name "Charlie Root"' >> ${BUILDSH}
# Patch the RISC-V repo
echo 'gmake patch_sail_riscv' >> ${BUILDSH}
# Set the ocaml environment variables.
echo 'eval $(opam env)' >> ${BUILDSH}
# Build cheriot_sim
echo "gmake csim C_OPT_FLAGS='-O4 -flto=full'" >> ${BUILDSH}
# Copy the build script into the container.
echo build.sh
cat $BUILDSH
buildah copy --chmod 555 ${c} ${BUILDSH} /cheriot-sail/build.sh
rm ${BUILDSH}
# Run the build
buildah run --env OPAMROOT=/.opam --workingdir cheriot-sail ${c} -- sh ./build.sh
# Copy the built simulator out
m=$(buildah mount ${c})
cp ${m}/cheriot-sail/c_emulator/cheriot_sim .
buildah umount ${c}
buildah rm ${c}
# Make the simulator executable
chmod +x cheriot_sim