Ctrl K
ComunidadGuías…

Dockerfile

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
#############################
#    Selfie Docker Image    #
# selfie.cs.uni-salzburg.at #
#############################

#####################################
# RISCV gnu toolchain builder image #
#####################################
FROM ubuntu:latest AS riscvgnutoolchainbuilder

ENV TOP=/opt RISCV=/opt/riscv PATH=$PATH:/opt/riscv/bin

WORKDIR $TOP

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        ca-certificates \
        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 \
    && apt clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

RUN git clone https://github.com/riscv/riscv-gnu-toolchain

ENV MAKEFLAGS=-j4

RUN cd riscv-gnu-toolchain \
    && ./configure --prefix=$RISCV --enable-multilib \
    && make

###################################
# PK (Proxy kernel) builder image #
###################################
FROM ubuntu:latest AS pkbuilder

ENV TOP=/opt RISCV=/opt/riscv PATH=$PATH:/opt/riscv/bin

WORKDIR $TOP

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        ca-certificates \
        make git \
        gcc-riscv64-linux-gnu libc-dev-riscv64-cross \
    && apt clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

RUN git clone https://github.com/riscv/riscv-pk

# COPY --from=riscvgnutoolchainbuilder $RISCV/ $RISCV/

ENV MAKEFLAGS=-j4

# moving the compiled binaries from riscv64-linux-gnu to riscv64-unknown-elf
# because spike looks for riscv64-unknown-elf by default when running pk
RUN mkdir -p riscv-pk/build \
    && cd riscv-pk/build \
    && ../configure --prefix=$RISCV --host=riscv64-linux-gnu --with-arch=rv64imafdc_zifencei --with-abi=lp64d \
    && make \
    && make install \
    && mv $RISCV/riscv64-linux-gnu $RISCV/riscv64-unknown-elf

#######################################
# Spike (ISA simulator) builder image #
#######################################
FROM ubuntu:latest AS spikebuilder

ENV TOP=/opt RISCV=/opt/riscv PATH=$PATH:/opt/riscv/bin

WORKDIR $TOP

RUN apt-get update \
  && apt-get install -y --no-install-recommends \
       ca-certificates \
       make git \
       g++ device-tree-compiler libboost-regex-dev libboost-system-dev \
  && apt clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

RUN git clone --recurse-submodules https://github.com/riscv/riscv-isa-sim

ENV MAKEFLAGS=-j4

RUN mkdir -p riscv-isa-sim/build \
    && cd riscv-isa-sim/build \
    && ../configure --prefix=$RISCV \
    && make \
    && make install

######################
# QEMU builder image #
######################
FROM ubuntu:latest AS qemubuilder

ENV TOP=/opt RISCV=/opt/riscv PATH=$PATH:/opt/riscv/bin

WORKDIR $TOP

# install QEMU user-mode binaries — on Ubuntu 25.10 these are statically
# linked (static-pie) but no longer carry the -static suffix, so we rename
# on copy to preserve the filenames the selfie Makefile expects
RUN apt-get update \
  && apt-get install -y --no-install-recommends \
       qemu-user qemu-system-riscv \
  && apt clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# copy QEMU RISC-V binaries to common output folder, restoring -static suffix
RUN mkdir -p $RISCV/bin \
  && cp /usr/bin/qemu-riscv64 $RISCV/bin/qemu-riscv64-static \
  && cp /usr/bin/qemu-system-riscv64 $RISCV/bin \
  && cp /usr/bin/qemu-riscv32 $RISCV/bin/qemu-riscv32-static \
  && cp /usr/bin/qemu-system-riscv32 $RISCV/bin

########################################
# Boolector (SMT solver) builder image #
########################################
# Pinned to ubuntu:24.04 because boolector's bundled lingeling does not
# compile under gcc 15 (it has function-pointer mismatches that gcc 15
# promotes to hard errors and lingeling's makefile does not honor CFLAGS,
# so they cannot be downgraded from outside). 24.04 ships gcc 13, which
# emits only warnings. The resulting btormc binary runs fine on the
# newer selfieall stage thanks to glibc forward compatibility.
FROM ubuntu:24.04 AS boolectorbuilder

