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

== Frequently Asked Questions & Troubleshooting

[[faq-boot-hang-after-starting]]
=== The boot hangs after 'Starting network...'

If the boot process seems to hang after the following messages
(messages not necessarily exactly similar, depending on the list of
packages selected):

------------------------
Freeing init memory: 3972K
Initializing random number generator... done.
Starting network...
Starting dropbear sshd: generating rsa key... generating dsa key... OK
------------------------

then it means that your system is running, but didn't start a shell on
the serial console. In order to have the system start a shell on your
serial console, you have to go into the Buildroot configuration, in
+System configuration+, modify +Run a getty (login prompt) after boot+
and set the appropriate port and baud rate in the +getty options+
submenu. This will automatically tune the +/etc/inittab+ file of the
generated system so that a shell starts on the correct serial port.

[[faq-no-compiler-on-target]]
=== Why is there no compiler on the target?

It has been decided that support for the _native compiler on the
target_ would be stopped from the Buildroot-2012.11 release because:

* this feature was neither maintained nor tested, and often broken;
* this feature was only available for Buildroot toolchains;
* Buildroot mostly targets _small_ or _very small_ target hardware
  with limited resource onboard (CPU, ram, mass-storage), for which
  compiling on the target does not make much sense;
* Buildroot aims at easing the cross-compilation, making native
  compilation on the target unnecessary.

If you need a compiler on your target anyway, then Buildroot is not
suitable for your purpose. In such case, you need a _real
distribution_ and you should opt for something like:

* http://www.openembedded.org[openembedded]
* https://www.yoctoproject.org[yocto]
* http://www.emdebian.org[emdebian]
* https://fedoraproject.org/wiki/Architectures[Fedora]
* http://en.opensuse.org/Portal:ARM[openSUSE ARM]
* http://archlinuxarm.org[Arch Linux ARM]
* ...

[[faq-no-dev-files-on-target]]
=== Why are there no development files on the target?

Since there is no compiler available on the target (see
xref:faq-no-compiler-on-target[]), it does not make sense to waste
space with headers or static libraries.

Therefore, those files are always removed from the target since the
Buildroot-2012.11 release.

[[faq-no-doc-on-target]]
=== Why is there no documentation on the target?

Because Buildroot mostly targets _small_ or _very small_ target
hardware with limited resource onboard (CPU, ram, mass-storage), it
does not make sense to waste space with the documentation data.

If you need documentation data on your target anyway, then Buildroot
is not suitable for your purpose, and you should look for a _real
distribution_ (see: xref:faq-no-compiler-on-target[]).

[[faq-why-not-visible-package]]
=== Why are some packages not visible in the Buildroot config menu?

If a package exists in the Buildroot tree and does not appear in the
config menu, this most likely means that some of the package's
dependencies are not met.

To know more about the dependencies of a package, search for the
package symbol in the config menu (see xref:make-tips[]).

Then, you may have to recursively enable several options (which
correspond to the unmet dependencies) to finally be able to select
the package.

If the package is not visible due to some unmet toolchain options,
then you should certainly run a full rebuild (see xref:make-tips[] for
more explanations).

[[faq-why-not-use-target-as-chroot]]
=== Why not use the target directory as a chroot directory?

There are plenty of reasons to *not* use the target directory a chroot
one, among these:

* file ownerships, modes and permissions are not correctly set in the
  target directory;
* device nodes are not created in the target directory.

For these reasons, commands run through chroot, using the target
directory as the new root, will most likely fail.

If you want to run the target filesystem inside a chroot, or as an NFS
root, then use the tarball image generated in +images/+ and extract it
as root.

[[faq-no-binary-packages]]
=== Why doesn't Buildroot generate binary packages (.deb, .ipkg...)?

One feature that is often discussed on the Buildroot list is the
general topic of "package management". To summarize, the idea
would be to add some tracking of which Buildroot package installs
what files, with the goals of:

 * being able to remove files installed by a package when this package
   gets unselected from the menuconfig;

 * being able to generate binary packages (ipk or other format) that
   can be installed on the target without re-generating a new root
   filesystem image.

