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
sudoapt-getinstallgccgcc-aarch64-linux-gnu
Depending on the build targets further packages maybe needed
sudoapt-getinstallbcbisonbuild-essentialcoccinelle\ device-tree-compilerdfu-utilefitoolsflexgdiskgraphvizimagemagick\ liblz4-toollibgnutls28-devlibguestfs-toolslibncurses-dev\ libpython3-devlibsdl2-devlibssl-devlz4lzmalzma-aloneopenssl\ pkg-configpython3python3-astevalpython3-coveragepython3-filelock\ python3-pkg-resourcespython3-pycryptodomepython3-pyelftools\ python3-pytestpython3-pytest-xdistpython3-sphinxcontrib.apidoc\ python3-sphinx-rtd-themepython3-subunitpython3-testtools\ python3-virtualenvswiguuid-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
sudozypperinstallgcccross-aarch64-gcc10
Depending on the build targets further packages maybe needed.
zypperinstallbcbisonflexgcclibopenssl-devellibSDL2-develmake\
ncurses-develpython3-develpython3-pytestswig
Alpine Linux
For building U-Boot on Alpine Linux at least the following packages are needed:
apkaddalpine-sdkbcbisondtcflexgnutls-devlinux-headersncurses-dev\
openssl-devpy3-elftoolspy3-setuptoolspython3-devswigutil-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 Board-specific doc.
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
makeodroid-c2_defconfig
You can adjust the configuration using
makemenuconfig
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.
CROSS_COMPILE=<compiler-prefix>make
Assuming cross compiling on Debian for ARMv8 this would be
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:
makeO=/tmp/builddistclean makeO=/tmp/buildNAME_defconfig makeO=/tmp/build
Use environment variable KBUILD_OUTPUT:
exportKBUILD_OUTPUT=/tmp/build makedistclean makeNAME_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
makehelp
You can speed up compilation by parallelization using the -j parameter, e.g.
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
DTC=/usr/bin/dtcmake
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 Host 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.
NO_LTO=1make
Other build targets
A list of all make targets can be obtained via
makehelp
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 Board-specific doc.