1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-12-13 16:43:52 +01:00

doc/guide: Introduce a Guide Site

doc/guides: How to Doc

fix: add starlight to base makefile
This commit is contained in:
AnnsAnn 2025-04-11 15:15:31 +02:00
parent ec94a3cd72
commit e82ada6358
28 changed files with 8602 additions and 1 deletions

33
.github/workflows/deploy_docs.yml vendored Normal file
View File

@ -0,0 +1,33 @@
name: Build Docs
on:
push:
branches:
- master
paths:
- 'doc/guides/**'
- 'doc/starlight/**'
jobs:
build-docs:
runs-on: ubuntu-latest
defaults:
run:
working-directory: doc/starlight
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
- name: Build documentation
run: make build
# This step will probably need to be changed to use the actual service RIOT is using
# This makes it more convenient to deploy while still in development though
- name: Deploy documentation
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: doc/starlight/dist
publish_branch: gh-pages
cname: guide.riot-os.org
commit_message: "Deploy documentation"

View File

@ -1,6 +1,6 @@
.all:
.PHONY: all doc doc-man doc-latex docclean print-versions welcome
.PHONY: all doc doc-man doc-latex docclean doc-starlight print-versions welcome
all: welcome
@echo ""
@ -12,8 +12,12 @@ doc doc-man doc-latex doc-ci:
--output-md doc/doxygen/src/feature_list.md
"$(MAKE)" -C doc/doxygen $@
doc-starlight:
"$(MAKE)" -C doc/starlight dev
docclean:
"$(MAKE)" -BC doc/doxygen clean
"$(MAKE)" -C doc/starlight clean
pkg-clean:
@echo "Cleaning all package sources"

View File

@ -131,6 +131,7 @@ run ./dist/tools/codespell/check.sh
run ./dist/tools/cargo-checks/check.sh
run ./dist/tools/examples_check/check_has_readme.sh
run ./dist/tools/examples_check/check_in_readme.sh
run ./dist/tools/code_in_guides_check/check_for_code.sh
if [ -z "${GITHUB_RUN_ID}" ]; then
run ./dist/tools/uncrustify/uncrustify.sh --check
else

View File

