diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 00000000..8a0e1705 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -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=. \ No newline at end of file diff --git a/.devcontainer/README.md b/.devcontainer/README.md new file mode 100644 index 00000000..ff247eaa --- /dev/null +++ b/.devcontainer/README.md @@ -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/`, 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. diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..3a42f3c5 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -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" + ] +} diff --git a/.devcontainer/example_launch.json b/.devcontainer/example_launch.json new file mode 100644 index 00000000..71d6548f --- /dev/null +++ b/.devcontainer/example_launch.json @@ -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" + } + ] +} \ No newline at end of file diff --git a/tools/triplets/arm64-linux.cmake b/tools/triplets/arm64-linux.cmake new file mode 100644 index 00000000..768033f9 --- /dev/null +++ b/tools/triplets/arm64-linux.cmake @@ -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()