// -*- 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
--------------------

By default, Buildroot does not support top-level parallel build, so
running +make -jN+ is not necessary. There is however experimental
support for top-level parallel build, see
xref:top-level-parallel-build[].

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[].