@ -0,0 +1,101 @@
#!/bin/bash
# This script checks if the code blocks in markdown files under the guides directory
# are present in the corresponding source files. It looks for code blocks marked with
# ```c and checks if the code exists in the source files defined by the code_folder
# variable in the markdown file. If the code block is not found, it will print an error
# message and exit with a non-zero status.
# Define the guides directory
BASE_DIR="$(git rev-parse --show-toplevel)"
GUIDES_DIR="$BASE_DIR/doc/guides"
# Check if directory exists
if [ ! -d "$GUIDES_DIR" ]; then
echo "Error: Guides directory not found at $GUIDES_DIR"
exit 1
fi
exit_code=0
# Parses code blocks from within a file
# Args: $1 -> Line number of the code block
# $2 -> The file path
# Returns:
# 0 -> On found or skipped block
# 1 -> Not found
parse_code_block() {
start_line=$1
file_path=$2
# Check whether there is a <!--skip ci--> comment in the line before the code block
skip_ci=$(sed -n "$((start_line - 1))p" "$file_path" | grep -c '<!--skip ci-->')
if [ "$skip_ci" -gt 0 ]; then
echo " ✔️ Line $start_line: Code block is skipped due to <!--skip ci--> comment"
return 0
fi
# Extract the code block content until the ending ```
code_block=$(awk -v start="$start_line" 'NR>start{if(/^```$/){exit}; print}' "$file_path")
# Check if this code exists in any file in the source directory
found=0
for src_file in "$SOURCE_DIR"/*; do
# Skip if not a regular file
[ -f "$src_file" ] || continue
# Read the file content
src_content=$(cat "$src_file")
# Check if the code block exists in the current source file
if [[ "$src_content" == *"$code_block"* ]]; then
found=1
echo " ✔️ Found Line $start_line in $(basename "$src_file")"
break
fi
done
if [ $found -eq 0 ]; then
echo " ❌ Line $start_line: Code block not found in any source file"
return 1
fi
}
markdown_files=$(find "$GUIDES_DIR" -type f \( -name "*.md" -o -name "*.mdx" \))
# Find and process all .md and .mdx files
for file in $markdown_files; do
echo "🧐 Processing file: $file"
# Check if there is a code_folder defined in the markdown file
code_folder=$(grep -oP -m1 'code_folder:\s*\K.+' "$file")
if [ -z "$code_folder" ]; then
echo " ✔️ File does not specify code_folder, skipping ..."
continue
fi
SOURCE_DIR="$BASE_DIR/$code_folder"
echo "🔍 Looking for code in $SOURCE_DIR"
# Get all code block start lines
code_block_starts=$(grep -n '```[cC]' "$file" | cut -d':' -f1)
if [ -z "$code_block_starts" ]; then
echo " ❌ No code blocks found in this file even though code_folder was specified."
exit_code=1
fi
# Process each code block
for start_line in $code_block_starts; do
parse_code_block "$start_line" "$file"
if [ "$?" -eq "1" ]; then
exit_code=1
fi
done
done
if [ $exit_code -eq 0 ]; then
echo "👍 All code blocks found in the source files."
else
echo "👎 Some code blocks were not found in the source files. See the output above."
fi
exit $exit_code

View File

@ -0,0 +1,64 @@
---
title: Advanced Build System Tricks
description: This page describes some build systems tricks that can help developers but are not part of the standard workflow.
---
This page describes some build systems tricks that can help developers but are not part of the standard workflow.
They are low level commands that should not be taken as part of a stable API but better have a documentation than only having a description in the build system code.
## Customize the build system
- `RIOT_MAKEFILES_GLOBAL_PRE`: files parsed before the body of `$RIOTBASE/Makefile.include`
- `RIOT_MAKEFILES_GLOBAL_POST`: files parsed after the body of `$RIOTBASE/Makefile.include`
The variables are a list of files that will be included by `$RIOTBASE/Makefile.include`. They will be handled as relative to the application directory if the path is relative.
## Usage
You can configure your own files that will be parsed by the build system main `Makefile.include` file before or after its main body, examples usages can be:
- Globally overwrite a variable, like `TERMPROG`
- Specify a hard written `PORT` / `DEBUG_ADAPTER_ID` for some BOARD values
- Define your custom targets
- Override default targets
## Analyze dependency resolution
When refactoring dependency handling or modifying variables used for dependency resolution, one may want to evaluate the impact on the existing applications. This describe some debug targets to dump variables used during dependency resolution.
To analyze one board and application run the following commands in an application directory.
Generate the variables dump with the normal dependency resolution to a `dependencies_info_board_name` file:
```sh
BOARD=board_name make dependency-debug
```
Or with the "quick" version used by murdock to know supported boards (this is an incomplete resolution, details in `makefiles/dependencies_debug.inc.mk`) to a `dependencies_info-boards-supported_board_name` file:
```sh
BOARDS=board_name DEPENDENCY_DEBUG=1 make info-boards-supported
```
For more configuration and usage details, see in the file defining the targets `makefiles/dependencies_debug.inc.mk`.
To do a repository wide analysis, you can use the script `dist/tools/buildsystem_sanity_check/save_all_dependencies_resolution_variables.sh` that will generate the output for all boards and applications. It currently take around 2 hours on an 8 cores machine with ssd.
## Generate Makefile.ci content
Most applications and tests include a `Makefile.ci` to indicate which boards cannot compile the application or test. The content for these files can be generated via the script in:
```sh
make -C $APPLICATION_DIRECTORY generate-Makefile.ci
```
This will compile and link the application for every board available and record the result in the Makefile.ci. This requires the toolchain for every target to be available. The target supports using docker via the `BUILD_IN_DOCKER=1` variable.
## Out of Tree Cache Directory
By exporting the `BUILD_DIR` environment variable, a custom build / clone cache directory can be created. This can be particularly useful when working with multiple git work trees or clones of the RIOT repository.
## RIOT-aware Completion in zsh
For zsh users a RIOT-aware completion is provided in `dist/tools/zsh-completion`. Refer to the `README.md` in there for more details and installation instructions.

View File

@ -0,0 +1,128 @@
---
title: Build in Docker
description: Building RIOT in a Docker container
---
Some parts of RIOT's build process can be performed inside a Docker container,
which comes with the necessary compilers and toolchains and is fully managed by
the build system. It can be enabled by passing `BUILD_IN_DOCKER=1` to make.
```shell
$ BUILD_IN_DOCKER=1 make
```
If your user does not have permissions to access the Docker daemon:
```shell
$ BUILD_IN_DOCKER=1 DOCKER="sudo docker" make
```
to always use Docker for building, set `BUILD_IN_DOCKER=1` (and if necessary
`DOCKER="sudo docker"`) in the environment:
```console
$ export BUILD_IN_DOCKER=1
```
## Targets ran in Docker: DOCKER_MAKECMDGOALS_POSSIBLE
Currently only build related targets are ran in the docker container, the exact
list is under `DOCKER_MAKECMDGOALS_POSSIBLE` variable.
## Environment Variables: DOCKER_ENV_VARS
When building in docker one might want for the command ran in docker to inherit
variables that might have been set in the command line. e.g.:
```shell
BOARD=samr21-xpro USEMODULE=xtimer make -C examples/hello-world
```
In `docker.ink.mk` the origin of a variable listed in `DOCKER_ENV_VARS` is checked
and if the origin is `environment` or `command` (for make command-line argument)
then those variables will be passed to the docker container.
You can also set in `DOCKER_ENV_VARS` in the environment to add variables to the
list, e.g.:
```shell
DOCKER_ENV_VARS=BEER_TYPE BEER_TYPE="imperial stout" BUILD_IN_DOCKER=1 make -C examples/hello-world/
docker run --rm -t -u "$(id -u)" \
...
-e 'BEER_TYPE=imperial stout' \
-w '/data/riotbuild/riotbase/examples/hello-world/' \
'riot/riotbuild:latest' make
```
Your application Makefile can also extend `DOCKER_ENV_VARS`.
### Directly Define Environment Variables: DOCKER_ENVIRONMENT_CMDLINE
`DOCKER_ENVIRONMENT_CMDLINE` can be used to add variables directly to the environment
but will need to be prefixed with `-e` (see [option-summary]).
e.g.:
```
DOCKER_ENVIRONMENT_CMDLINE='-e BEER_TYPE="imperial stout"' BUILD_IN_DOCKER=1 make -C examples/hello-world/
docker run --rm -t -u "$(id -u)" \
...
-e 'BEER_TYPE=imperial stout' \
-w '/data/riotbuild/riotbase/examples/hello-world/' \
'riot/riotbuild:latest' make
```
## Command Line Variables: DOCKER_OVERRIDE_CMDLINE
Command line arguments are variables that are passed after `make` e.g.
`make target FOO=bar`, but different to environment variables a variable defined
through the command line will take precedence over all assignments of `FOO` within
the makefile (same effect as adding `-e` for environment variables, see
[option-summary] for more details.
To pass variables overriding the command-line to docker `DOCKER_OVERRIDE_CMDLINE`
may be used:
```shell
DOCKER_OVERRIDE_CMDLINE="BEER_TYPE='imperial stout'" BUILD_IN_DOCKER=1 make -C examples/hello-world/ RIOT_CI_BUILD=1
Launching build container using image "riot/riotbuild:latest".
sudo docker run --rm -t -u "$(id -u)" \
...
-w '/data/riotbuild/riotbase/examples/hello-world/' \
'riot/riotbuild:latest' make BEER_TYPE='imperial stout' 'RIOT_CI_BUILD=1'
```
### Redefined or Overridden Variables: DOCKER_ENV_VARS_ALWAYS
There is a corner case for the handling of `DOCKER_ENV_VARS`. If a variable is
redefined (`+=`, `=`, `:=`) or overridden then the origin of the variable will be changed
to `file` and there is no way of detecting in Make how it was set.
If this happens after `docker.ink.mk` this is not an issue, but for all variables
susceptible to be defined in the application `Makefile` this is indeed the case.
A subset of these variables, namely variables relating to dependency resolution
are therefore unconditionally passed to docker. The complete list can be found
under `DOCKER_ENV_VARS_ALWAYS`.
#### CFLAGS
CFLAGS are not automatically passed to docker because they might contain spaces,
'"' or other characters that will require escaping. The solution is to pass it with
`DOCKER_ENVIRONMENT_CMDLINE` and escape every character as required.
e.g: if wanting to override STRING_WITH_SPACES
```
# normal build
CFLAGS=-DSTRING_WITH_SPACES='\"with space\" make
# in docker
DOCKER_ENVIRONMENT_CMDLINE='-e CFLAGS=-DSTRING_WITH_SPACES=\'\\\"with\ space\\\"\'' \
BUILD_IN_DOCKER=1 make
```
Alternatively, it is often easier to define the CFLAGS in the Makefile which gets
evaluated inside the Docker image again), conditional on a less complex environment
variable that gets added to `DOCKER_ENV_VARS` in the Makefile.
[option-summary]: https://www.gnu.org/software/make/manual/html_node/Options-Summary.html

View File

@ -0,0 +1,58 @@
---
title: The Build System
description: Learn how the build system in RIOT works
---
RIOT uses [GNU make](https://www.gnu.org/software/make/) as build system. The
simplest way to compile and link an application with RIOT, is to set up a
Makefile providing at least the following variables:
* `APPLICATION`: should contain the (unique) name of your application
* `BOARD`: specifies the platform the application should be built for by
default
* `RIOTBASE`: specifies the path to your copy of the RIOT repository (note,
that you may want to use `$(CURDIR)` here, to give a relative path)
Additionally it has to include the `Makefile.include`, located in RIOT's root
directory:
```make title="a minimal application Makefile"
APPLICATION = mini-makefile
BOARD ?= native
RIOTBASE ?= $(CURDIR)/../RIOT
include $(RIOTBASE)/Makefile.include
```
You can use Make's `?=` operator in order to allow overwriting
variables from the command line. For example, you can easily specify the target
platform, using the sample Makefile, by invoking make like this:
```shell
make BOARD=iotlab-m3
```
Besides typical targets like `clean`, `all`, or `doc`, RIOT provides the
special targets `flash` and `term` to invoke the configured flashing and
terminal tools for the specified platform. These targets use the variable
`PORT` for the serial communication to the device. Neither this variable nor
the targets `flash` and `term` are mandatory for the native port.
For the native port, `PORT` has a special meaning: it is used to identify the
tap interface if the `netdev_tap` module is used. The target `debug` can be
used to invoke a debugger on some platforms. For the native port the additional
targets such as `all-valgrind` and `valgrind` exist. Refer to
`cpu/native/README.md` for additional information
Some RIOT directories contain special Makefiles like `Makefile.base`,
`Makefile.include` or `Makefile.dep`. The first one can be included into other
Makefiles to define some standard targets. The files called `Makefile.include`
are used in `boards` and `cpu` to append target specific information to
variables like `INCLUDES`, setting the include paths. `Makefile.dep` serves to
define dependencies.
Unless specified otherwise, make will create an elf-file as well as an Intel
hex file in the `bin` folder of your application directory.
Learn more about the build system in the
[Wiki](https://github.com/RIOT-OS/RIOT/wiki/The-Make-Build-System)

View File

@ -0,0 +1,214 @@
---
title: Build System Basics
description: This page describes the basic concepts of the RIOT build system.
---
## FEATURES
### What is a FEATURE?
A `FEATURE` is a mean of specifying valid/invalid dependencies and configurations.
Whenever a `FEATURE` is used there should be at some level a hardware requirement,
whether this is a _radio_, a _bus_ of a specific core architecture.
This is not a hard line, in some cases the line can be harder to establish than
others. There are complicated cases like `netif` since a network interface could
be fully implemented in software as a loop-back.
It's also important to note that a `FEATURE` does not mean there is a `MODULE`
with the same name. There could be many implementations for the same `FEATURE`.
The fact that many `FEATURES` translate directly into a `MODULE` is only by
convenience.
e.g.
# all periph features correspond to a periph submodule
USEMODULE += $(filter periph_%,$(FEATURES_USED))
### Providing a FEATURE
For a `FEATURE` to be provided by a `board` it must meet 2 criteria, and for
`periph_%` and other _hw_ (hardware) related `FEATURES` it must follow a 3rd criteria.
- Needs the "hardware" or BSP support (toolchain, build system, flasher, etc.)
- e.g.: `stm32l152re` has an SPI peripheral
`riotboot` needs to be able to link and flash at an offset
- Needs support in RIOT, an implementation of an api to interact with the _hw_
- e.g.: `cpu/stm32_common/periph/spi.c` is implemented for `stm32l1`
`riotboot` needs an implementation of `cpu_jump_to_image`
- Wiring between the _cpu/soc_(system on a chip) a _bus_ and other _cpu_/_hw_ components.
- e.g.: `nucleo-l152re/include/periph_conf.h` specified wiring between `PORT_Ax`
and `SPI1`
### All the FEATURES\_%
- `FEATURES_PROVIDED` are available hardware (including BSP) features
(e.g.:`periph_hwrng`, `periph_uart`) or characteristics (e.g:`arch_32bits`) of
a board.
- `FEATURES_CONFLICT` are a series of `FEATURES` that can't be used at the same
time for a particular `BOARD`.
- `FEATURES_REQUIRED` are `FEATURES` that are needed by a `MODULE` or `APPLICATION`
to work.
- `FEATURES_OPTIONAL` are "nice to have" `FEATURES`, not needed but useful. If
available they are always included.
- `FEATURES_REQUIRED_ANY` are `FEATURES` of which (at least) one of
is needed by a `MODULE` or `APPLICATION`. Alternatives are separated by
a pipe (`|`) in order of preference, e.g.:
`FEATURES_REQUIRED_ANY += arch_avr8|arch_native` if both are provide then
`arch_avr8` will be used.
- `FEATURES_BLACKLIST` are `FEATURES` that can't be used by a `MODULE` or `APPLICATION`.
They are usually used for _hw_ characteristics like `arch_` to easily resolve
unsupported configurations for a group.
- `FEATURES_USED` are the final list of `FEATURES` that will be used by an `APPLICATION`
### Where to define FEATURES\_%
- `FEATURES_PROVIDED`, `FEATURES_CONFLICT` and `FEATURES_CONFLICT_MSG ` are
defined in `Makefile.features`
- `FEATURES_REQUIRED`, `FEATURES_OPTIONAL`, `FEATURES_REQUIRED_ANY`,
and `FEATURES_BLACKLIST` are defined by the application `Makefile`
(`examples/%/Makefile`, `tests/%/Makefile`, etc.) or in `Makefile.dep`
## CPU/CPU_MODEL
`CPU` and `CPU_MODEL` refer to the _soc_ or _mcu_ (microcontroller)
present in a `BOARD`. The variables `CPU`, `CPU_FAM`, etc. are just arbitrary groupings
to avoid code duplication. How this grouping is done depends on every implementation
and the way each manufacturer groups there products.
These variables allows declaring the `FEATURES` that the _mcu/soc_ provides as well
as resolving dependencies.
`FEATURES` provided by a `CPU/CPU_MODEL` should not depend on the wiring of a
specific `BOARD` but be intrinsic to the _soc/mcu_.
A `CPU/CPU_MODEL` might support `FEATURES` that will depend on the `BOARD` wiring,
e.g.: bus (`uart`, `spi`) mappings. In this cases the `FEATURE` should be provided
by the `BOARD.`
## BOARD
In RIOTs build-system, a `BOARD` is a grouping of:
- _soc/mcu_ (`CPU/CPU_MODEL`)
- e.g.: `b-l072z-lrwan1` `stm32l072cz`
- _sensor/actuators_ (buttons and leds included) (`drivers`)
- e.g.: `b-l072z-lrwan1` leds and buttons
- _radios_, _ethernet_, etc. devices (`drivers`)
- e.g.: `b-l072z-lrwan1` `sx1276`
- _programming/debugging_ tools
- e.g.: `b-l072z-lrwan1` `stlink`
- configuration mapping cpu support capabilities to availability
- e.g.: `b-l072z-lrwan1` `periph_conf.h`, `gpio_params`
A `board` can have all the required `FEATURES` to interact with a radio or
sensor/actuator, but it doesn't necessarily provide that `FEATURE`.
e.g.: - `samr21-xpro` provides a `at86rf233` radio as well as the necessary
`periph_*` features. - `nucleo-*` provide all `periph_*` features to use `sx1272`, and
even a default configuration for the `SX1272MB2xA` shield, but not
doesn't provide the radio.
If a `board` in `$(RIOTBASE)/boards` is connected to a radio shield, sensors,
actuators, etc. then it is a different `board` than the one provided by default.
Whenever you need to have a device mapping (in linux-arm, it would require
a different device tree), then it is a different board and would need a
different `board/periph_conf`.
A `nucleo-*` with a `SX1272MB2xA` is a different board in RIOT sense.
_note_: if `devicetree` is implemented this concept will change.
# Variables declaration guidelines
This page contains basic guidelines about `make` variable declaration, it
summarizes some of the pros and cons as well as specifies good and bad patterns
in our build system. You might want to refer to `gnu make` documentation
regarding these subjects.
## Avoid unnecessary export
```
export OUTPUT = $(shell some-command)
```
Exporting a variable means it will be evaluated on every `target` call, which
slows down the build system. Always avoid exporting a variable if unneeded.
If an export is actually needed by a `sub-make` then export the variable only for
the needed targets using `target-export-variables` (more in
`makefiles/utils/variables.mk`).
Exported variables ("global variable") are hard to remove, specially when badly
documented. If no one knows why it's there and no one knows where it can be used
then no one knows if it's safe to remove since it's present for every target.
This is why global variables need clear documentation.
[gnumake doc](https://www.gnu.org/software/make/manual/html_node/Variables_002fRecursion.html)
## Use memoized for variables referencing a function or command
### recursively expanded variable:
```
OUTPUT = $(shell some-command $(ANOTHER_VARIABLE))
```
- When using `=` the value of the variable is only declared, but not set,
therefore the variable will only be evaluated when expanded (used) somewhere
in the makefile. If `$(OUTPUT)` is never expanded, `some-command`
is never executed and `ANOTHER_VARIABLE` not expanded.
- All variables or functions referenced by the declared variable will will be
evaluated every time the variable is expanded.
In the example `some-command` is executed every time `OUTPUT` is expanded, same for
`ANOTHER_VARIABLE`. If `some-command` is slow this introduced unneeded overhead.
- If the variable expansion doesn't involve evaluating a function the overhead
is none.
### simply expanded variable:
```
OUTPUT := $(shell some-command $(ANOTHER_VARIABLE))
```
- When using `:=` the value is only expanded once, expanding any reference to
other variables or functions. If `OUTPUT` is always used at least once and
evaluates a costly function (`some command`) then use `:=`.
- When using `:=` the variable will be evaluated even if not needed, which
introduces unnecessary delay, in particular `some command` or functions
evaluated by `ANOTHER_VARIABLE` are slow.
It can also cause a failure in a worst-case scenario (think what happens if a
tool is defined with `:=` but you don't have the tool and you don't need it either).
- The values of variables declared with `:=` depend on the order of definition.
### memoized:
```
OUTPUT = $(call memoized,OUTPUT,$(shell some-command))
```
- `memoized` is a RIOT defined function that combines characteristics from
both `=` and `:=`.
The variable expansion will be deferred until its first usage, but further
usage will consider it as a simply expanded variable, so it will use the already
evaluated value. In the example `some-command` would be executed once or not
at all (more in `makefiles/utils/variables.mk`).
[gnumake doc](https://www.gnu.org/software/make/manual/html_node/Flavors.html)
## Additional documentation
- Deferred vs. simple expansion: http://make.mad-scientist.net/deferred-simple-variable-expansion/
- Tracking issue: [#10850](https://github.com/RIOT-OS/RIOT/issues/10850)

View File

@ -0,0 +1,156 @@
---
title: Structure
description: This section walks you through RIOT's structure. Once you understand this structure, you will easily find your way around in RIOT's code base.
---
This section walks you through RIOT's structure. Once you understand this
structure, you will easily find your way around in RIOT's code base.
![Overview](../img/riot-structure.svg)
RIOT's code base is structured into five groups.
- The kernel (`core`)
- Platform specific code (`cpu`; `boards`)
- Device drivers (`drivers`)
- Libraries and network code (`sys`; `pkg`)
- Applications for demonstrating features and for testing (`examples`;
`tests`)
In addition RIOT includes a collection of scripts for various tasks (`dist`) as
well as a predefined environment for generating this documentation (`doc`).
The structural groups are projected onto the directory structure of RIOT, where
each of these groups resides in one or two directories in the main RIOT
directory.
The following list gives a more detailed description of each of RIOT's
top-level directories:
core
----
This directory contains the actual kernel. The kernel consists of the scheduler,
inter-process-communication (messaging), threading, and thread
synchronization, as well as supporting data-structures and type definitions.
See @ref core for further information and API documentations.
boards
------
The platform dependent code is split into two logic elements: CPUs and boards,
while maintaining a strict 1-to-n relationship, a board has exactly one CPU,
while a CPU can be part of n boards. The CPU part contains all generic, CPU
specific code (see below).
The board part contains the specific configuration for the CPU it contains.
This configuration mainly includes the peripheral configuration and
pin-mapping, the configuration of on-board devices, and the CPU's clock
configuration.
On top of the source and header files needed for each board, this directory
additionally may include some script and configuration files needed for
interfacing with the board. These are typically custom flash/debug scripts or
e.g. OpenOCD configuration files. For most boards, these files are located in a
`dist` sub-directory of the board.
See here @ref boards for further information.
cpu
---
For each supported CPU this directory contains a sub-directory with the name of
the CPU. These directories then contain all CPU specific configurations, such
as implementations of power management (LPM), interrupt handling and vectors,
startup code, clock initialization code and thread handling (e.g. context
switching) code. For most CPUs you will also find the linker scripts in the
`ldscripts` sub-directory.
In the `periph` sub-directory of each CPU you can find the implementations of
the CPU's peripheral drivers like SPI, UART, GPIO, etc. See @ref drivers_periph
for their API documentation.
Many CPUs share a certain amount of their code (e.g. all ARM Cortex-M based
CPUs share the same code for task switching and interrupt handling). This
shared code is put in its own directories, following a `xxxxx_common` naming
scheme. Examples for this is code shared across architectures (e.g.
`cortexm_common`, `msp430_comon`) or code shared among vendors (e.g.
`stm32_common`).
See @ref cpu for more detailed information.
drivers
-------
This directory contains the drivers for external devices such as network
interfaces, sensors and actuators. Each device driver is put into its own
sub-directory with the name of that device.
All of RIOT's device drivers are based on the peripheral driver API (e.g. SPI,
GPIO, etc.) and other RIOT modules like the `xtimer`. This way the drivers are
completely platform agnostic and they don't have any dependencies into the CPU
and board code.
See @ref drivers for more details.
sys
---
RIOT follows a modular design paradigm where everything is supposed to
be a module. All of these modules that are not part of the hardware abstraction
nor device drivers can be found in this directory. The libraries include data
structures (e.g. bloom, color), crypto libraries (e.g. hashes, AES) ,
high-level APIs (e.g. Posix implementations), memory management (e.g. malloc),
the RIOT shell and many more.
See @ref sys for a complete list of available libraries
sys/net
-------
The `sys/net` sub-directory needs to be explicitly mentioned, as this is where
all the networking code in RIOT resides. Here you can find the network stack
implementations (e.g. the @ref net_gnrc "GNRC" stack) as well as network stack agnostic code as
header definitions or network types.
See @ref net for more details on networking code.
pkg
---
RIOT comes with support for a number of external libraries (e.g.
[ccn-lite](https://github.com/cn-uofbasel/ccn-lite),
[microcoap](https://github.com/1248/microcoap)). The way they are included is
that RIOT ships with a custom Makefile for each supported library that
downloads the library and optionally applies a number of patches to make it
work with RIOT. These Makefiles and patches can be found in the `pkg`
directory.
See @ref pkg for a detailed description on how this works.
examples
--------
Here you find a number of example applications that demonstrate certain
features of RIOT. The default example found in this directory is a good
starting point for anyone who is new to RIOT.
For more information best browse that directory and have a look at the
`README.md` files that ship with each example.
To create your own application - here or anywhere else - see @ref creating-an-application
tests
-----
Many features/modules in RIOT come with their own test application, which are
located in this directory. In contrary to the examples these tests are mostly
focusing on a single aspect than on a set of features. Despite for testing, you
might consider these tests also for insights on understanding RIOT.
dist & doc
----------
All the tooling around RIOT can be found in these two folders.
`doc` contains the doxygen configuration and also contains the compiled doxygen
output after running `make doc`.
Lastly, the `dist` directory contains tools to help you with RIOT. These
include
the serial terminal application `pyterm`, generic scripts for flashing,
debugging, resetting (e.g. support for [OpenOCD](http://openocd.org/),
[Jlink](https://www.segger.com/jlink_base.html)), as well as code enabling easy
integration to open testbeds such as the [IoT-LAB](https://www.iot-lab.info/).
Furthermore you can find here scripts to do all kind of code and style checks.

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1,537 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg version="1.1" width="640" height="430"
xmlns="http://www.w3.org/2000/svg"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg">
<title>RIOT's structure</title>
<metadata>
<rdf:RDF>
<cc:Work rdf:about="Provides a general overview over RIOT's general structure">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>RIOT Overview</dc:title>
<cc:license rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" />
<dc:creator>
<cc:Agent>
<dc:title>Martine Lenders</dc:title>
</cc:Agent>
</dc:creator>
</cc:Work>
<cc:License rdf:about="http://creativecommons.org/licenses/by-sa/3.0/">
<cc:permits rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:requires rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<defs>
<style type="text/css">
<![CDATA[
@font-face {
font-family: 'Miso';
font-style: normal;
font-weight: normal;
src: url('miso.eot'); /* IE 9 Compatibility Mode */
src: url('miso.eot?#iefix') format('embedded-opentype'), /* IE < 9 */
url('data:application/x-font-woff;charset=utf-8;base64, \
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 \
') format('woff'), /* Firefox >= 3.6, any other modern browser */
url('miso.ttf') format('truetype'), /* Safari, Android, iOS */
url('miso.svg#Miso') format('svg'); /* Chrome < 4, Legacy iOS */
}
.modbox-text {
line-height: 125%;
fill: #ffffff;
font-family: 'Miso';
font-size: 28px;
text-anchor: middle;
}
.modbox {
fill: #275a4b;
stroke: #3fa687;
stroke-linecap: round;
stroke-linejoin: round;
stroke-miterlimit: 4;
stroke-width: 3;
}
.outer-text {
line-height: 125%;
fill: #3fa687;
font-family: 'Miso';
font-size: 32px;
text-anchor: middle;
}
.outer-text-netapi {
line-height: 125%;
fill: #3fa687;
font-family: 'Miso';
font-size: 28px;
text-anchor: start;
}
.outer-stroke {
fill: none;
stroke: #3fa687;
stroke-linecap: round;
stroke-linejoin: miter;
stroke-miterlimit: 4;
stroke-width: 3;
}
#gnrc-detail-conn {
fill: none;
stroke: url(#outer-gradient-conn);
stroke-linecap: round;
stroke-linejoin: miter;
stroke-miterlimit: 4;
stroke-width: 3;
}
#gnrc-detail-netdev {
fill: none;
stroke: url(#outer-gradient-netdev);
stroke-linecap: round;
stroke-linejoin: miter;
stroke-miterlimit: 4;
stroke-width: 3;
}
.outer-stroke-dashed {
fill: none;
stroke: #3fa687;
stroke-dasharray: 9, 9;
stroke-linecap: round;
stroke-linejoin: miter;
stroke-miterlimit: 4;
stroke-width: 3;
}
.outer-stroke-dotted {
fill: none;
stroke: #3fa687;
stroke-dasharray: 1, 5;
stroke-linecap: round;
stroke-linejoin: miter;
stroke-miterlimit: 4;
stroke-width: 3;
}
.outer-stroke-arrow {
fill: none;
marker-start: url(#arrow-start);
marker-end: url(#arrow-end);
stroke: #3fa687;
stroke-linecap: round;
stroke-linejoin: miter;
stroke-miterlimit: 4;
stroke-width: 3;
}
.outer-arrow-head {
fill: #3fa687;
fill-rule: evenodd;
stroke: #3fa687;
stroke-width: 1pt;
}
]]>
</style>
<linearGradient id="outer-gradient-conn" x1="0%" y1="0%" x2="0%" y2="100%">
<stop style="stop-color: #3fa687; stop-opacity: 0;" offset="0" />
<stop style="stop-color: #3fa687; stop-opacity: 0;" offset="0.1" />
<stop style="stop-color: #3fa687; stop-opacity: 1;" offset="0.9" />
<stop style="stop-color: #3fa687; stop-opacity: 1;" offset="1" />
</linearGradient>
<linearGradient id="outer-gradient-netdev" x1="0%" y1="0%" x2="0%" y2="100%">
<stop style="stop-color: #3fa687; stop-opacity: 1;" offset="0" />
<stop style="stop-color: #3fa687; stop-opacity: 1;" offset="0.1" />
<stop style="stop-color: #3fa687; stop-opacity: 0;" offset="0.9" />
<stop style="stop-color: #3fa687; stop-opacity: 0;" offset="1" />
</linearGradient>
<marker style="overflow: visible" id="arrow-start" orient="auto">
<path class="outer-arrow-head" d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
transform="matrix(0.2,0,0,0.2,1.2,0)" />
</marker>
<marker style="overflow: visible" id="arrow-end" orient="auto">
<path class="outer-arrow-head" d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
</marker>
</defs>
<text id="os-overview-hardware-indep"
class="outer-text" x="125" y="189"><tspan>Hardware-independent</tspan></text>
<path id="hardware-divider" d="m 5,215 635,0" class="outer-stroke-dotted" />
<text id="os-overview-hardware-dep"
class="outer-text" x="125" y="259"><tspan>Hardware-dependent</tspan></text>
<g id="os-overview" transform="translate(255, 0)">
<path id="application-divider" d="m -5,70 390,0" class="outer-stroke-dashed" />
<text id="os-overview-application"
class="outer-text" x="190" y="43"><tspan>Application</tspan></text>
<path id="hardware-divider" d="m -5,360 390,0" class="outer-stroke-dashed" />
<text id="os-overview-hardware"
class="outer-text" x="190" y="399"><tspan>Hardware</tspan></text>
<g id="pkg">
<rect id="pkg-box" class="modbox" x="0" y="80" rx="4" ry="4" width="120" height="60" />
<text id="pkg-label" class="modbox-text" x="60" y="119"><tspan>pkg</tspan></text>
</g>
<g id="sys">
<rect id="sys-box" class="modbox" x="130" y="80" rx="4" ry="4" width="120" height="60" />
<text id="sys-label" class="modbox-text" x="190" y="119"><tspan>sys</tspan></text>
</g>
<g id="sys-net">
<rect id="sys-net-box" class="modbox" x="260" y="80" rx="4" ry="4" width="120" height="60" />
<text id="sys-net-label" class="modbox-text" x="320" y="119"><tspan>sys/net</tspan></text>
</g>
<g id="core">
<rect id="core-box" class="modbox" x="0" y="150" rx="4" ry="4" width="230" height="60" />
<text id="core-label" class="modbox-text" x="115" y="189"><tspan>core (kernel)</tspan></text>
</g>
<g id="core">
<rect id="core-box" class="modbox" x="240" y="150" rx="4" ry="4" width="140" height="60" />
<text id="core-label" class="modbox-text" x="310" y="189"><tspan>drivers</tspan></text>
</g>
<g id="periph">
<rect id="periph-box" class="modbox" x="0" y="220" rx="4" ry="4" width="380" height="60" />
<text id="periph-label"
class="modbox-text" x="190" y="259"><tspan>drivers/periph</tspan></text>
</g>
<g id="cpu">
<rect id="cpu-box" class="modbox" x="0" y="290" rx="4" ry="4" width="185" height="60" />
<text id="cpu-label" class="modbox-text" x="92.5" y="329"><tspan>cpu</tspan></text>
</g>
<g id="board">
<rect id="board-box" class="modbox" x="195" y="290" rx="4" ry="4" width="185" height="60" />
<text id="board-label" class="modbox-text" x="287.5" y="329"><tspan>boards</tspan></text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 40 KiB

