Skip to content

Setup Development Environment

Choosing the Right Operating System

Most of the RIOT OS developers are using Linux on their development PCs, so you can expect the most streamlined experience here. Generally, most Linux distributions are supported.

If you are new to Linux, we recommend using Ubuntu, as it is the most widely used distribution and has the most extensive documentation and community support.

Some distributions, such as Fedora, do not provide the necessary packages for cross compilation. In this case, it is recommended to use the RIOT Docker Container.

Windows

Windows is supported through Windows Subsystem for Linux (WSL). The experience is not as streamlined as on Linux, but it is still possible to develop with RIOT.

macOS

Native development on macOS machines is not officially supported.

What works well is using Linux in a virtual machine, but at much lower performance than running Linux natively.

We also offer Docker images that make it a bit easier to develop on macOS.

Installing the required software packages

Depending on the operation distribution you are using, the installation of the required software packages may vary.

Ubuntu

Ubuntu command to install required packages
sudo apt install make gcc-multilib python3-serial python3-psutil wget unzip git openocd gdb-multiarch esptool podman-docker clangd clang

Arch Linux

Arch Linux command to install required packages
sudo pacman -S make gcc-multilib python-pyserial python-psutil wget unzip git openocd gdb esptool podman-docker clang

This will show something like this depending on your distribution:

Ubuntu terminal waiting for confirmation for installation

  • Confirm the installation by hitting the return-key
  • The installation process will take some time
  • Eventually the output will look like below (except for the exit)

Ubuntu terminal after installation completed

Cloning the RIOT Repository and First Steps in the Terminal

Cloning of the RIOT Repo in the Ubuntu terminal

  • Open the terminal.
  • Type git clone https://github.com/RIOT-OS/RIOT and confirm with the return-key
  • This may take some time. Eventually, it will print done. when it completed
  • Type cd RIOT/examples/basic/hello-world and confirm with the return-key to enter the folder hello-world example app in the RIOT repo
  • Type make and confirm with the return key to build the app for the board native

The hello-world app running on the virtual native board

  • Now run the application by executing make term
  • The output should look similar to the screenshot above
  • You can close the terminal by:
    1. Press and hold the Ctrl-key
    2. With the Ctrl-key still held, press the C-key
    3. Release both keys

Using VS Code for Development

  • If not already open, open the terminal
  • Confirm that the terminal is pointed to the folder ~/RIOT/examples/basic/hello-world
    • The blue part left of the prompt (the $ sign in the terminal) shows the current working directory for the terminal
    • If the blue string is not ~/RIOT/examples/basic/hello-world, type cd ~/RIOT/examples/basic/hello-world to enter that path
  • Inside ~/RIOT/examples/basic/hello-world run the command make compile-commands
  • The output should look like above

Ubuntu terminal running make compile-commands in the hello-world app

  • Navigate back to ~/RIOT using the command cd ~/RIOT
  • run code . to launch VS Code
    • This will take a bit longer on the first launch
  • Eventually, a VS Code Window should pop up that looks like this:

VS Code opened via shell

  1. Click on “Yes, I trust the authors”
  • Now, use the tree view in the left and open the examples folder
  • Open the basic folder inside the examples folder
  • Open the hello-world folder inside the basic folder
  • Open the main.c file in the hello-world folder within examples
  • The file should open and look like this:

VS Code asking to install C/C++ Extension

  1. Click on the “Install” button when prompted to install the C/C++ Extension.

IntelliSense showing that RIOT_BOARD is "native"

  • Confirm that when hovering over RIOT_BOARD in the source code, IntelliSense shows that it expands to "native".

Compiling via the Terminal in VS Code

  • Extend the message to be printed, e.g. by adding a puts("..."); statement in the source code
  • Save the modified source code (e.g. Ctrl+S)
  • Open the integrated terminal by clicking on the terminal tab at the bottom
  • Navigate to ~/RIOT/examples/basic/hello-world using cd ~/RIOT/examples/basic/hello-world
  • Run the make command to build the code
  • Run make make term to launch the application
  • The result should look like:

Running the app in VS Code

Congratulations! You just compiled your first RIOT application. To run RIOT on real hardware, proceed with the next to sections.

Architecture Specific Requirements

For each architecture a default tool for flashing and on-chip debugging is listed below - in most cases OpenOCD. However, some boards use different tools, e.g. because a bootloader is installed that allows flashing via the serial interface. Check the board documentation for any details on this. If that documentation contains no info about a flashing tool, the default tool for its architecture is used.

Architecture: ARM7 and ARM Cortex M*

  • GCC, binutils, and newlib for arm-none-eabi
    • Alternatively: Install docker and export BUILD_IN_DOCKER=1
  • OpenOCD for debugging/flashing (most boards)
    • Some boards use UF2 based bootloaders, which require auto-mounting to work with make flash
    • Some boards default to using J-Link for flashing/debugging. Either install that or export PROGRAMMER=openocd to just use OpenOCD instead
    • installation instructions can be found here
  • Optional: picolibc for arm-none-eabi to link against picolibc instead of newlib
  • Optional: clang to build with TOOLCHAIN=llvm
  • Optional: GDB multiarch for debugging
    • If no multiarch package is available, use GDB for arm-none-eabi instead

Architecture: Xtensa

ESP32
ESP8266

Architecture: AVR

  • GCC and binutils for AVR and avrlibc
    • Alternatively: Install docker and export BUILD_IN_DOCKER=1
  • avrdude for flashing
  • Optional: AVaRICE and GDB (multiarch version) for debugging

Architecture: RISC-V

  • GCC, binutils, and newlib for RISC-V (target triple should start with riscv and end with -none-elf or -unknown-elf. Note that most packages are multilib, e.g. riscv64-unknown-elf will likely work fine for 32 bit RISC-V boards)
    • Alternatively: Install docker and export BUILD_IN_DOCKER=1
  • OpenOCD for debugging/flashing (some new boards might require a patched version of OpenOCD or a recent build from the git sources)
  • Optional: picolibc to link against picolibc instead of newlib (recommended)
  • Optional: clang to build with TOOLCHAIN=llvm
  • Optional: GDB multiarch for debugging

Architecture: MSP430

  • GCC, binutils, and newlib for MSP430
    • Alternatively: Install docker and export BUILD_IN_DOCKER=1
  • mspdebug for flashing/debugging
  • Optional: GDB multiarch for debugging

Architecture: native

  • On 64 bit systems: multilib versions for your host compilers, standard C library, and development headers
    • Alternatively: Compile with BUILD_IN_DOCKER=1. Note that for running the executable you still need a multilib system (or 32 bit Linux) with glibc a standard C library.
  • A C library supporting the deprecated POSIX.1-2001 ucontext library (e.g. glibc, FreeBSD’s libc)
  • Optional: GDB for debugging. (Prefer the multiarch version, this will also work for other boards)