ENV TOP=/opt RISCV=/opt/riscv PATH=$PATH:/opt/riscv/bin

WORKDIR $TOP

# Setting non-interactive mode
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections

# install tools to build boolector
RUN apt-get update \
  && apt-get install -y --no-install-recommends \
       ca-certificates \
       make git \
       g++ \
       curl cmake \
  && apt clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

RUN git clone https://github.com/Boolector/boolector

ENV MAKEFLAGS=-j4

# build boolector and dependencies
RUN mkdir -p $RISCV \
  && cd boolector \
  && ./contrib/setup-lingeling.sh \
  && ./contrib/setup-btor2tools.sh \
  && ./configure.sh --prefix $RISCV \
  && cd build \
  && make \
  && make install

#######################################
# Bitwuzla (SMT solver) builder image #
#######################################
FROM ubuntu:latest AS bitwuzlabuilder

ENV TOP=/opt RISCV=/opt/riscv PATH=$PATH:/opt/riscv/bin

WORKDIR $TOP

# Setting non-interactive mode
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections

# install tools to build bitwuzla
RUN apt-get update \
  && apt-get install -y --no-install-recommends \
       ca-certificates \
       make git \
       g++ \
       pkg-config cmake meson libgmp-dev libmpfr-dev \
  && apt clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

RUN git clone https://github.com/bitwuzla/bitwuzla

ENV MAKEFLAGS=-j4

# build bitwuzla and dependencies
RUN mkdir -p $RISCV \
  && cd bitwuzla \
  && ./configure.py --prefix $RISCV \
  && cd build \
  && ninja install

############################
# Selfie interactive image #
############################
FROM ubuntu:latest AS selfieall

ENV TOP=/opt RISCV=/opt/riscv PATH=$PATH:/opt/riscv/bin

WORKDIR $TOP

# Setting non-interactive mode
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections

# install tools for selfie
RUN apt-get update \
  && apt-get install -y --no-install-recommends \
       ca-certificates \
       make git \
       gcc gdb libc6-dev-i386-amd64-cross \
       python3 \
       device-tree-compiler gcc-riscv64-linux-gnu \
       binutils-riscv64-linux-gnu libc-dev-riscv64-cross \
       libusb-dev libhidapi-dev \
       xxd gettext curl \
  && apt clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# copy pk, spike, qemu, boolector, and bitwuzla from builder images
COPY --from=pkbuilder $RISCV/ $RISCV/
COPY --from=spikebuilder $RISCV/ $RISCV/
COPY --from=qemubuilder $RISCV/ $RISCV/
COPY --from=boolectorbuilder $RISCV/ $RISCV/
COPY --from=bitwuzlabuilder $RISCV/ $RISCV/

# add selfie sources to the image
COPY . /opt/selfie/

# specify user work directory
WORKDIR /opt/selfie

# test build, then clean selfie
RUN make selfie \
  && make clean

# default command
CMD ["/bin/bash"]

#################################
# Selfie interactive full image #
#################################
FROM selfieall AS selfieeverything

# only works on amd64 for now

# install tools for 32-bit selfie — match the lib32gcc-*-dev to the
# version of gcc the system is using (Ubuntu's gcc package currently
# tracks gcc-15). The gcc-multilib meta-package would conflict with
# gcc-riscv64-linux-gnu, so install the 32-bit support libraries directly.
RUN apt-get update \
  && apt-get install -y --no-install-recommends lib32gcc-15-dev libc6-dev-i386 \
  && apt clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# specify user work directory
WORKDIR /opt/selfie

# build baremetal machine files
RUN make --directory machine/

# default command
CMD ["/bin/bash"]