52
doc/guides/index.md Normal file
View File

@ -0,0 +1,52 @@
---
title: RIOT in a nutshell
description: Welcome to the RIOT documentation
---
![Riot Logo](img/riot-logo-large.png "RIOT Logo")
### Welcome to the friendly Operating System for the Internet of Things.
RIOT is an open-source microcontroller operating system, designed to match
the requirements of Internet of Things (IoT) devices and other embedded
devices. These requirements include a very low memory footprint (on the order
of a few kilobytes), high energy efficiency, real-time capabilities, support
for a wide range of low-power hardware, communication stacks for wireless and
communication stacks for wired networks.
RIOT provides threading, multiple network stacks, and utilities which
include cryptographic libraries, data structures (bloom filters, hash tables,
priority queues), a shell and more. RIOT supports a wide range of
microcontroller architectures, radio drivers, sensors, and configurations for
entire platforms, e.g. Atmel SAM R21 Xplained Pro, Zolertia Z1, STM32 Discovery
Boards etc. (see the list of
[supported boards](https://www.riot-os.org/boards.html).
Across all supported hardware (32-bit, 16-bit, and 8-bit platforms), RIOT
provides a consistent API and enables C and C++ application programming,
with multithreading, IPC, system timers, mutexes etc.
A good high-level overview can be found in the article
[RIOT: An Open Source Operating System for Low-End Embedded Devices in
the IoT](https://www.riot-os.org/assets/pdfs/riot-ieeeiotjournal-2018.pdf)
(IEEE Internet of Things Journal, December 2018).
## Contribute to RIOT
RIOT is developed by an open community that anyone is welcome to join:
- Download and contribute your code on
[GitHub](https://github.com/RIOT-OS/RIOT). You can read about how to
contribute [in our contributing
document](https://github.com/RIOT-OS/RIOT/blob/master/CONTRIBUTING.md).
- Sign-up to our [forum](https://forum.riot-os.org/) to ask for help using RIOT
or writing an application for RIOT, discuss kernel and network stack
development as well as hardware support, or to show-case your latest project.
- Follow us on [Mastodon][mastodon-link] for news from the RIOT
community.
- Regarding critical vulnerabilities we would appreciate if you give us a
90-days head-start by reporting to security@riot-os.org, before making your
information publicly available
- Contact us on Matrix for live support and discussions:
[riot-os:matrix.org](https://matrix.to/#/#riot-os:matrix.org)
[mastodon-link]: https://fosstodon.org/@RIOT_OS

View File

@ -1,3 +1,8 @@
---
title: Managing a Release
description: This page describes the process of managing a release.
---
# Contents
1. [Checklist](https://github.com/RIOT-OS/RIOT/wiki/Managing-a-Release#1-checklist)

View File

@ -0,0 +1,181 @@
---
title: Creating Guides & How Starlight Works
description: Explanation on how the starlight "build system works and how to create guides
code_folder: examples/basic/hello-world/
---
## What is Starlight?
[Starlight](https://starlight.astro.build/) is a documentation site generator built on top of [Astro](https://astro.build/), a popular modern web framework, by the Astro team itself.
Starlight is designed to be fast, flexible, and easy to use, making it a great choice for creating documentation sites. It supports Markdown and MDX, allowing you to write content in a familiar format while also enabling extensive access to the entire modern web ecosystem if needed.
For RIOT Starlight is meant to exclusively host guides while the API documentation is generated by Doxygen and hosted on the [RIOT API documentation](https://doc.riot-os.org/) site.
Where Doxygen has a very automated approach to generating documentation, Starlight is meant to be more flexible and allow for a more human touch that is needed for tutorials and guides,
which means that we both have the control over the content and layout but at the same time have to put more active effort into the UX of the documentation itself. At the same time writing guides in Markdown allows us to keep the guides readable in the repository itself, which is a big plus.
## How to run the site locally
To run the site locally, you need to have [Node.js](https://nodejs.org/) installed.
It is highly recommended to use a version manager such as [NVM](https://github.com/nvm-sh/nvm) to manage your Node.js versions.
Please make sure to use a fairly recent version of Node.js, some distributions (such as Ubuntu) ship with a very old version of Node.js that is not compatible with Starlight.
Generally, the latest LTS version should work fine (As of writing v22), as specified in the [Astro documentation](https://docs.astro.build/en/install-and-setup/#prerequisites).
Once installed you should be able to install the dependencies and run the site locally with the following command, making sure to be within the root of the repository:
```bash title="Running the site locally (within the root of the repository)"
make doc-starlight
```
This will start a local development server and open the site in your default web browser. The resulting output should look like this:
```bash title="Output of running the site locally"
(3.12.8) [user@computer RIOT]$ make doc-starlight
Installing starlight...
Starlight installed successfully.
Starting starlight live server...
> guide@0.0.1 dev
> astro dev
13:32:10 [types] Generated 0ms
13:32:10 [content] Syncing content
13:32:10 [content] Synced content
astro v5.6.1 ready in 1490 ms
┃ Local http://localhost:4321/
┃ Network use --host to expose
13:32:10 watching for file changes...
```
You can then browse the site at the URL shown in the output, which is usually `http://localhost:4321/`.
One big advantage of Starlight is that it supports hot reloading, which means that any changes you make to the content will be reflected in the browser immediately without needing to refresh the page. This makes it easy to see how your changes affect the site in real-time.
You can also use the `make build` command within the `doc/starlight` folder to build the site for production. This will create a static version of the site in the `dist` directory, which can be deployed to any static file hosting service.
```bash title="Building the site for production"
cd doc/starlight && make build
```
### Folder Structure
Generally, there are two folders that are important for the guides:
- `doc/guides/`: This folder contains the actual guides. Each guide is a Markdown file with a specific structure that Starlight uses to generate the navigation and other metadata for the guide.
- `doc/starlight/`: This folder contains the Starlight configuration files. The most important file is `astro.config.mjs`, which contains the configuration for the site, including the navigation structure and other settings.
We will go into more detail about how to create a new guide in the next section, but for now, it is important to understand that the guides are located in the `doc/guides/` folder and the configuration files are located in the `doc/starlight/` folder.
## How to create a new guide
Now that we understand how to run the site locally, let's look at how to create a new guide.
The first step is to create a Markdown file within `doc/guides/` with the following structure:
```markdown title="doc/guides/test/hello_world.md"
---
title: My New Guide
description: This is a description of my new guide
---
Hello World!
```
Starlight uses the frontmatter of the Markdown file to generate the navigation and other metadata for the guide. On Github this will appear as a small table at the top of the file so your guide will still be readable in the repository.
Now you can add content to the guide using Markdown. Starlight supports all the standard Markdown features, including headings, lists, links, images, and code blocks. You can also use MDX to embed JavaScript, Components, and other features directly into your Markdown files. This allows you to create interactive components and dynamic content within your guides.
You can see a full list of the supported features in the [Starlight documentation](https://starlight.astro.build/guides/authoring-content/).
:::danger[Keep it simple]
Please always keep in mind that the more non-standard Markdown you write, the more it will worsen the readability of the guide in the repository itself.
If you are targeting an experienced audience, a lot of them will be reading the guides locally within their IDE and not in a browser.
:::
### Placing the guide
One last manual step is to add the new guide to the navigation. This is done in the `doc/starlight/astro.config.mjs` file.
Compared to the Doxygen output we want to be extremely careful about the navigation and only show the guides that are relevant to the user and in a logical order that does not overwhelm the user with too many options at once.
Generally, the less information you declare within the config the better, given that ideally your frontmatter information is enough to generate the navigation.
You can either add your guide to an existing section or create a new section. In the event that you want to simply append your guide to an existing section, you can simply add the file name to the list of files in the section. The root of the so called `slug` of your file is the guides folder itself, so a guide under `doc/guides/test/hello_world.md` will have the slug `test/hello_world.md`.
:::note
There is one exception to this rule, if your file is called index.md, the slug will be the name of the folder it is in. For example `doc/guides/test/index.md` will have the slug `test`.
:::
### Creating a new section
Generally, we want to avoid creating new sections unless absolutely necessary. For example, if you create a totally new tutorial that spans multiple files, it might make sense to create a new section.
In this case, you can create a new section by adding a new entry to the `sidebar` array in the `astro.config.mjs` file. The entry should look like this:
```javascript title="doc/starlight/astro.config.mjs"
sidebar: [
{
label: "The Best Tutorial",
items: [
"tutorial/best_tutorial",
],
},
],
```
:::tip
Sections can also be nested, so you can create a section within a section by adding another array to the `items` array. This is useful for organizing your guides into sub-sections.
:::
### Code Block Testing
If you are writing a guide that includes code blocks it is important to test them to make sure they work as expected.
To facilitate this, we have a small script that runs over the code blocks in the guide and compares them to a specified example folder.
You can also utilize this script to test your code blocks locally before pushing them to the repository. To do this, you need to run the following command:
```bash title="Running the code block testing script"
./dist/tools/code_in_guides_check/check_for_code.sh
```
For example, let's say that we have a tutorial that explains the hello world example.
This example is located in `examples/basic/hello-world/` and the guide is located in `doc/guides/test/hello_world.md`.
First we have to tell the script where to find the example folder. This is done by adding the `code_folder` key to the frontmatter of the guide. The value should be the path to the example folder relative to the root of the repository.
```markdown title="Example guide with code_folder"
---
title: Tutorial Hello World
description: This is a description of my new guide
code_folder: examples/basic/hello-world/
---
```
Then we can add the code blocks to the guide. The script will automatically detect the code blocks and run them against the example folder.
````markdown title="This code block will be tested against the hello world example"
```c
int main(void)
{
puts("Hello World!");
```
````
In the case that you want to skip the code block testing, you can add the `<!--skip ci-->` comment one line above the code block. The script will ignore this code block and not run it against the example folder.
````markdown title="This code block will be ignored by the script"
<!--skip ci-->
```c
int not_main(void)
{
puts("Goodbye World!");
```
````
:::note
The script will only run the code blocks that are in C, it will ignore any other code blocks written in other languages.
:::

View File

@ -1,3 +1,8 @@
---
title: Getting Started with RIOT on Windows
description: This guide will help you to set up RIOT on Windows using WSL
---
# Getting Started on Windows
> [!NOTE]

View File

@ -0,0 +1,42 @@
---
title: Test Code Block CI
description: Test Code Block CI
code_folder: examples/basic/hello-world/
---
# Test Code Block CI
```c
int main(void)
{
puts("Hello World!");
```
# Skip CI
<!--skip ci-->
```c
int not_main(void)
{
puts("Goodbye World!");
```
# Non C Code
```bash
cowsay "Hello World!"
```
# Non C Code with Skip CI
<!--skip ci-->
```bash
cowsay "Goodbye World!"
```
# Second C Code Block
```c
printf("You are running RIOT on a(n) %s board.\n", RIOT_BOARD);
printf("This board features a(n) %s CPU.\n", RIOT_CPU);
```

21
doc/starlight/.gitignore vendored Normal file
View File

@ -0,0 +1,21 @@
# build output
dist/
# generated types
.astro/
# dependencies
node_modules/
# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# environment variables
.env
.env.production
# macOS-specific files
.DS_Store

4
doc/starlight/.vscode/extensions.json vendored Normal file
View File

@ -0,0 +1,4 @@
{
"recommendations": ["astro-build.astro-vscode"],
"unwantedRecommendations": []
}

11
doc/starlight/.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,11 @@
{
"version": "0.2.0",
"configurations": [
{
"command": "./node_modules/.bin/astro dev",
"name": "Development server",
"request": "launch",
"type": "node-terminal"
}
]
}

22
doc/starlight/Makefile Normal file
View File

@ -0,0 +1,22 @@
RIOTBASE ?= $(shell git rev-parse --show-toplevel)
RIOTMAKE ?= $(RIOTBASE)/makefiles
RIOTTOOLS ?= $(RIOTBASE)/dist/tools
.PHONY: install
install:
@echo "Installing starlight..."
@npm install --prefix $(CURDIR) --prefer-offline
@echo "Starlight installed successfully."
.PHONY: build
build: install
@npm run build --prefix $(CURDIR)
@echo "RIOT documentation successfully generated at file://$(RIOTBASE)/doc/starlight/dist/index.html"
.PHONY: dev
dev: install
@echo "Starting starlight live server..."
@npm run dev --prefix $(CURDIR)
clean:
-@rm -rf node_modules .astro dist

View File

@ -0,0 +1,76 @@
// @ts-check
import { defineConfig } from "astro/config";
import starlight from "@astrojs/starlight";
// https://astro.build/config
export default defineConfig({
site: "https://guide.riot-os.org",
integrations: [
starlight({
title: "Riot Documentation",
social: [
{
icon: "github",
label: "GitHub",
href: "https://github.com/riot-os/riot",
},
{
icon: "mastodon",
label: "Mastodon",
href: "https://fosstodon.org/@RIOT_OS",
},
{
icon: "matrix",
label: "Matrix",
href: "https://matrix.to/#/#riot-os:matrix.org",
},
],
sidebar: [
{
label: "External Documentation",
items: [
{
label: "API Documentation",
link: "https://doc.riot-os.org",
badge: { text: "Doxygen", variant: "tip" },
},
{
label: "Rust Documentation",
link: "https://doc.riot-os.org/rustdoc/latest/riot_doc_helpers/",
badge: { text: "Rustdoc", variant: "tip" },
},
],
},
{
label: "RIOT in a Nutshell",
items: [
{ label: "Introduction", slug: "index" },
"general/structure",
],
},
{
label: "Build System",
items: [
"build-system/build_system",
"build-system/build_system_basics",
"build-system/build-in-docker",
"build-system/advanced_build_system_tricks",
],
},
{
label: "Miscellaneous",
items: ["misc/how_to_doc"],
},
],
customCss: [],
logo: {
src: "./src/assets/riot-logo.svg",
replacesTitle: true,
},
plugins: [],
editLink: {
baseUrl: "https://github.com/RIOT-OS/RIOT/tree/master/doc/guides",
},
}),
],
});

6660
doc/starlight/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,17 @@
{
"name": "guide",
"type": "module",
"version": "0.0.1",
"scripts": {
"dev": "astro dev",
"start": "astro dev",
"build": "astro build",
"preview": "astro preview",
"astro": "astro"
},
"dependencies": {
"@astrojs/starlight": "^0.33.1",
"astro": "^5.5.3",
"sharp": "^0.32.5"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg3004"
version="1.1"
inkscape:version="0.91 r13725"
width="54.691921"
height="54.691921"
xml:space="preserve"
sodipodi:docname="favicon.svg"><metadata
id="metadata3010"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs3008"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3018"><path
d="M 0,600 600,600 600,0 0,0 0,600 Z"
id="path3020"
inkscape:connector-curvature="0" /></clipPath></defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1678"
inkscape:window-height="1029"
id="namedview3006"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="8.9386664"
inkscape:cx="39.337153"
inkscape:cy="13.422083"
inkscape:window-x="1920"
inkscape:window-y="27"
inkscape:window-maximized="0"
inkscape:current-layer="g3012" /><g
id="g3012"
inkscape:groupmode="layer"
inkscape:label="Logo"
transform="matrix(1.25,0,0,-1.25,-310.18681,421.9234)"><g
id="g3014"
transform="matrix(0.20267583,0,0,0.20267583,230.15405,251.68491)"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:export-filename="/home/oleg/git/RIOT/doc/doxygen/src/riot-logo.png"><g
id="g3016"
clip-path="url(#clipPath3018)"><g
id="g3022"
transform="translate(304.752,236.6328)" /><g
id="g3026"
transform="translate(359.3184,306.5493)" /><g
id="g3030"
transform="translate(458.877,331.4756)" /><g
id="g3034"
transform="translate(304.752,236.6328)" /><g
id="g3038"
transform="translate(359.3184,306.5493)" /><g
id="g3042"
transform="translate(458.877,331.4756)" /><g
id="g3046"
transform="translate(254.7153,234.0664)"><path
d="m 0,0 -22.582,42.81 c -2.415,4.578 -0.661,10.247 3.917,12.662 4.381,2.31 9.777,0.777 12.348,-3.368 L 19.102,10.914 C 22.293,5.741 20.688,-1.04 15.515,-4.231 10.342,-7.424 3.561,-5.818 0.369,-0.646 0.243,-0.441 0.111,-0.209 0,0"
style="fill:#be353c;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3048"
inkscape:connector-curvature="0" /></g><g
id="g3050"
transform="translate(226.0498,329.0859)"><path
d="m 0,0 c 0,0 0.409,0.107 1.2,0.315 0.147,0.042 0.312,0.088 0.495,0.139 0.211,0.064 0.443,0.133 0.694,0.209 0.504,0.156 1.09,0.348 1.755,0.578 2.644,0.939 6.628,2.567 11.243,5.425 4.567,2.839 9.85,6.956 13.865,12.546 4.01,5.6 6.417,12.409 5.113,20.32 -0.303,1.98 -0.86,4.03 -1.613,6.125 -0.085,0.262 -0.2,0.524 -0.299,0.787 l -0.154,0.395 -0.076,0.199 c 0.159,-0.341 -0.411,0.903 0.347,-0.74 l -0.062,0.121 -0.495,0.965 -0.249,0.485 -0.123,0.239 -0.092,0.154 c -0.26,0.422 -0.433,0.794 -0.748,1.276 -0.297,0.464 -0.578,0.95 -0.9,1.388 -2.474,3.637 -5.601,6.492 -9.327,8.243 -3.716,1.754 -8.159,2.413 -12.918,1.777 -4.745,-0.615 -9.708,-2.563 -14.111,-5.536 -4.412,-2.965 -8.258,-6.983 -10.858,-11.573 -1.318,-2.287 -2.291,-4.721 -2.946,-7.212 -0.316,-1.249 -0.538,-2.514 -0.681,-3.79 -0.076,-0.637 -0.111,-1.278 -0.142,-1.921 l -0.055,-2.586 c -0.059,-1.836 0.005,-3.515 0.005,-5.279 0.014,-1.746 0.028,-3.495 0.042,-5.246 -0.01,-3.462 0.132,-7.105 0.243,-10.72 0.113,-3.618 0.225,-7.243 0.338,-10.871 0.121,-3.629 0.196,-7.254 0.408,-10.905 0.365,-7.29 0.729,-14.58 1.093,-21.842 0.181,-3.631 0.362,-7.255 0.543,-10.868 l 0.135,-2.708 0.096,-3.002 -0.013,-3.282 c -0.046,-1.043 -0.077,-2.08 -0.143,-3.123 -0.548,-8.322 -2.527,-16.92 -6.72,-24.735 -2.104,-3.885 -4.713,-7.55 -7.812,-10.744 -3.081,-3.207 -6.62,-5.949 -10.406,-8.117 -7.589,-4.365 -16.066,-6.424 -24.257,-6.492 -8.207,-0.069 -16.232,1.801 -23.332,5.443 -7.094,3.615 -13.227,9.161 -17.295,15.809 -1.003,1.664 -1.913,3.368 -2.666,5.117 -0.202,0.432 -0.372,0.874 -0.544,1.315 l -0.554,1.446 c -0.232,0.684 -0.464,1.364 -0.695,2.041 -0.261,0.843 -0.538,1.839 -0.789,2.748 -0.251,0.925 -0.395,1.719 -0.59,2.58 -0.2,0.841 -0.304,1.687 -0.447,2.526 -0.149,0.839 -0.24,1.676 -0.323,2.508 -1.382,13.357 2.091,25.477 7.548,34.735 2.702,4.665 5.965,8.607 9.338,11.851 3.38,3.248 6.894,5.778 10.222,7.734 1.657,1 3.294,1.795 4.833,2.548 0.776,0.354 1.542,0.665 2.276,0.979 0.732,0.322 1.449,0.603 2.148,0.839 1.392,0.505 2.684,0.955 3.885,1.276 1.196,0.356 2.285,0.658 3.268,0.861 0.982,0.217 1.848,0.434 2.598,0.569 0.751,0.127 1.383,0.233 1.891,0.319 1.018,0.169 1.543,0.255 1.543,0.255 5.101,0.843 9.919,-2.609 10.762,-7.71 0.834,-5.051 -2.543,-9.825 -7.562,-10.735 l -0.546,-0.099 c 0,0 -0.378,-0.068 -1.111,-0.201 -0.366,-0.064 -0.821,-0.144 -1.362,-0.239 -0.538,-0.1 -1.143,-0.269 -1.838,-0.426 -0.702,-0.144 -1.457,-0.369 -2.284,-0.626 -0.842,-0.224 -1.721,-0.551 -2.669,-0.904 -0.483,-0.161 -0.967,-0.358 -1.456,-0.584 -0.494,-0.217 -1.004,-0.441 -1.531,-0.672 -1.018,-0.523 -2.114,-1.053 -3.196,-1.73 -4.349,-2.617 -9.13,-6.734 -12.658,-12.928 -0.914,-1.52 -1.66,-3.208 -2.385,-4.955 -0.688,-1.767 -1.252,-3.64 -1.716,-5.59 -0.851,-3.911 -1.2,-8.173 -0.681,-12.449 0.057,-0.535 0.115,-1.072 0.221,-1.601 0.102,-0.527 0.157,-1.073 0.298,-1.592 0.126,-0.506 0.234,-1.103 0.365,-1.541 0.128,-0.451 0.257,-0.904 0.386,-1.358 0.237,-0.675 0.475,-1.352 0.715,-2.033 0.027,-0.079 -0.068,0.193 -0.011,0.038 l 0.036,-0.087 0.072,-0.175 0.141,-0.35 c 0.092,-0.235 0.181,-0.472 0.296,-0.697 0.404,-0.925 0.901,-1.809 1.43,-2.682 2.172,-3.447 5.452,-6.436 9.604,-8.509 4.133,-2.077 9.085,-3.211 14.11,-3.109 5.023,0.089 10.09,1.42 14.408,3.969 4.332,2.541 7.891,6.288 10.36,10.993 2.468,4.708 3.827,10.369 4.166,16.428 l 0.083,2.291 -0.005,2.148 -0.094,2.432 -0.161,2.731 c -0.214,3.644 -0.429,7.299 -0.644,10.961 -0.43,7.325 -0.862,14.678 -1.294,22.031 -0.246,3.669 -0.356,7.375 -0.511,11.066 -0.147,3.692 -0.294,7.381 -0.441,11.063 -0.144,3.684 -0.32,7.325 -0.346,11.132 -0.03,1.882 -0.06,3.762 -0.09,5.638 -0.016,1.858 -0.091,3.796 -0.048,5.568 l 0.039,2.821 c 0.045,1.157 0.112,2.311 0.239,3.46 0.245,2.296 0.642,4.57 1.198,6.792 1.133,4.434 2.841,8.66 5.035,12.515 4.373,7.741 10.468,14.066 17.43,18.803 6.971,4.726 14.882,7.962 23.265,9.114 4.183,0.567 8.475,0.632 12.712,0.036 4.235,-0.567 8.401,-1.789 12.247,-3.573 7.742,-3.572 13.875,-9.412 18.058,-15.548 0.548,-0.763 1.025,-1.545 1.516,-2.321 0.486,-0.751 0.987,-1.682 1.464,-2.515 l 0.179,-0.321 0.127,-0.245 0.251,-0.483 0.499,-0.964 0.062,-0.12 c 0.8,-1.722 0.257,-0.565 0.45,-0.989 l 0.122,-0.304 0.24,-0.609 c 0.157,-0.409 0.325,-0.807 0.468,-1.222 1.198,-3.281 2.136,-6.669 2.688,-10.124 C 56.985,36.11 56.575,29.015 54.83,22.748 53.109,16.457 50.242,11.023 47.056,6.545 43.857,2.05 40.356,-1.578 36.93,-4.58 c -3.433,-3.003 -6.801,-5.399 -9.945,-7.367 -6.294,-3.925 -11.697,-6.166 -15.513,-7.536 -0.957,-0.337 -1.814,-0.621 -2.561,-0.854 -0.375,-0.115 -0.722,-0.22 -1.037,-0.316 -0.348,-0.098 -0.661,-0.187 -0.941,-0.266 -0.925,-0.248 -1.403,-0.375 -1.403,-0.375 -5.87,-1.566 -11.898,1.923 -13.464,7.793 -1.566,5.87 1.923,11.897 7.793,13.464 l 0.037,0.01 L 0,0 Z"
style="fill:#be353c;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3052"
inkscape:connector-curvature="0" /></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

@ -0,0 +1,109 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg3004"
version="1.1"
inkscape:version="0.48.5 r10040"
width="101"
height="54.691921"
xml:space="preserve"
sodipodi:docname="riot-logo.svg"><metadata
id="metadata3010"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs3008"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3018"><path
d="M 0,600 600,600 600,0 0,0 0,600 z"
id="path3020"
inkscape:connector-curvature="0" /></clipPath></defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1678"
inkscape:window-height="1029"
id="namedview3006"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="1.1173333"
inkscape:cx="-144.61402"
inkscape:cy="7.7685189"
inkscape:window-x="1920"
inkscape:window-y="19"
inkscape:window-maximized="0"
inkscape:current-layer="g3012" /><g
id="g3012"
inkscape:groupmode="layer"
inkscape:label="Logo"
transform="matrix(1.25,0,0,-1.25,-310.18681,421.9234)"><g
id="g3014"
transform="matrix(0.20267583,0,0,0.20267583,230.06745,251.68491)"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:export-filename="/home/oleg/git/RIOT/doc/doxygen/src/riot-logo.png"><g
id="g3016"
clip-path="url(#clipPath3018)"><g
id="g3022"
transform="translate(304.752,236.6328)"><path
d="m 0,0 0,88.155 c 0,3.952 3.344,7.296 7.295,7.296 4.104,0 7.297,-3.344 7.297,-7.296 L 14.592,0 c 0,-4.104 -3.193,-7.297 -7.297,-7.297 C 3.344,-7.297 0,-4.104 0,0"
style="fill:#4da98c;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3024"
inkscape:connector-curvature="0" /></g><g
id="g3026"
transform="translate(359.3184,306.5493)"><path
d="m 0,0 0,-51.678 c 0,-6.08 4.863,-10.944 10.943,-10.944 6.08,0 10.944,4.864 10.944,10.944 l 0,51.678 c 0,6.079 -4.864,10.943 -10.944,10.943 C 4.863,10.943 0,6.079 0,0 m -14.592,-51.678 0,51.678 c 0,14.135 11.401,25.534 25.535,25.534 14.136,0 25.536,-11.399 25.536,-25.534 l 0,-51.678 c 0,-14.135 -11.4,-25.535 -25.536,-25.535 -14.134,0 -25.535,11.4 -25.535,25.535"
style="fill:#4da98c;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3028"
inkscape:connector-curvature="0" /></g><g
id="g3030"
transform="translate(458.877,331.4756)"><path
d="m 0,0 c 4.104,0 7.296,-3.344 7.296,-7.295 0,-4.104 -3.192,-7.296 -7.296,-7.296 l -12.463,0 0,-80.252 c 0,-4.103 -3.192,-7.297 -7.297,-7.297 -3.951,0 -7.295,3.194 -7.295,7.297 l 0,80.252 -12.463,0 c -3.952,0 -7.296,3.192 -7.296,7.296 0,3.951 3.344,7.295 7.296,7.295 L 0,0 z"
style="fill:#4da98c;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3032"
inkscape:connector-curvature="0" /></g><g
id="g3034"
transform="translate(304.752,236.6328)"><path
d="m 0,0 0,88.155 c 0,3.952 3.344,7.296 7.295,7.296 4.104,0 7.297,-3.344 7.297,-7.296 L 14.592,0 c 0,-4.104 -3.193,-7.297 -7.297,-7.297 C 3.344,-7.297 0,-4.104 0,0"
style="fill:#4da98c;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3036"
inkscape:connector-curvature="0" /></g><g
id="g3038"
transform="translate(359.3184,306.5493)"><path
d="m 0,0 0,-51.678 c 0,-6.08 4.863,-10.944 10.943,-10.944 6.08,0 10.944,4.864 10.944,10.944 l 0,51.678 c 0,6.079 -4.864,10.943 -10.944,10.943 C 4.863,10.943 0,6.079 0,0 m -14.592,-51.678 0,51.678 c 0,14.135 11.401,25.534 25.535,25.534 14.136,0 25.536,-11.399 25.536,-25.534 l 0,-51.678 c 0,-14.135 -11.4,-25.535 -25.536,-25.535 -14.134,0 -25.535,11.4 -25.535,25.535"
style="fill:#4da98c;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3040"
inkscape:connector-curvature="0" /></g><g
id="g3042"
transform="translate(458.877,331.4756)"><path
d="m 0,0 c 4.104,0 7.296,-3.344 7.296,-7.295 0,-4.104 -3.192,-7.296 -7.296,-7.296 l -12.463,0 0,-80.252 c 0,-4.103 -3.192,-7.297 -7.297,-7.297 -3.951,0 -7.295,3.194 -7.295,7.297 l 0,80.252 -12.463,0 c -3.952,0 -7.296,3.192 -7.296,7.296 0,3.951 3.344,7.295 7.296,7.295 L 0,0 z"
style="fill:#4da98c;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3044"
inkscape:connector-curvature="0" /></g><g
id="g3046"
transform="translate(254.7153,234.0664)"><path
d="m 0,0 -22.582,42.81 c -2.415,4.578 -0.661,10.247 3.917,12.662 4.381,2.31 9.777,0.777 12.348,-3.368 L 19.102,10.914 C 22.293,5.741 20.688,-1.04 15.515,-4.231 10.342,-7.424 3.561,-5.818 0.369,-0.646 0.243,-0.441 0.111,-0.209 0,0"
style="fill:#be353c;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3048"
inkscape:connector-curvature="0" /></g><g
id="g3050"
transform="translate(226.0498,329.0859)"><path
d="m 0,0 c 0,0 0.409,0.107 1.2,0.315 0.147,0.042 0.312,0.088 0.495,0.139 0.211,0.064 0.443,0.133 0.694,0.209 0.504,0.156 1.09,0.348 1.755,0.578 2.644,0.939 6.628,2.567 11.243,5.425 4.567,2.839 9.85,6.956 13.865,12.546 4.01,5.6 6.417,12.409 5.113,20.32 -0.303,1.98 -0.86,4.03 -1.613,6.125 -0.085,0.262 -0.2,0.524 -0.299,0.787 l -0.154,0.395 -0.076,0.199 c 0.159,-0.341 -0.411,0.903 0.347,-0.74 l -0.062,0.121 -0.495,0.965 -0.249,0.485 -0.123,0.239 -0.092,0.154 c -0.26,0.422 -0.433,0.794 -0.748,1.276 -0.297,0.464 -0.578,0.95 -0.9,1.388 -2.474,3.637 -5.601,6.492 -9.327,8.243 -3.716,1.754 -8.159,2.413 -12.918,1.777 -4.745,-0.615 -9.708,-2.563 -14.111,-5.536 -4.412,-2.965 -8.258,-6.983 -10.858,-11.573 -1.318,-2.287 -2.291,-4.721 -2.946,-7.212 -0.316,-1.249 -0.538,-2.514 -0.681,-3.79 -0.076,-0.637 -0.111,-1.278 -0.142,-1.921 l -0.055,-2.586 c -0.059,-1.836 0.005,-3.515 0.005,-5.279 0.014,-1.746 0.028,-3.495 0.042,-5.246 -0.01,-3.462 0.132,-7.105 0.243,-10.72 0.113,-3.618 0.225,-7.243 0.338,-10.871 0.121,-3.629 0.196,-7.254 0.408,-10.905 0.365,-7.29 0.729,-14.58 1.093,-21.842 0.181,-3.631 0.362,-7.255 0.543,-10.868 l 0.135,-2.708 0.096,-3.002 -0.013,-3.282 c -0.046,-1.043 -0.077,-2.08 -0.143,-3.123 -0.548,-8.322 -2.527,-16.92 -6.72,-24.735 -2.104,-3.885 -4.713,-7.55 -7.812,-10.744 -3.081,-3.207 -6.62,-5.949 -10.406,-8.117 -7.589,-4.365 -16.066,-6.424 -24.257,-6.492 -8.207,-0.069 -16.232,1.801 -23.332,5.443 -7.094,3.615 -13.227,9.161 -17.295,15.809 -1.003,1.664 -1.913,3.368 -2.666,5.117 -0.202,0.432 -0.372,0.874 -0.544,1.315 l -0.554,1.446 c -0.232,0.684 -0.464,1.364 -0.695,2.041 -0.261,0.843 -0.538,1.839 -0.789,2.748 -0.251,0.925 -0.395,1.719 -0.59,2.58 -0.2,0.841 -0.304,1.687 -0.447,2.526 -0.149,0.839 -0.24,1.676 -0.323,2.508 -1.382,13.357 2.091,25.477 7.548,34.735 2.702,4.665 5.965,8.607 9.338,11.851 3.38,3.248 6.894,5.778 10.222,7.734 1.657,1 3.294,1.795 4.833,2.548 0.776,0.354 1.542,0.665 2.276,0.979 0.732,0.322 1.449,0.603 2.148,0.839 1.392,0.505 2.684,0.955 3.885,1.276 1.196,0.356 2.285,0.658 3.268,0.861 0.982,0.217 1.848,0.434 2.598,0.569 0.751,0.127 1.383,0.233 1.891,0.319 1.018,0.169 1.543,0.255 1.543,0.255 5.101,0.843 9.919,-2.609 10.762,-7.71 0.834,-5.051 -2.543,-9.825 -7.562,-10.735 l -0.546,-0.099 c 0,0 -0.378,-0.068 -1.111,-0.201 -0.366,-0.064 -0.821,-0.144 -1.362,-0.239 -0.538,-0.1 -1.143,-0.269 -1.838,-0.426 -0.702,-0.144 -1.457,-0.369 -2.284,-0.626 -0.842,-0.224 -1.721,-0.551 -2.669,-0.904 -0.483,-0.161 -0.967,-0.358 -1.456,-0.584 -0.494,-0.217 -1.004,-0.441 -1.531,-0.672 -1.018,-0.523 -2.114,-1.053 -3.196,-1.73 -4.349,-2.617 -9.13,-6.734 -12.658,-12.928 -0.914,-1.52 -1.66,-3.208 -2.385,-4.955 -0.688,-1.767 -1.252,-3.64 -1.716,-5.59 -0.851,-3.911 -1.2,-8.173 -0.681,-12.449 0.057,-0.535 0.115,-1.072 0.221,-1.601 0.102,-0.527 0.157,-1.073 0.298,-1.592 0.126,-0.506 0.234,-1.103 0.365,-1.541 0.128,-0.451 0.257,-0.904 0.386,-1.358 0.237,-0.675 0.475,-1.352 0.715,-2.033 0.027,-0.079 -0.068,0.193 -0.011,0.038 l 0.036,-0.087 0.072,-0.175 0.141,-0.35 c 0.092,-0.235 0.181,-0.472 0.296,-0.697 0.404,-0.925 0.901,-1.809 1.43,-2.682 2.172,-3.447 5.452,-6.436 9.604,-8.509 4.133,-2.077 9.085,-3.211 14.11,-3.109 5.023,0.089 10.09,1.42 14.408,3.969 4.332,2.541 7.891,6.288 10.36,10.993 2.468,4.708 3.827,10.369 4.166,16.428 l 0.083,2.291 -0.005,2.148 -0.094,2.432 -0.161,2.731 c -0.214,3.644 -0.429,7.299 -0.644,10.961 -0.43,7.325 -0.862,14.678 -1.294,22.031 -0.246,3.669 -0.356,7.375 -0.511,11.066 -0.147,3.692 -0.294,7.381 -0.441,11.063 -0.144,3.684 -0.32,7.325 -0.346,11.132 -0.03,1.882 -0.06,3.762 -0.09,5.638 -0.016,1.858 -0.091,3.796 -0.048,5.568 l 0.039,2.821 c 0.045,1.157 0.112,2.311 0.239,3.46 0.245,2.296 0.642,4.57 1.198,6.792 1.133,4.434 2.841,8.66 5.035,12.515 4.373,7.741 10.468,14.066 17.43,18.803 6.971,4.726 14.882,7.962 23.265,9.114 4.183,0.567 8.475,0.632 12.712,0.036 4.235,-0.567 8.401,-1.789 12.247,-3.573 7.742,-3.572 13.875,-9.412 18.058,-15.548 0.548,-0.763 1.025,-1.545 1.516,-2.321 0.486,-0.751 0.987,-1.682 1.464,-2.515 l 0.179,-0.321 0.127,-0.245 0.251,-0.483 0.499,-0.964 0.062,-0.12 c 0.8,-1.722 0.257,-0.565 0.45,-0.989 l 0.122,-0.304 0.24,-0.609 c 0.157,-0.409 0.325,-0.807 0.468,-1.222 1.198,-3.281 2.136,-6.669 2.688,-10.124 C 56.985,36.11 56.575,29.015 54.83,22.748 53.109,16.457 50.242,11.023 47.056,6.545 43.857,2.05 40.356,-1.578 36.93,-4.58 c -3.433,-3.003 -6.801,-5.399 -9.945,-7.367 -6.294,-3.925 -11.697,-6.166 -15.513,-7.536 -0.957,-0.337 -1.814,-0.621 -2.561,-0.854 -0.375,-0.115 -0.722,-0.22 -1.037,-0.316 -0.348,-0.098 -0.661,-0.187 -0.941,-0.266 -0.925,-0.248 -1.403,-0.375 -1.403,-0.375 -5.87,-1.566 -11.898,1.923 -13.464,7.793 -1.566,5.87 1.923,11.897 7.793,13.464 l 0.037,0.01 L 0,0 z"
style="fill:#be353c;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3052"
inkscape:connector-curvature="0" /></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,10 @@
import { defineCollection } from "astro:content";
import { glob } from "astro/loaders";
import { docsSchema } from "@astrojs/starlight/schema";
export const collections = {
docs: defineCollection({
loader: glob({ pattern: "**/*.(md|mdx)", base: "../guides" }),
schema: docsSchema(),
}),
};

View File

@ -0,0 +1,5 @@
{
"extends": "astro/tsconfigs/strict",
"include": [".astro/types.d.ts", "**/*"],
"exclude": ["dist"]
}