| #!/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 |