In general, most people think it is easy to do: just track which package
installed what and remove it when the package is unselected. However, it
is much more complicated than that:

 * It is not only about the +target/+ directory, but also the sysroot in
   +host/<tuple>/sysroot+ and the +host/+ directory itself. All files
   installed in those directories by various packages must be tracked.

 * When a package is unselected from the configuration, it is not
   sufficient to remove just the files it installed. One must also
   remove all its reverse dependencies (i.e. packages relying on it)
   and rebuild all those packages. For example, package A depends
   optionally on the OpenSSL library. Both are selected, and Buildroot
   is built. Package A is built with crypto support using OpenSSL.
   Later on, OpenSSL gets unselected from the configuration, but
   package A remains (since OpenSSL is an optional dependency, this
   is possible.) If only OpenSSL files are removed, then the files
   installed by package A are broken: they use a library that is no
   longer present on the target. Although this is technically doable,
   it adds a lot of complexity to Buildroot, which goes against the
   simplicity we try to stick to.

 * In addition to the previous problem, there is the case where the
   optional dependency is not even known to Buildroot. For example,
   package A in version 1.0 never used OpenSSL, but in version 2.0 it
   automatically uses OpenSSL if available. If the Buildroot .mk file
   hasn't been updated to take this into account, then package A will
   not be part of the reverse dependencies of OpenSSL and will not be
   removed and rebuilt when OpenSSL is removed. For sure, the .mk file
   of package A should be fixed to mention this optional dependency,
   but in the mean time, you can have non-reproducible behaviors.

 * The request is to also allow changes in the menuconfig to be
   applied on the output directory without having to rebuild
   everything from scratch. However, this is very difficult to achieve
   in a reliable way: what happens when the suboptions of a package
   are changed (we would have to detect this, and rebuild the package
   from scratch and potentially all its reverse dependencies), what
   happens if toolchain options are changed, etc. At the moment, what
   Buildroot does is clear and simple so its behaviour is very
   reliable and it is easy to support users. If configuration changes
   done in menuconfig are applied after the next make, then it has to
   work correctly and properly in all situations, and not have some
   bizarre corner cases. The risk is to get bug reports like "I have
   enabled package A, B and C, then ran make, then disabled package
   C and enabled package D and ran make, then re-enabled package C
   and enabled package E and then there is a build failure". Or worse
   "I did some configuration, then built, then did some changes,
   built, some more changes, built, some more changes, built, and now
   it fails, but I don't remember all the changes I did and in which
   order". This will be impossible to support.

For all these reasons, the conclusion is that adding tracking of
installed files to remove them when the package is unselected, or to
generate a repository of binary packages, is something that is very
hard to achieve reliably and will add a lot of complexity.

On this matter, the Buildroot developers make this position statement:

 * Buildroot strives to make it easy to generate a root filesystem (hence
   the name, by the way.) That is what we want to make Buildroot good at:
   building root filesystems.

 * Buildroot is not meant to be a distribution (or rather, a distribution
   generator.) It is the opinion of most Buildroot developers that this
   is not a goal we should pursue. We believe that there are other tools
   better suited to generate a distro than Buildroot is. For example,
   http://openembedded.org/[Open Embedded], or https://openwrt.org/[openWRT],
   are such tools.

 * We prefer to push Buildroot in a direction that makes it easy (or even
   easier) to generate complete root filesystems. This is what makes
   Buildroot stands out in the crowd (among other things, of course!)

 * We believe that for most embedded Linux systems, binary packages are
   not necessary, and potentially harmful. When binary packages are
   used, it means that the system can be partially upgraded, which
   creates an enormous number of possible combinations of package
   versions that should be tested before doing the upgrade on the
   embedded device. On the other hand, by doing complete system
   upgrades by upgrading the entire root filesystem image at once,
   the image deployed to the embedded system is guaranteed to really
   be the one that has been tested and validated.

[[faq-speeding-up-build]]
=== How to speed-up the build process?

Since Buildroot often involves doing full rebuilds of the entire
system that can be quite long, we provide below a number of tips to
help reduce the build time:

 * Use a pre-built external toolchain instead of the default Buildroot
   internal toolchain. By using a pre-built Linaro toolchain (on ARM)
   or a Sourcery CodeBench toolchain (for ARM, x86, x86-64, MIPS,
   etc.), you will save the build time of the toolchain at each
   complete rebuild, approximately 15 to 20 minutes. Note that
   temporarily using an external toolchain does not prevent you to
   switch back to an internal toolchain (that may provide a higher
   level of customization) once the rest of your system is working;

 * Use the +ccache+ compiler cache (see: xref:ccache[]);

 * Learn about rebuilding only the few packages you actually care
   about (see xref:rebuild-pkg[]), but beware that sometimes full
   rebuilds are anyway necessary (see xref:full-rebuild[]);

 * Make sure you are not using a virtual machine for the Linux system
   used to run Buildroot. Most of the virtual machine technologies are
   known to cause a significant performance impact on I/O, which is
   really important for building source code;

 * Make sure that you're using only local files: do not attempt to do
   a build over NFS, which significantly slows down the build. Having
   the Buildroot download folder available locally also helps a bit.

 * Buy new hardware. SSDs and lots of RAM are key to speeding up the
   builds.

 * Experiment with top-level parallel build, see
   xref:top-level-parallel-build[].
