From f2371ce9659611bd0642586e9762c3043170aaa1 Mon Sep 17 00:00:00 2001 From: Brian Amos Date: Thu, 2 Nov 2023 10:51:30 -0400 Subject: [PATCH] adding support for using [VSCode DevContainers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) Provides a complete environment that is HostOS independent. Based on Ubuntu 22.04 with arm-gnu-toolchain 12.3 --- .devcontainer/devcontainer.json | 26 +++++++++++++++++++++ Dockerfile | 20 ++++++++++++++++ doc/VSCode_DevContainer.md | 34 ++++++++++++++++++++++++++++ doc/images/dev_container_prompt.png | Bin 0 -> 19426 bytes doc/images/env_devContainer.png | Bin 0 -> 7722 bytes 5 files changed, 80 insertions(+) create mode 100644 .devcontainer/devcontainer.json create mode 100644 Dockerfile create mode 100644 doc/VSCode_DevContainer.md create mode 100644 doc/images/dev_container_prompt.png create mode 100644 doc/images/env_devContainer.png diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 000000000..8d96444ec --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,26 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/docker-existing-dockerfile +{ + "name": "Existing Dockerfile", + "build": { + // Sets the run context to one level up instead of the .devcontainer folder. + "context": "..", + // Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename. + "dockerfile": "../Dockerfile" + } + + // Features to add to the dev container. More info: https://containers.dev/features. + // "features": {}, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Uncomment the next line to run commands after the container is created. + // "postCreateCommand": "cat /etc/os-release", + + // Configure tool-specific properties. + // "customizations": {}, + + // Uncomment to connect as an existing user other than the container default. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "devcontainer" +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..fabc92cca --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +FROM ubuntu:22.04 + +RUN apt-get update && \ + apt-get upgrade -y && \ + apt-get install -y make cmake zip curl wget git doxygen graphviz python3 python3-pip ninja-build openssh-server rsync zip cppcheck openocd && \ + wget -O archive.tar.xz "https://developer.arm.com/-/media/Files/downloads/gnu/12.3.rel1/binrel/arm-gnu-toolchain-12.3.rel1-x86_64-arm-none-eabi.tar.xz?rev=dccb66bb394240a98b87f0f24e70e87d&hash=B788763BE143D9396B59AA91DBA056B6" && \ + tar xf archive.tar.xz -C /opt && \ + rm archive.tar.xz && \ + apt-get autoclean -y && \ + apt-get autoremove -y && \ + apt-get clean + +# setup container arm-gcc toolchain paths for cmake +ENV PATH=/opt/arm-gnu-toolchain-12.3.rel1-x86_64-arm-none-eabi/bin:$PATH +RUN ln -s /opt/arm-gnu-toolchain-12.3.rel1-x86_64-arm-none-eabi/bin/arm-none-eabi-gcc /usr/bin/arm-none-eabi-gcc +RUN ln -s /opt/arm-gnu-toolchain-12.3.rel1-x86_64-arm-none-eabi/bin/arm-none-eabi-g++ /usr/bin/arm-none-eabi-g++ +RUN ln -s /opt/arm-gnu-toolchain-12.3.rel1-x86_64-arm-none-eabi/bin/arm-none-eabi-ar /usr/bin/arm-none-eabi-ar +RUN ln -s /opt/arm-gnu-toolchain-12.3.rel1-x86_64-arm-none-eabi/bin/arm-none-eabi-as /usr/bin/arm-none-eabi-as +RUN ln -s /opt/arm-gnu-toolchain-12.3.rel1-x86_64-arm-none-eabi/bin/arm-none-eabi-size /usr/bin/arm-none-eabi-size +RUN ln -s /opt/arm-gnu-toolchain-12.3.rel1-x86_64-arm-none-eabi/bin/arm-none-eabi-objcopy /usr/bin/arm-none-eabi-objcopy \ No newline at end of file diff --git a/doc/VSCode_DevContainer.md b/doc/VSCode_DevContainer.md new file mode 100644 index 000000000..0b4c6e240 --- /dev/null +++ b/doc/VSCode_DevContainer.md @@ -0,0 +1,34 @@ +# VSCode Dev Container development + +A Dockerfile has been added, which contains a complete development environment that is consistent across all operating systems supporting Docker. + +When VSCode encounters a `.devcontainer` directory, it will prompt you to open the workspace inside a [DevContainer](https://code.visualstudio.com/docs/devcontainers/containers). The entire build system is defined by the *DockerFile*, + +## Initial Setup +1. Install all [prerequisites](##prerequisites) +2. Open `hellow_world.code-workspace` in VSCode. You may be prompted to open the workspace in a dev container - select **Reopen In Container**. This will build and start the docker contain, then reopen VSCode *inside* the container. + + ![Alt text](images/dev_container_prompt.png) + + After VSCOde is running inside the container, the lower left corner of VSCode wil look something like this: + + ![Alt text](images/env_devContainer.png) +3. Your environment is all setup, continue with instructions from development-environment.md + +## Prerequisites + +### MS Windows based development + +* [Docker Desktop](https://www.docker.com/products/docker-desktop/) +* WSL 2 +* VSCode +* VSCode Extension : Dev Containers - Microsoft +* VSCode Extension : C++ Extension Pack - Microsoft +* VSCode Extension : CMake - twxs (optional - CMake syntax highliting) + +### Linux based development +* Docker Desktop +* VSCode +* VSCode Extension : Dev Containers - Microsoft +* VSCode Extension : C++ Extension Pack - Microsoft +* VSCode Extension : CMake - twxs (optional - CMake syntax highliting) \ No newline at end of file diff --git a/doc/images/dev_container_prompt.png b/doc/images/dev_container_prompt.png new file mode 100644 index 0000000000000000000000000000000000000000..a5ac7ad10a8fcfde0a3e6ab174a8f76c72e93c49 GIT binary patch literal 19426 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