blob: d8fcfdc4bf21f743beb41835c883d307c4457620 [file] [log] [blame]
Heinrich Schuchardt16327a22020-09-05 10:58:53 +02001Building with GCC
2=================
3
4Dependencies
5------------
6
7For building U-Boot you need a GCC compiler for your host platform. If you
8are not building on the target platform you further need a GCC cross compiler.
9
10Debian based
11~~~~~~~~~~~~
12
13On Debian based systems the cross compiler packages are named
14gcc-<architecture>-linux-gnu.
15
16You could install GCC and the GCC cross compiler for the ARMv8 architecture with
17
18.. code-block:: bash
19
Heinrich Schuchardtc78ffd12020-09-20 12:31:47 +020020 sudo apt-get install gcc gcc-aarch64-linux-gnu
Heinrich Schuchardt16327a22020-09-05 10:58:53 +020021
22Depending on the build targets further packages maybe needed
23
24.. code-block:: bash
25
26 sudo apt-get install bc bison build-essential coccinelle \
Heinrich Schuchardtbc2ed7f2021-08-01 23:29:20 +020027 device-tree-compiler dfu-util efitools flex gdisk graphviz imagemagick \
Heinrich Schuchardta5469ac2022-03-12 11:56:23 +010028 liblz4-tool libgnutls28-dev libguestfs-tools libncurses-dev \
29 libpython3-dev libsdl2-dev libssl-dev lz4 lzma lzma-alone openssl \
Heinrich Schuchardt9b97d122022-10-08 00:46:35 +020030 pkg-config python3 python3-asteval python3-coverage python3-filelock \
Heinrich Schuchardt566cd942022-05-26 10:15:58 +020031 python3-pkg-resources python3-pycryptodome python3-pyelftools \
Heinrich Schuchardt9b97d122022-10-08 00:46:35 +020032 python3-pytest python3-pytest-xdist python3-sphinxcontrib.apidoc \
33 python3-sphinx-rtd-theme python3-subunit python3-testtools \
34 python3-virtualenv swig uuid-dev
Heinrich Schuchardt16327a22020-09-05 10:58:53 +020035
Heinrich Schuchardt0a793922020-09-20 12:01:30 +020036SUSE based
37~~~~~~~~~~
38
39On suse based systems the cross compiler packages are named
40cross-<architecture>-gcc<version>.
41
42You could install GCC and the GCC 10 cross compiler for the ARMv8 architecture
43with
44
45.. code-block:: bash
46
47 sudo zypper install gcc cross-aarch64-gcc10
48
49Depending on the build targets further packages maybe needed.
50
51.. code-block:: bash
52
53 zypper install bc bison flex gcc libopenssl-devel libSDL2-devel make \
54 ncurses-devel python3-devel python3-pytest swig
55
Heinrich Schuchardt81050ef2022-01-11 01:37:01 +010056Alpine Linux
57~~~~~~~~~~~~
58
59For building U-Boot on Alpine Linux at least the following packages are needed:
60
61.. code-block:: bash
62
Milan P. Stanić9a9e4802023-10-17 21:46:58 +020063 apk add alpine-sdk bc bison dtc flex gnutls-dev linux-headers ncurses-dev \
64 openssl-dev py3-elftools py3-setuptools python3-dev swig util-linux-dev
65
66Depending on the build target further packages may be needed:
67
68* sandbox with lcd: sdl2-dev
Milan P. Stanić1bfd4732023-11-04 15:38:15 +010069* riscv64 S-mode targets: opensbi
Milan P. Stanić9a9e4802023-10-17 21:46:58 +020070* some arm64 targets: arm-trusted-firmware
Heinrich Schuchardt81050ef2022-01-11 01:37:01 +010071
Heinrich Schuchardt16327a22020-09-05 10:58:53 +020072Prerequisites
73-------------
74
75For some boards you have to build prerequisite files before you can build
76U-Boot, e.g. for the some boards you will need to build the ARM Trusted Firmware
77beforehand. Please, refer to the board specific documentation
78:doc:`../board/index`.
79
80Configuration
81-------------
82
83Directory configs/ contains the template configuration files for the maintained
84boards following the naming scheme::
85
86 <board name>_defconfig
87
88These files have been stripped of default settings. So you cannot use them
89directly. Instead their name serves as a make target to generate the actual
90configuration file .config. For instance the configuration template for the
91Odroid C2 board is called odroid-c2_defconfig. The corresponding .config file
92is generated by
93
94.. code-block:: bash
95
96 make odroid-c2_defconfig
97
98You can adjust the configuration using
99
100.. code-block:: bash
101
102 make menuconfig
103
104Building
105--------
106
107When cross compiling you will have to specify the prefix of the cross-compiler.
108You can either specify the value of the CROSS_COMPILE variable on the make
109command line or export it beforehand.
110
111.. code-block:: bash
112
113 CROSS_COMPILE=<compiler-prefix> make
114
115Assuming cross compiling on Debian for ARMv8 this would be
116
117.. code-block:: bash
118
119 CROSS_COMPILE=aarch64-linux-gnu- make
120
Heinrich Schuchardt68c367d2024-07-14 09:18:04 +0200121Out-of-tree building
122~~~~~~~~~~~~~~~~~~~~
123
124By default building is performed locally and the objects are saved in the source
125directory. To build out-out-tree use one of the two methods below:
126
127Add O= parameter to the make command line:
128
129.. code-block:: bash
130
131 make O=/tmp/build distclean
132 make O=/tmp/build NAME_defconfig
133 make O=/tmp/build
134
135Use environment variable KBUILD_OUTPUT:
136
137.. code-block:: bash
138
139 export KBUILD_OUTPUT=/tmp/build
140 make distclean
141 make NAME_defconfig
142 make
143
144.. note::
145
146 The command line "O=" parameter overrides the KBUILD_OUTPUT environment
147 variable.
148
Heinrich Schuchardt16327a22020-09-05 10:58:53 +0200149Build parameters
150~~~~~~~~~~~~~~~~
151
152A list of available parameters for the make command can be obtained via
153
154.. code-block:: bash
155
156 make help
157
158You can speed up compilation by parallelization using the -j parameter, e.g.
159
160.. code-block:: bash
161
162 CROSS_COMPILE=aarch64-linux-gnu- make -j$(nproc)
163
164Further important build parameters are
165
166* O=<dir> - generate all output files in directory <dir>, including .config
167* V=1 - verbose build
168
Simon Glass90619e72021-09-22 11:34:44 -0600169Devicetree compiler
170~~~~~~~~~~~~~~~~~~~
171
172Boards that use `CONFIG_OF_CONTROL` (i.e. almost all of them) need the
173devicetree compiler (dtc). Those with `CONFIG_PYLIBFDT` need pylibfdt, a Python
174library for accessing devicetree data. Suitable versions of these are included
175in the U-Boot tree in `scripts/dtc` and built automatically as needed.
176
177To use the system versions of these, use the DTC parameter, for example
178
179.. code-block:: bash
180
181 DTC=/usr/bin/dtc make
182
183In this case, dtc and pylibfdt are not built. The build checks that the version
184of dtc is new enough. It also makes sure that pylibfdt is present, if needed
185(see `scripts_dtc` in the Makefile).
186
187Note that the :doc:`tools` are always built with the included version of libfdt
188so it is not possible to build U-Boot tools with a system libfdt, at present.
189
Simon Glass6c8ec912022-08-03 12:13:08 -0600190Link-time optimisation (LTO)
191~~~~~~~~~~~~~~~~~~~~~~~~~~~~
192
193U-Boot supports link-time optimisation which can reduce the size of the final
194U-Boot binaries, particularly with SPL.
195
196At present this can be enabled by ARM boards by adding `CONFIG_LTO=y` into the
197defconfig file. Other architectures are not supported. LTO is enabled by default
198for sandbox.
199
200This does incur a link-time penalty of several seconds. For faster incremental
201builds during development, you can disable it by setting `NO_LTO` to `1`.
202
203.. code-block:: bash
204
205 NO_LTO=1 make
206
Heinrich Schuchardt16327a22020-09-05 10:58:53 +0200207Other build targets
208~~~~~~~~~~~~~~~~~~~
209
210A list of all make targets can be obtained via
211
212.. code-block:: bash
213
214 make help
215
216Important ones are
217
218* clean - remove most generated files but keep the configuration
219* mrproper - remove all generated files + config + various backup files
220
221Installation
222------------
223
224The process for installing U-Boot on the target device is device specific.
225Please, refer to the board specific documentation :doc:`../board/index`.