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