mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-23 17:33:23 +00:00
173 lines
5.2 KiB
Docker
173 lines
5.2 KiB
Docker
# SPDX-License-Identifier: MPL-2.0
|
|
|
|
FROM ubuntu:22.04 AS build-base
|
|
|
|
ARG DEBIAN_FRONTEND=noninteractive
|
|
|
|
RUN apt update && apt-get install -y --no-install-recommends \
|
|
build-essential \
|
|
ca-certificates \
|
|
git \
|
|
python3-pip \
|
|
python-is-python3 \
|
|
wget
|
|
|
|
RUN pip3 install yq tomli
|
|
|
|
#= Build QEMU =================================================================
|
|
|
|
FROM build-base AS build-qemu
|
|
|
|
RUN apt update && apt-get install -y --no-install-recommends \
|
|
libgcrypt-dev `# optional build dependency` \
|
|
libglib2.0-dev `# build dependency` \
|
|
libpixman-1-dev `# build dependency` \
|
|
libusb-dev `# optional build dependency` \
|
|
meson \
|
|
ninja-build
|
|
RUN apt clean && rm -rf /var/lib/apt/lists/*
|
|
|
|
FROM build-qemu AS qemu
|
|
|
|
# Fetch and install QEMU from the official source
|
|
#
|
|
# The QEMU version in the Ubuntu 22.04 repository is 6.*, which has a bug to cause OVMF debug to fail.
|
|
# The libslirp dependency is for QEMU's network backend.
|
|
WORKDIR /root
|
|
|
|
RUN wget -O qemu.tar.xz https://download.qemu.org/qemu-9.1.0.tar.xz \
|
|
&& mkdir /root/qemu \
|
|
&& tar xf qemu.tar.xz --strip-components=1 -C /root/qemu \
|
|
&& rm qemu.tar.xz
|
|
WORKDIR /root/qemu
|
|
RUN ./configure --target-list=x86_64-softmmu --prefix=/usr/local/qemu --enable-slirp \
|
|
&& make -j \
|
|
&& make install
|
|
WORKDIR /root
|
|
RUN rm -rf /root/qemu
|
|
|
|
#= Build OVMF =================================================================
|
|
|
|
FROM build-base AS build-ovmf
|
|
|
|
RUN apt update && apt-get install -y --no-install-recommends \
|
|
bison \
|
|
flex \
|
|
iasl \
|
|
nasm \
|
|
uuid-dev
|
|
RUN apt clean && rm -rf /var/lib/apt/lists/*
|
|
RUN git --version
|
|
|
|
FROM build-ovmf AS ovmf
|
|
|
|
# Fetch and build OVMF from the EDK2 official source
|
|
WORKDIR /root
|
|
RUN git clone --depth 1 --branch stable/202408 --recurse-submodules --shallow-submodules https://github.com/tianocore/edk2.git
|
|
WORKDIR /root/edk2
|
|
RUN /bin/bash -c "source ./edksetup.sh \
|
|
&& make -C BaseTools \
|
|
&& build -a X64 -t GCC5 -b DEBUG -p OvmfPkg/OvmfPkgX64.dsc -D DEBUG_ON_SERIAL_PORT \
|
|
&& build -a X64 -t GCC5 -b RELEASE -p OvmfPkg/OvmfPkgX64.dsc"
|
|
|
|
#= Build GRUB =================================================================
|
|
|
|
FROM build-base AS build-grub
|
|
|
|
RUN apt update && apt-get install -y --no-install-recommends \
|
|
autoconf \
|
|
automake \
|
|
autopoint \
|
|
bison \
|
|
flex \
|
|
gawk \
|
|
gettext \
|
|
libfreetype6-dev \
|
|
pkg-config
|
|
RUN apt clean && rm -rf /var/lib/apt/lists/*
|
|
|
|
FROM build-grub AS grub
|
|
|
|
# Fetch and install GRUB from the GNU official source
|
|
#
|
|
# We have installed grub-efi-amd64-bin just for the unicode.pf2 file, which is not included
|
|
# in the GRUB release. The Ubuntu release notoriously modifies the GRUB source code and enforce
|
|
# EFI handover boot, which is deprecated. So we have to build GRUB from source.
|
|
WORKDIR /root
|
|
# See also: https://github.com/asterinas/asterinas/pull/1710
|
|
RUN git clone --single-branch -b asterinas/2.12 https://github.com/asterinas/grub.git \
|
|
&& git -C grub checkout 0633bc8
|
|
# Fetch and install the Unicode font data for grub.
|
|
RUN wget -O unifont.pcf.gz https://ftp.gnu.org/gnu/unifont/unifont-15.1.04/unifont-15.1.04.pcf.gz \
|
|
&& mkdir -pv /usr/share/fonts/unifont \
|
|
&& gunzip -c unifont.pcf.gz > /usr/share/fonts/unifont/unifont.pcf \
|
|
&& rm unifont.pcf.gz
|
|
WORKDIR /root/grub
|
|
|
|
RUN echo depends bli part_gpt > grub-core/extra_deps.lst \
|
|
&& ./bootstrap \
|
|
&& ./configure \
|
|
--target=x86_64 \
|
|
--disable-efiemu \
|
|
--with-platform=efi \
|
|
--enable-grub-mkfont \
|
|
--prefix=/usr/local/grub \
|
|
--disable-werror \
|
|
&& make -j \
|
|
&& make install
|
|
WORKDIR /root
|
|
RUN rm -rf /root/grub
|
|
|
|
#= The final stages to produce the OSDK development image ====================
|
|
|
|
FROM build-base AS rust
|
|
|
|
# Install all OSDK dependent packages
|
|
RUN apt update \
|
|
&& apt install -y \
|
|
build-essential \
|
|
curl \
|
|
gdb \
|
|
grub-efi-amd64 \
|
|
grub2-common \
|
|
libpixman-1-dev `# running dependency for QEMU` \
|
|
mtools `# used by grub-mkrescue` \
|
|
xorriso \
|
|
&& apt clean \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Install Rust with both nightly and stable
|
|
ENV PATH="/root/.cargo/bin:${PATH}"
|
|
ARG ASTER_RUST_VERSION
|
|
RUN curl https://sh.rustup.rs -sSf | \
|
|
sh -s -- --default-toolchain ${ASTER_RUST_VERSION} -y \
|
|
&& rustup toolchain install stable \
|
|
&& rm -rf /root/.cargo/registry && rm -rf /root/.cargo/git \
|
|
&& cargo -V \
|
|
&& rustup component add rust-src rustc-dev llvm-tools-preview
|
|
|
|
# Install cargo tools
|
|
RUN cargo install \
|
|
cargo-binutils \
|
|
mdbook \
|
|
typos-cli
|
|
|
|
# Install QEMU built from the previous stages
|
|
COPY --from=qemu /usr/local/qemu /usr/local/qemu
|
|
ENV PATH="/usr/local/qemu/bin:${PATH}"
|
|
ENV LD_LIBRARY_PATH="/usr/local/qemu/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH}"
|
|
|
|
# Install OVMF built from the previous stages
|
|
COPY --from=ovmf /root/edk2/Build/OvmfX64/DEBUG_GCC5/FV/ /root/ovmf/debug
|
|
COPY --from=ovmf /root/edk2/Build/OvmfX64/RELEASE_GCC5/FV/ /root/ovmf/release
|
|
|
|
# Install GRUB built from the previous stages
|
|
COPY --from=grub /usr/local/grub /usr/local/grub
|
|
ENV PATH="/usr/local/grub/bin:${PATH}"
|
|
# Make a symbolic link for `unicode.pf2` from Ubuntu 22.04 package
|
|
RUN ln -sf /usr/share/grub/unicode.pf2 /usr/local/grub/share/grub/unicode.pf2
|
|
|
|
VOLUME [ "/root/asterinas" ]
|
|
|
|
WORKDIR /root/asterinas
|