From 48c17da35a67113fa7645978c898dfe47af26bf9 Mon Sep 17 00:00:00 2001 From: Nathan Disidore Date: Tue, 10 Oct 2023 15:50:11 -0500 Subject: [PATCH 1/2] Bootstrap vscode dev container --- .devcontainer/Dockerfile | 40 ++++++++++++++++++ .devcontainer/devcontainer.json | 29 +++++++++++++ .gitignore | 1 + compile_flags.txt | 1 + docs/assets/vscode-dev-container-modal.png | Bin 0 -> 17379 bytes docs/assets/vscode-dev-container-progress.png | Bin 0 -> 4795 bytes docs/vscode.md | 10 +++++ 7 files changed, 81 insertions(+) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json create mode 100644 docs/assets/vscode-dev-container-modal.png create mode 100644 docs/assets/vscode-dev-container-progress.png diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 00000000000..a4526d670f9 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,40 @@ +FROM mcr.microsoft.com/devcontainers/base:jammy + +# Install dependencies, including clang via through LLVM APT repository. Note that this +# will also install lldb and clangd alongside dependencies. +ARG LLVM_VERSION=15 +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ + && apt-get -y install software-properties-common python3 python3-distutils \ + && curl -fSsL -o /tmp/llvm.sh https://apt.llvm.org/llvm.sh && chmod +x /tmp/llvm.sh && bash /tmp/llvm.sh ${LLVM_VERSION} \ + && apt-get -y install --no-install-recommends libunwind-${LLVM_VERSION} libc++abi1-${LLVM_VERSION} libc++1-${LLVM_VERSION} libc++-${LLVM_VERSION}-dev libclang-rt-${LLVM_VERSION}-dev -o DPkg::options::="--force-overwrite" +ENV PATH /usr/lib/llvm-${LLVM_VERSION}/bin:$PATH + +# Install NodeJS +ARG NODEJS_VERSION=v18.18.0 +ARG NODE_PACKAGE=node-${NODEJS_VERSION}-linux-x64 +ARG NODE_HOME=/opt/$NODE_PACKAGE +RUN curl https://nodejs.org/dist/${NODEJS_VERSION}/${NODE_PACKAGE}.tar.xz | tar xvfJ - -C /opt +ENV NODE_PATH ${NODE_HOME}/lib/node_modules +ENV PATH ${NODE_HOME}/bin:$PATH + +# Install Bazel (via Bazelisk) +ARG BAZELISK_VERSION=v1.18.0 +ARG BAZELISK_DOWNLOAD_SHA="ce52caa51ef9e509fb6b7e5ad892e5cf10feb0794b0aed4d2f36adb00a1a2779" +RUN curl -fSsL -o /usr/local/bin/bazel https://github.com/bazelbuild/bazelisk/releases/download/${BAZELISK_VERSION}/bazelisk-linux-amd64 \ + && echo "${BAZELISK_DOWNLOAD_SHA} /usr/local/bin/bazel" | sha256sum --check \ + && chmod 0755 /usr/local/bin/bazel + +# Install Bazel Buildifer +ARG BUILDIFER_VERSION=v6.3.3 +ARG BUILDIFER_DOWNLOAD_SHA="42f798ec532c58e34401985043e660cb19d5ae994e108d19298c7d229547ffca" +RUN curl -fSsL -o /usr/local/bin/buildifier https://github.com/bazelbuild/buildtools/releases/download/${BUILDIFER_VERSION}/buildifier-linux-amd64 \ + && echo "${BUILDIFER_DOWNLOAD_SHA} /usr/local/bin/buildifier" | sha256sum --check \ + && chmod 0755 /usr/local/bin/buildifier + +# Install watchexec https://watchexec.github.io/downloads/watchexec/ +ARG WATCHEXEC_VERSION=1.23.0 +ARG WATCHEXEC_ARCH=x86_64 +ADD https://github.com/watchexec/watchexec/releases/download/v${WATCHEXEC_VERSION}/watchexec-${WATCHEXEC_VERSION}-${WATCHEXEC_ARCH}-unknown-linux-gnu.deb /tmp/ +ADD https://github.com/watchexec/watchexec/releases/download/v${WATCHEXEC_VERSION}/watchexec-${WATCHEXEC_VERSION}-${WATCHEXEC_ARCH}-unknown-linux-gnu.deb.sha256 /tmp/ +RUN echo "`cat /tmp/watchexec-${WATCHEXEC_VERSION}-${WATCHEXEC_ARCH}-unknown-linux-gnu.deb.sha256` /tmp/watchexec-${WATCHEXEC_VERSION}-${WATCHEXEC_ARCH}-unknown-linux-gnu.deb" | sha256sum --check \ + && dpkg -i /tmp/watchexec-${WATCHEXEC_VERSION}-${WATCHEXEC_ARCH}-unknown-linux-gnu.deb diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000000..89a940a188e --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,29 @@ +{ + "name": "C++: Workerd", + "build": { + "dockerfile": "Dockerfile" + }, + "postStartCommand": "npm i", + "customizations": { + // Configure properties specific to VS Code. + "vscode": { + // Add the IDs of extensions you want installed when the container is created. + "extensions": [ + "BazelBuild.vscode-bazel", + "eamodio.gitlens", + "streetsidesoftware.code-spell-checker", + "llvm-vs-code-extensions.vscode-clangd", + "ms-vscode.cpptools", + "abronan.capnproto-syntax", + "DavidAnson.vscode-markdownlint" + ], + "settings": { + // The Microsoft C/C++ extension has IntelliSense support that is not compatible with the clangd extension. + "C_Cpp.intelliSenseEngine": "disabled", + "C_Cpp.default.cppStandard": "c++20" + } + } + } + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" +} diff --git a/.gitignore b/.gitignore index bfb799ec66c..ae11651ba24 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ node_modules /npm/*/bin /npm/workerd/install.js /npm/workerd/lib/ +package-lock.json # The external link for compile_flags.txt: Differs on Windows vs macOS/Linux, so we can't check it in. The pattern needs to not have a trailing / because it's a symlink on macOS/Linux. /external diff --git a/compile_flags.txt b/compile_flags.txt index 259ea8aee94..4ca83ee2374 100644 --- a/compile_flags.txt +++ b/compile_flags.txt @@ -37,6 +37,7 @@ -isystemexternal/v8 -isystemexternal/v8/include -isystemexternal/zlib +-isystemexternal/sqlite3 -D_FORTIFY_SOURCE=1 -DBAZEL_CURRENT_REPOSITORY=\"\" -DCAPNP_VERSION=11000 diff --git a/docs/assets/vscode-dev-container-modal.png b/docs/assets/vscode-dev-container-modal.png new file mode 100644 index 0000000000000000000000000000000000000000..6f8b8236f8eb399e3990a1dec734aa7c0a6367ed GIT binary patch literal 17379 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 literal 0 HcmV?d00001 diff --git a/docs/vscode.md b/docs/vscode.md index 497520bc994..14dfc06c42b 100644 --- a/docs/vscode.md +++ b/docs/vscode.md @@ -2,6 +2,16 @@ Visual Studio Code is a commonly used editor by workerd developers (other editors are great too!). These notes present some getting started tips. If you have tricks and tips that would improve the developer experience, please let us know! +## Using the [dev container](https://containers.dev/) + +workerd includes a [devcontainer](https://containers.dev/) setup that automates a majority of the developer environment setup by shifting the development to a container based setup. To make use of this, install the [devcontainer extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers). You can then either (a) use the **Dev Containers: Open Folder In Container** command and navigate to the checked out location or (b) open the project normally, in which case vscode should detect the presence of the devcontainer. Clicking **Reopen in Container** on the modal below will relaunch your workspaces in a container. + +![dev container modal](./assets/vscode-dev-container-modal.png) + +_Note_: It may take some time to initially bootstrap the dev container. To monitor its progress, click **show log** modal on the new window. Subsequent launches will be cached. + +![dev container bootstrap log](./assets/vscode-dev-container-progress.png) + ## Recommended extensions for developing workerd The recommended extensions to install are: From 342bb9e8237389c95daca25af6907de9c41bbc01 Mon Sep 17 00:00:00 2001 From: Nathan Disidore Date: Mon, 16 Oct 2023 10:31:55 -0500 Subject: [PATCH 2/2] Use latest node version Co-authored-by: James M Snell --- .devcontainer/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index a4526d670f9..badef8ae10c 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -10,7 +10,7 @@ RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ ENV PATH /usr/lib/llvm-${LLVM_VERSION}/bin:$PATH # Install NodeJS -ARG NODEJS_VERSION=v18.18.0 +ARG NODEJS_VERSION=v18.18.2 ARG NODE_PACKAGE=node-${NODEJS_VERSION}-linux-x64 ARG NODE_HOME=/opt/$NODE_PACKAGE RUN curl https://nodejs.org/dist/${NODEJS_VERSION}/${NODE_PACKAGE}.tar.xz | tar xvfJ - -C /opt