--- 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)