From b22859abd3e72e83d2b083938b2072bb73893883 Mon Sep 17 00:00:00 2001 From: cndoit18 Date: Tue, 16 Jan 2024 00:47:04 +0800 Subject: [PATCH] feat: support devcontainer Add devcontainer support to use the development environment directly via vscode or codespaces. Signed-off-by: cndoit18 --- .devcontainer/devcontainer.json | 21 +++++++++++++++++++ .gitignore | 1 + Dockerfile | 37 ++++++++++++++++++--------------- rust-toolchain.toml | 3 ++- 4 files changed, 44 insertions(+), 18 deletions(-) create mode 100644 .devcontainer/devcontainer.json diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..2d7932f8 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,21 @@ +{ + "name": "rcore-tutorial-v3", + "build": { + "dockerfile": "../Dockerfile", + "args": { + "QEMU_VERSION": "7.0.0", + "DEBIAN_FRONTEND": "noninteractive", + "GDB_VERSION": "14.1" + } + }, + "postCreateCommand": "rustup show", + "customizations": { + "vscode": { + "extensions": [ + "rust-lang.rust-analyzer", + "ms-vscode.cpptools", + "tamasfe.even-better-toml" + ] + } + } +} diff --git a/.gitignore b/.gitignore index 852c161c..45fffb0e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .*/* !.github/* !.vscode/settings.json +!.devcontainer/devcontainer.json **/target/ **/Cargo.lock diff --git a/Dockerfile b/Dockerfile index 284db4cf..a3654757 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,16 +7,17 @@ FROM ubuntu:20.04 ARG QEMU_VERSION=7.0.0 +ARG GDB_VERSION=14.1 ARG HOME=/root # 0. Install general tools ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update && \ apt-get install -y \ - curl \ - git \ - python3 \ - wget + curl \ + git \ + python3 \ + wget # 1. Set up QEMU RISC-V # - https://learningos.github.io/rust-based-os-comp2022/0setup-devel-env.html#qemu @@ -29,13 +30,18 @@ WORKDIR ${HOME} RUN wget https://download.qemu.org/qemu-${QEMU_VERSION}.tar.xz && \ tar xvJf qemu-${QEMU_VERSION}.tar.xz +RUN wget https://ftp.gnu.org/gnu/gdb/gdb-${GDB_VERSION}.tar.xz && \ + tar xvJf gdb-${GDB_VERSION}.tar.xz + # 1.2. Install dependencies # - https://risc-v-getting-started-guide.readthedocs.io/en/latest/linux-qemu.html#prerequisites RUN apt-get install -y \ - autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev \ - gawk build-essential bison flex texinfo gperf libtool patchutils bc \ - zlib1g-dev libexpat-dev git \ - ninja-build pkg-config libglib2.0-dev libpixman-1-dev libsdl2-dev + autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev \ + gawk build-essential bison flex texinfo gperf libtool patchutils bc \ + zlib1g-dev libexpat-dev git \ + ninja-build pkg-config libglib2.0-dev libpixman-1-dev libsdl2-dev \ + libncurses5-dev python2 python2-dev libreadline-dev tmux + # 1.3. Build and install from source WORKDIR ${HOME}/qemu-${QEMU_VERSION} @@ -43,9 +49,14 @@ RUN ./configure --target-list=riscv64-softmmu,riscv64-linux-user && \ make -j$(nproc) && \ make install +WORKDIR ${HOME}/gdb-${GDB_VERSION} +RUN ./configure --prefix=/usr/local --target=riscv64-unknown-elf --enable-tui=yes && \ + make -j$(nproc) && \ + make install + # 1.4. Clean up WORKDIR ${HOME} -RUN rm -rf qemu-${QEMU_VERSION} qemu-${QEMU_VERSION}.tar.xz +RUN rm -rf qemu-${QEMU_VERSION} qemu-${QEMU_VERSION}.tar.xz ${HOME}/gdb-${GDB_VERSION} gdb-${GDB_VERSION}.tar.xz # 1.5. Sanity checking RUN qemu-system-riscv64 --version && \ @@ -73,13 +84,5 @@ RUN rustup --version && \ cargo --version && \ rustc --version -# 3. Build env for labs -# See os1/Makefile `env:` for example. -# This avoids having to wait for these steps each time using a new container. -RUN rustup target add riscv64gc-unknown-none-elf && \ - cargo install cargo-binutils --vers ~0.2 && \ - rustup component add rust-src && \ - rustup component add llvm-tools-preview - # Ready to go WORKDIR ${HOME} diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 3425f948..61bbf13c 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,5 +1,6 @@ [toolchain] profile = "minimal" # use the nightly version of the last stable toolchain, see -channel = "nightly-2023-10-09" +channel = "nightly-2024-01-18" components = ["rust-src", "llvm-tools-preview", "rustfmt", "clippy"] +targets = ["riscv64gc-unknown-none-elf"]