diff --git a/Dockerfile b/Dockerfile index 2a24996..4cae760 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,34 @@ -FROM ubuntu:23.10 +# The Dockerfile consists of four stages, each setting up components for a +# RISC-V development environment. +# +# - Stage 1: Utilises Ubuntu 23.10 to install build tools and dependencies, +# then clones, compiles, and installs the RISC-V GNU toolchain in +# `/opt/riscv`. +# +# - Stage 2: Sets up another Ubuntu 23.10 environment, copies the RISC-V +# toolchain from Stage 1, installs additional dependencies, and then +# clones, compiles, and installs the RISC-V Proxy Kernel. +# +# - Stage 3: Uses Ubuntu 23.10 again, brings forward tools from previous +# stages, installs further dependencies, and then clones, compiles, +# and installs the Spike RISC-V ISA simulator. +# +# - Stage 4: Prepares the final Ubuntu 23.10 environment, copies all tools, +# updates the PATH to include `/opt/riscv/bin`, and configures the +# container to start with a shell for immediate interaction. + +############################## Stage 1 + +FROM ubuntu:23.10 AS stage1 ENV DEBIAN_FRONTEND=noninteractive WORKDIR /root -# Install prerequisites +# RISC-V toolchain +# Source: https://github.com/riscv-collab/riscv-gnu-toolchain + +## Install prerequisites RUN apt update -qq && apt install -y --no-install-recommends \ autoconf \ automake \ @@ -33,7 +57,7 @@ RUN apt update -qq && apt install -y --no-install-recommends \ libslirp-dev \ && rm -rf /var/lib/apt/lists/* -# Compile and install toolchain +## Compile and install RUN git clone https://github.com/riscv/riscv-gnu-toolchain WORKDIR /root/riscv-gnu-toolchain @@ -45,12 +69,105 @@ WORKDIR /root RUN rm -rf /root/riscv-gnu-toolchain -# Install additional prerequisites +############################## Stage 2 + +FROM ubuntu:23.10 AS stage2 + +COPY --from=stage1 /opt/riscv /opt/riscv + +WORKDIR /root + +## Install prerequisites RUN apt update -qq && apt install -y --no-install-recommends \ + autoconf \ + automake \ + autotools-dev \ + curl \ + python3 \ + python3-pip \ + libmpc-dev \ + libmpfr-dev \ + libgmp-dev \ + gawk \ + build-essential \ + bison \ + flex \ + texinfo \ + gperf \ + libtool \ + patchutils \ + bc \ + zlib1g-dev \ + libexpat-dev \ + ninja-build \ + git \ + cmake \ + libglib2.0-dev \ + libslirp-dev \ + && rm -rf /var/lib/apt/lists/* + +# RISC-V proxy kernel and boot loader +# Source: https://github.com/riscv-software-src/riscv-pk + +## Compile and install +RUN git clone https://github.com/riscv-software-src/riscv-pk + +WORKDIR /root/riscv-pk + +ENV PATH="${PATH}:/opt/riscv/bin/" + +RUN mkdir build && \ + cd build && \ + ../configure --prefix=/opt/riscv --host=riscv64-unknown-elf --with-arch=rv64gc_zifencei && \ + make -j8 && \ + make install + +WORKDIR /root + +RUN rm -rf /root/riscv-pk + +############################## Stage 3 + +FROM ubuntu:23.10 AS stage3 + +COPY --from=stage2 /opt/riscv /opt/riscv + +WORKDIR /root + +## Install prerequisites +RUN apt update -qq && apt install -y --no-install-recommends \ + autoconf \ + automake \ + autotools-dev \ + curl \ + python3 \ + python3-pip \ + libmpc-dev \ + libmpfr-dev \ + libgmp-dev \ + gawk \ + build-essential \ + bison \ + flex \ + texinfo \ + gperf \ + libtool \ + patchutils \ + bc \ + zlib1g-dev \ + libexpat-dev \ + ninja-build \ + git \ + cmake \ + libglib2.0-dev \ + libslirp-dev \ device-tree-compiler \ && rm -rf /var/lib/apt/lists/* -# Compile and install Spike +# Spike, RISC-V ISA simulator +# Source: https://github.com/riscv-software-src/riscv-isa-sim + +## Compile and install RUN git clone https://github.com/riscv/riscv-isa-sim.git WORKDIR /root/riscv-isa-sim @@ -65,5 +182,15 @@ WORKDIR /root RUN rm -rf /root/riscv-isa-sim +############################## Stage 4 + +FROM ubuntu:23.10 AS stage4 + +COPY --from=stage3 /opt/riscv /opt/riscv + +WORKDIR /root + +RUN echo "export PATH=$PATH:/opt/riscv/bin" >> /root/.bashrc + # Pass commands into container ENTRYPOINT ["bash", "-lc"] \ No newline at end of file