Skip to content

Commit

Permalink
Merge branch '148-add-devcontainer' of github.com:datasig-ac-uk/Rough…
Browse files Browse the repository at this point in the history
…Py into 148-add-devcontainer
  • Loading branch information
alexallmont committed Nov 20, 2024
2 parents 62f4ac7 + aff1e7f commit 45ce89c
Show file tree
Hide file tree
Showing 5 changed files with 200 additions and 0 deletions.
47 changes: 47 additions & 0 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
FROM ubuntu:22.04

# Install python
RUN apt-get update
RUN apt-get install -y \
python3 \
python3-venv \
python3-pip

# Dev tools require an additional update
RUN apt-get update
RUN apt-get install -y \
git \
gdb \
curl \
zip \
unzip \
tar \
autoconf \
libtool \
libtool-bin \
pkg-config

WORKDIR /tools

# Create new venv at container root and install libs
RUN python3 -m venv /tools/venv
ENV PATH /tools/venv/bin:$PATH
RUN pip install --upgrade pip setuptools wheel
RUN pip install \
cmake \
ninja \
pybind11 \
numpy \
pytest \
pytest-cov

# FIXME make conditional on arm, s390x, ppc64le and riscv
ENV VCPKG_FORCE_SYSTEM_BINARIES=1

# Install vcpkg in checkout location
RUN git clone https://github.com/Microsoft/vcpkg.git /tools/vcpkg
RUN /tools/vcpkg/bootstrap-vcpkg.sh
ENV PATH /tools/vcpkg:$PATH

# This is required to be able to run pytest in the VSCode terminal
ENV PYTHONPATH=.
31 changes: 31 additions & 0 deletions .devcontainer/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Build and debug in VSCode devcontainer

The `.devcontainer/` folder provides a consistent build and debug environment that can be run in VSCode locally or in GitHub Codespaces remotely.

## Opening devcontainer locally

When you open the cloned RoughPy folder in VSCode, accept the popup to open in a Dev Container or run the editor command `Dev Containers: Reopen in Dev Container`.

VSCode will restart inside a container that will have mapped your checkout folder to `/workspaces/<dirname>`, so be mindful that editing files is affecting this folder on your machine.

The devcontainer `Dockerfile` sets up a root `/tools` folder that contains a `venv` with build dependencies pre-installed, and a clone of `vcpkg`; both of which are added to `$PATH`.

## Building, testing and debugging

Run the editor command `CMake: Select Configure Preset` and select `Debug Develop` to compile with debug symbols. Then run `CMake: build`.

The devcontainer automatically installs the pytest and CTest extension, so after building you can launch any of the tests from the VSCode test explorer panel. Alternatively, you can run directly `pytest` directly from the integrated terminal.

VSCode loads debug scenarios from `.vscode/launch.json`. However, developers frequently need to edit this file with changes that should not be committed, so instead it is stored in `.devcontainer/example_launch.json`. Manually copy this over with:

```sh
cp .devcontainer/example_launch.json .vscode/launch.json
```

Select a debug scenario in the Run and Debug panel, add a breakpoint on the code to stop on, and launch with F5.

The three example scenarios are:

- `debugpy pytest` - Debug a specific `pytest` unit test in a python debugger.
- `gdb pytest` - Start a python test and debug any underlying C++.
- `gdb gtest` - Debug a specific GTest unit test in a C++ debugger.
39 changes: 39 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/cpp
{
"name": "RoughPy",

"build": {
"dockerfile": "Dockerfile"
},

"customizations": {
"vscode":{
"extensions": [
"ms-python.debugpy",
"ms-python.python",
"ms-python.vscode-pylance",
"ms-vscode.cmake-tools",
"ms-vscode.cpptools",
"ms-vscode.cpptools-extension-pack"
],
"settings": {
"python.defaultInterpreterPath": "/tools/venv/bin/python",
"python.languageServer": "Pylance",
"python.testing.pytestEnabled": true,
"cmake.cmakePath": "/tools/venv/bin/cmake",
"cmake.configureArgs": [
"-DCMAKE_MAKE_PROGRAM=/tools/venv/bin/ninja",
"-DCMAKE_TOOLCHAIN_FILE=/tools/vcpkg/scripts/buildsystems/vcpkg.cmake",
"-DROUGHPY_BUILD_TESTS=ON",
"-DROUGHPY_BUILD_PYLIB_INPLACE=ON"
]
}
}
},

// Enable debugging in container
"capAdd": [
"SYS_PTRACE"
]
}
73 changes: 73 additions & 0 deletions .devcontainer/example_launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "debugpy pytest",
"type": "debugpy",
"request": "launch",
"module": "pytest",
"console": "integratedTerminal",
"args": [
"-k", "test_exp_log_roundtrip_poly_coeffs"
],
"env": {},
"preLaunchTask": "CMake: build"
},
{
"name": "gdb pytest",
"type": "cppdbg",
"request": "launch",
"program": "${config:python.defaultInterpreterPath}",
"args": [
"-m", "pytest",
"-k", "test_exp_log_roundtrip_poly_coeffs"
],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "CMake: build"
},
{
"name": "gdb gtest",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/dev-debug/intervals/src/test_intervals",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "CMake: build"
}
]
}
10 changes: 10 additions & 0 deletions tools/triplets/arm64-linux.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
set(VCPKG_TARGET_ARCHITECTURE arm64)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE static)

set(VCPKG_CMAKE_SYSTEM_NAME Linux)

# FIXME for discussion in PR. I had to add this to get containers working in MacOS, as it seems the macro is not set correctly by default.
if (PORT MATCHES "mpg123")
set(VCPKG_CMAKE_CONFIGURE_OPTIONS "-DHAVE_FPU=1")
endif()

0 comments on commit 45ce89c

Please sign in to comment.