blob: d8fcfdc4bf21f743beb41835c883d307c4457620 [file] [log] [blame]
Building with GCC
=================
Dependencies
------------
For building U-Boot you need a GCC compiler for your host platform. If you
are not building on the target platform you further need a GCC cross compiler.
Debian based
~~~~~~~~~~~~
On Debian based systems the cross compiler packages are named
gcc-<architecture>-linux-gnu.
You could install GCC and the GCC cross compiler for the ARMv8 architecture with
.. code-block:: bash
sudo apt-get install gcc gcc-aarch64-linux-gnu
Depending on the build targets further packages maybe needed
.. code-block:: bash
sudo apt-get install bc bison build-essential coccinelle \
device-tree-compiler dfu-util efitools flex gdisk graphviz imagemagick \
liblz4-tool libgnutls28-dev libguestfs-tools libncurses-dev \
libpython3-dev libsdl2-dev libssl-dev lz4 lzma lzma-alone openssl \
pkg-config python3 python3-asteval python3-coverage python3-filelock \
python3-pkg-resources python3-pycryptodome python3-pyelftools \
python3-pytest python3-pytest-xdist python3-sphinxcontrib.apidoc \
python3-sphinx-rtd-theme python3-subunit python3-testtools \
python3-virtualenv swig uuid-dev
SUSE based
~~~~~~~~~~
On suse based systems the cross compiler packages are named
cross-<architecture>-gcc<version>.
You could install GCC and the GCC 10 cross compiler for the ARMv8 architecture
with
.. code-block:: bash
sudo zypper install gcc cross-aarch64-gcc10
Depending on the build targets further packages maybe needed.
.. code-block:: bash
zypper install bc bison flex gcc libopenssl-devel libSDL2-devel make \
ncurses-devel python3-devel python3-pytest swig
Alpine Linux
~~~~~~~~~~~~
For building U-Boot on Alpine Linux at least the following packages are needed:
.. code-block:: bash
apk add alpine-sdk bc bison dtc flex gnutls-dev linux-headers ncurses-dev \
openssl-dev py3-elftools py3-setuptools python3-dev swig util-linux-dev
Depending on the build target further packages may be needed:
* sandbox with lcd: sdl2-dev
* riscv64 S-mode targets: opensbi
* some arm64 targets: arm-trusted-firmware
Prerequisites
-------------
For some boards you have to build prerequisite files before you can build
U-Boot, e.g. for the some boards you will need to build the ARM Trusted Firmware
beforehand. Please, refer to the board specific documentation
:doc:`../board/index`.
Configuration
-------------
Directory configs/ contains the template configuration files for the maintained
boards following the naming scheme::
<board name>_defconfig
These files have been stripped of default settings. So you cannot use them
directly. Instead their name serves as a make target to generate the actual
configuration file .config. For instance the configuration template for the
Odroid C2 board is called odroid-c2_defconfig. The corresponding .config file
is generated by
.. code-block:: bash
make odroid-c2_defconfig
You can adjust the configuration using
.. code-block:: bash
make menuconfig
Building
--------
When cross compiling you will have to specify the prefix of the cross-compiler.
You can either specify the value of the CROSS_COMPILE variable on the make
command line or export it beforehand.
.. code-block:: bash
CROSS_COMPILE=<compiler-prefix> make
Assuming cross compiling on Debian for ARMv8 this would be
.. code-block:: bash
CROSS_COMPILE=aarch64-linux-gnu- make
Out-of-tree building
~~~~~~~~~~~~~~~~~~~~
By default building is performed locally and the objects are saved in the source
directory. To build out-out-tree use one of the two methods below:
Add O= parameter to the make command line:
.. code-block:: bash
make O=/tmp/build distclean
make O=/tmp/build NAME_defconfig
make O=/tmp/build
Use environment variable KBUILD_OUTPUT:
.. code-block:: bash
export KBUILD_OUTPUT=/tmp/build
make distclean
make NAME_defconfig
make
.. note::
The command line "O=" parameter overrides the KBUILD_OUTPUT environment
variable.
Build parameters
~~~~~~~~~~~~~~~~
A list of available parameters for the make command can be obtained via
.. code-block:: bash
make help
You can speed up compilation by parallelization using the -j parameter, e.g.
.. code-block:: bash
CROSS_COMPILE=aarch64-linux-gnu- make -j$(nproc)
Further important build parameters are
* O=<dir> - generate all output files in directory <dir>, including .config
* V=1 - verbose build
Devicetree compiler
~~~~~~~~~~~~~~~~~~~
Boards that use `CONFIG_OF_CONTROL` (i.e. almost all of them) need the
devicetree compiler (dtc). Those with `CONFIG_PYLIBFDT` need pylibfdt, a Python
library for accessing devicetree data. Suitable versions of these are included
in the U-Boot tree in `scripts/dtc` and built automatically as needed.
To use the system versions of these, use the DTC parameter, for example
.. code-block:: bash
DTC=/usr/bin/dtc make
In this case, dtc and pylibfdt are not built. The build checks that the version
of dtc is new enough. It also makes sure that pylibfdt is present, if needed
(see `scripts_dtc` in the Makefile).
Note that the :doc:`tools` are always built with the included version of libfdt
so it is not possible to build U-Boot tools with a system libfdt, at present.
Link-time optimisation (LTO)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
U-Boot supports link-time optimisation which can reduce the size of the final
U-Boot binaries, particularly with SPL.
At present this can be enabled by ARM boards by adding `CONFIG_LTO=y` into the
defconfig file. Other architectures are not supported. LTO is enabled by default
for sandbox.
This does incur a link-time penalty of several seconds. For faster incremental
builds during development, you can disable it by setting `NO_LTO` to `1`.
.. code-block:: bash
NO_LTO=1 make
Other build targets
~~~~~~~~~~~~~~~~~~~
A list of all make targets can be obtained via
.. code-block:: bash
make help
Important ones are
* clean - remove most generated files but keep the configuration
* mrproper - remove all generated files + config + various backup files
Installation
------------
The process for installing U-Boot on the target device is device specific.
Please, refer to the board specific documentation :doc:`../board/index`.