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

* +staging/+ which contains a hierarchy similar to a root filesystem
  hierarchy. This directory contains the headers and libraries of the
  cross-compilation toolchain and all the userspace packages selected
  for the target. 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.

* +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.

* +host/+ contains the installation of tools compiled for the host
  that are needed for the proper execution of Buildroot, including the
  cross-compilation toolchain.

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