// -*- mode:doc; -*-
// vim: set syntax=asciidoc:

== Buildroot quick start

*Important*: you can and should *build everything as a normal user*. There
is no need to be root to configure and use Buildroot. By running all
commands as a regular user, you protect your system against packages
behaving badly during compilation and installation.

The first step when using Buildroot is to create a configuration.
Buildroot has a nice configuration tool similar to the one you can
find in the http://www.kernel.org/[Linux kernel] or in
http://www.busybox.net/[BusyBox].

From the buildroot directory, run

--------------------
 $ make menuconfig
--------------------

for the original curses-based configurator, or

--------------------
 $ make nconfig
--------------------

for the new curses-based configurator, or

--------------------
 $ make xconfig
--------------------

for the Qt-based configurator, or

--------------------
 $ make gconfig
--------------------

for the GTK-based configurator.

All of these "make" commands will need to build a configuration
utility (including the interface), so you may need to install
"development" packages for relevant libraries used by the
configuration utilities. Refer to xref:requirement[] for more details,
specifically the xref:requirement-optional[optional requirements]
to get the dependencies of your favorite interface.

For each menu entry in the configuration tool, you can find associated
help that describes the purpose of the entry. Refer to xref:configure[]
for details on some specific configuration aspects.

Once everything is configured, the configuration tool generates a
+.config+ file that contains the entire configuration. This file will be
read by the top-level Makefile.

To start the build process, simply run:

--------------------
 $ make
--------------------

You *should never* use +make -jN+ with Buildroot: top-level parallel
make is currently not supported. Instead, use the +BR2_JLEVEL+ option
to tell Buildroot to run the compilation of each individual package
with +make -jN+.

The `make` command will generally perform the following steps:

* download source files (as required);
* configure, build and install the cross-compilation toolchain, or
  simply import an external toolchain;
* configure, build and install selected target packages;
* build a kernel image, if selected;
* build a bootloader image, if selected;
* create a root filesystem in selected formats.

Buildroot output is stored in a single directory, +output/+.
This directory contains several subdirectories:

* +images/+ where all the images (kernel image, bootloader and root
  filesystem images) are stored. These are the files you need to put
  on your target system.

* +build/+ where all the components are built (this includes tools
  needed by Buildroot on the host and packages compiled for the
  target). This directory contains one subdirectory for each of these
  components.

* +host/+ contains both the tools built for the host, and the sysroot
  of the target toolchain. The former is an installation of tools
  compiled for the host that are needed for the proper execution of
  Buildroot, including the cross-compilation toolchain. The latter
  is a hierarchy similar to a root filesystem hierarchy. It contains
  the headers and libraries of all user-space packages that provide
  and install libraries used by other packages. However, this
  directory is 'not' intended to be the root filesystem for the target:
  it contains a lot of development files, unstripped binaries and
  libraries that make it far too big for an embedded system. These
  development files are used to compile libraries and applications for
  the target that depend on other libraries.

* +staging/+ is a symlink to the target toolchain sysroot inside
  +host/+, which exists for backwards compatibility.

* +target/+ which contains 'almost' the complete root filesystem for
  the target: everything needed is present except the device files in
  +/dev/+ (Buildroot can't create them because Buildroot doesn't run
  as root and doesn't want to run as root). Also, it doesn't have the correct
  permissions (e.g. setuid for the busybox binary). Therefore, this directory
  *should not be used on your target*. Instead, you should use one of
  the images built in the +images/+ directory. If you need an
  extracted image of the root filesystem for booting over NFS, then
  use the tarball image generated in +images/+ and extract it as
  root. Compared to +staging/+, +target/+ contains only the files and
  libraries needed to run the selected target applications: the
  development files (headers, etc.) are not present, the binaries are
  stripped.

These commands, +make menuconfig|nconfig|gconfig|xconfig+ and +make+, are the
basic ones that allow to easily and quickly generate images fitting
your needs, with all the features and applications you enabled.

More details about the "make" command usage are given in
xref:make-tips[].
