Merge branch 'master' of git://git.denx.de/u-boot-socfpga
[oweals/u-boot.git] / tools / buildman / README
1 # SPDX-License-Identifier: GPL-2.0+
2 # Copyright (c) 2013 The Chromium OS Authors.
3
4 (Please read 'How to change from MAKEALL' if you are used to that tool)
5
6 Quick-start
7 ===========
8
9 If you just want to quickly set up buildman so you can build something (for
10 example Raspberry Pi 2):
11
12    cd /path/to/u-boot
13    PATH=$PATH:`pwd`/tools/buildman
14    buildman --fetch-arch arm
15    buildman -k rpi_2
16    ls ../current/rpi_2
17    # u-boot.bin is the output image
18
19
20 What is this?
21 =============
22
23 This tool handles building U-Boot to check that you have not broken it
24 with your patch series. It can build each individual commit and report
25 which boards fail on which commits, and which errors come up. It aims
26 to make full use of multi-processor machines.
27
28 A key feature of buildman is its output summary, which allows warnings,
29 errors or image size increases in a particular commit or board to be
30 quickly identified and the offending commit pinpointed. This can be a big
31 help for anyone working with >10 patches at a time.
32
33
34 Caveats
35 =======
36
37 Buildman can be stopped and restarted, in which case it will continue
38 where it left off. This should happen cleanly and without side-effects.
39 If not, it is a bug, for which a patch would be welcome.
40
41 Buildman gets so tied up in its work that it can ignore the outside world.
42 You may need to press Ctrl-C several times to quit it. Also it will print
43 out various exceptions when stopped. You may have to kill it since the
44 Ctrl-C handling is somewhat broken.
45
46
47 Theory of Operation
48 ===================
49
50 (please read this section in full twice or you will be perpetually confused)
51
52 Buildman is a builder. It is not make, although it runs make. It does not
53 produce any useful output on the terminal while building, except for
54 progress information (except with -v, see below). All the output (errors,
55 warnings and binaries if you ask for them) is stored in output
56 directories, which you can look at while the build is progressing, or when
57 it is finished.
58
59 Buildman is designed to build entire git branches, i.e. muliple commits. It
60 can be run repeatedly on the same branch. In this case it will automatically
61 rebuild commits which have changed (and remove its old results for that
62 commit). It is possible to build a branch for one board, then later build it
63 for another board. If you want buildman to re-build a commit it has already
64 built (e.g. because of a toolchain update), use the -f flag.
65
66 Buildman produces a concise summary of which boards succeeded and failed.
67 It shows which commit introduced which board failure using a simple
68 red/green colour coding. Full error information can be requested, in which
69 case it is de-duped and displayed against the commit that introduced the
70 error. An example workflow is below.
71
72 Buildman stores image size information and can report changes in image size
73 from commit to commit. An example of this is below.
74
75 Buildman starts multiple threads, and each thread builds for one board at
76 a time. A thread starts at the first commit, configures the source for your
77 board and builds it. Then it checks out the next commit and does an
78 incremental build. Eventually the thread reaches the last commit and stops.
79 If errors or warnings are found along the way, the thread will reconfigure
80 after every commit, and your build will be very slow. This is because a
81 file that produces just a warning would not normally be rebuilt in an
82 incremental build.
83
84 Buildman works in an entirely separate place from your U-Boot repository.
85 It creates a separate working directory for each thread, and puts the
86 output files in the working directory, organised by commit name and board
87 name, in a two-level hierarchy.
88
89 Buildman is invoked in your U-Boot directory, the one with the .git
90 directory. It clones this repository into a copy for each thread, and the
91 threads do not affect the state of your git repository. Any checkouts done
92 by the thread affect only the working directory for that thread.
93
94 Buildman automatically selects the correct tool chain for each board. You
95 must supply suitable tool chains, but buildman takes care of selecting the
96 right one.
97
98 Buildman generally builds a branch (with the -b flag), and in this case
99 builds the upstream commit as well, for comparison. It cannot build
100 individual commits at present, unless (maybe) you point it at an empty
101 branch. Put all your commits in a branch, set the branch's upstream to a
102 valid value, and all will be well. Otherwise buildman will perform random
103 actions. Use -n to check what the random actions might be.
104
105 If you just want to build the current source tree, leave off the -b flag
106 and add -e. This will display results and errors as they happen. You can
107 still look at them later using -se. Note that buildman will assume that the
108 source has changed, and will build all specified boards in this case.
109
110 Buildman is optimised for building many commits at once, for many boards.
111 On multi-core machines, Buildman is fast because it uses most of the
112 available CPU power. When it gets to the end, or if you are building just
113 a few commits or boards, it will be pretty slow. As a tip, if you don't
114 plan to use your machine for anything else, you can use -T to increase the
115 number of threads beyond the default.
116
117
118 Selecting which boards to build
119 ===============================
120
121 Buildman lets you build all boards, or a subset. Specify the subset by passing
122 command-line arguments that list the desired board name, architecture name,
123 SOC name, or anything else in the boards.cfg file. Multiple arguments are
124 allowed. Each argument will be interpreted as a regular expression, so
125 behaviour is a superset of exact or substring matching. Examples are:
126
127 * 'tegra20'      All boards with a Tegra20 SoC
128 * 'tegra'        All boards with any Tegra Soc (Tegra20, Tegra30, Tegra114...)
129 * '^tegra[23]0$' All boards with either Tegra20 or Tegra30 SoC
130 * 'powerpc'      All PowerPC boards
131
132 While the default is to OR the terms together, you can also make use of
133 the '&' operator to limit the selection:
134
135 * 'freescale & arm sandbox'  All Freescale boards with ARM architecture,
136                              plus sandbox
137
138 You can also use -x to specifically exclude some boards. For example:
139
140   buildman arm -x nvidia,freescale,.*ball$
141
142 means to build all arm boards except nvidia, freescale and anything ending
143 with 'ball'.
144
145 For building specific boards you can use the --boards option, which takes a
146 comma-separated list of board target names and be used multiple times on
147 the command line:
148
149   buildman --boards sandbox,snow --boards
150
151 It is convenient to use the -n option to see what will be built based on
152 the subset given. Use -v as well to get an actual list of boards.
153
154 Buildman does not store intermediate object files. It optionally copies
155 the binary output into a directory when a build is successful (-k). Size
156 information is always recorded. It needs a fair bit of disk space to work,
157 typically 250MB per thread.
158
159
160 Setting up
161 ==========
162
163 1. Get the U-Boot source. You probably already have it, but if not these
164 steps should get you started with a repo and some commits for testing.
165
166 $ cd /path/to/u-boot
167 $ git clone git://git.denx.de/u-boot.git .
168 $ git checkout -b my-branch origin/master
169 $ # Add some commits to the branch, reading for testing
170
171 2. Create ~/.buildman to tell buildman where to find tool chains (see 'The
172 .buildman file' later for details). As an example:
173
174 # Buildman settings file
175
176 [toolchain]
177 root: /
178 rest: /toolchains/*
179 eldk: /opt/eldk-4.2
180 arm: /opt/linaro/gcc-linaro-arm-linux-gnueabihf-4.8-2013.08_linux
181 aarch64: /opt/linaro/gcc-linaro-aarch64-none-elf-4.8-2013.10_linux
182
183 [toolchain-alias]
184 x86: i386
185 blackfin: bfin
186 nds32: nds32le
187 openrisc: or1k
188
189
190 This selects the available toolchain paths. Add the base directory for
191 each of your toolchains here. Buildman will search inside these directories
192 and also in any '/usr' and '/usr/bin' subdirectories.
193
194 Make sure the tags (here root: rest: and eldk:) are unique.
195
196 The toolchain-alias section indicates that the i386 toolchain should be used
197 to build x86 commits.
198
199 Note that you can also specific exactly toolchain prefixes if you like:
200
201 [toolchain-prefix]
202 arm: /opt/arm-eabi-4.6/bin/arm-eabi-
203
204 or even:
205
206 [toolchain-prefix]
207 arm: /opt/arm-eabi-4.6/bin/arm-eabi-gcc
208
209 This tells buildman that you want to use this exact toolchain for the arm
210 architecture. This will override any toolchains found by searching using the
211 [toolchain] settings.
212
213 Since the toolchain prefix is an explicit request, buildman will report an
214 error if a toolchain is not found with that prefix. The current PATH will be
215 searched, so it is possible to use:
216
217 [toolchain-prefix]
218 arm: arm-none-eabi-
219
220 and buildman will find arm-none-eabi-gcc in /usr/bin if you have it installed.
221
222 [toolchain-wrapper]
223 wrapper: ccache
224
225 This tells buildman to use a compiler wrapper in front of CROSS_COMPILE. In
226 this example, ccache. It doesn't affect the toolchain scan. The wrapper is
227 added when CROSS_COMPILE environtal variable is set. The name in this
228 section is ignored. If more than one line is provided, only the last one
229 is taken.
230
231 3. Make sure you have the require Python pre-requisites
232
233 Buildman uses multiprocessing, Queue, shutil, StringIO, ConfigParser and
234 urllib2. These should normally be available, but if you get an error like
235 this then you will need to obtain those modules:
236
237     ImportError: No module named multiprocessing
238
239
240 4. Check the available toolchains
241
242 Run this check to make sure that you have a toolchain for every architecture.
243
244 $ ./tools/buildman/buildman --list-tool-chains
245 Scanning for tool chains
246    - scanning prefix '/opt/gcc-4.6.3-nolibc/x86_64-linux/bin/x86_64-linux-'
247 Tool chain test:  OK, arch='x86', priority 1
248    - scanning prefix '/opt/arm-eabi-4.6/bin/arm-eabi-'
249 Tool chain test:  OK, arch='arm', priority 1
250    - scanning path '/toolchains/gcc-4.9.0-nolibc/i386-linux'
251       - looking in '/toolchains/gcc-4.9.0-nolibc/i386-linux/.'
252       - looking in '/toolchains/gcc-4.9.0-nolibc/i386-linux/bin'
253          - found '/toolchains/gcc-4.9.0-nolibc/i386-linux/bin/i386-linux-gcc'
254       - looking in '/toolchains/gcc-4.9.0-nolibc/i386-linux/usr/bin'
255 Tool chain test:  OK, arch='i386', priority 4
256    - scanning path '/toolchains/gcc-4.9.0-nolibc/aarch64-linux'
257       - looking in '/toolchains/gcc-4.9.0-nolibc/aarch64-linux/.'
258       - looking in '/toolchains/gcc-4.9.0-nolibc/aarch64-linux/bin'
259          - found '/toolchains/gcc-4.9.0-nolibc/aarch64-linux/bin/aarch64-linux-gcc'
260       - looking in '/toolchains/gcc-4.9.0-nolibc/aarch64-linux/usr/bin'
261 Tool chain test:  OK, arch='aarch64', priority 4
262    - scanning path '/toolchains/gcc-4.9.0-nolibc/microblaze-linux'
263       - looking in '/toolchains/gcc-4.9.0-nolibc/microblaze-linux/.'
264       - looking in '/toolchains/gcc-4.9.0-nolibc/microblaze-linux/bin'
265          - found '/toolchains/gcc-4.9.0-nolibc/microblaze-linux/bin/microblaze-linux-gcc'
266       - looking in '/toolchains/gcc-4.9.0-nolibc/microblaze-linux/usr/bin'
267 Tool chain test:  OK, arch='microblaze', priority 4
268    - scanning path '/toolchains/gcc-4.9.0-nolibc/mips64-linux'
269       - looking in '/toolchains/gcc-4.9.0-nolibc/mips64-linux/.'
270       - looking in '/toolchains/gcc-4.9.0-nolibc/mips64-linux/bin'
271          - found '/toolchains/gcc-4.9.0-nolibc/mips64-linux/bin/mips64-linux-gcc'
272       - looking in '/toolchains/gcc-4.9.0-nolibc/mips64-linux/usr/bin'
273 Tool chain test:  OK, arch='mips64', priority 4
274    - scanning path '/toolchains/gcc-4.9.0-nolibc/sparc64-linux'
275       - looking in '/toolchains/gcc-4.9.0-nolibc/sparc64-linux/.'
276       - looking in '/toolchains/gcc-4.9.0-nolibc/sparc64-linux/bin'
277          - found '/toolchains/gcc-4.9.0-nolibc/sparc64-linux/bin/sparc64-linux-gcc'
278       - looking in '/toolchains/gcc-4.9.0-nolibc/sparc64-linux/usr/bin'
279 Tool chain test:  OK, arch='sparc64', priority 4
280    - scanning path '/toolchains/gcc-4.9.0-nolibc/arm-unknown-linux-gnueabi'
281       - looking in '/toolchains/gcc-4.9.0-nolibc/arm-unknown-linux-gnueabi/.'
282       - looking in '/toolchains/gcc-4.9.0-nolibc/arm-unknown-linux-gnueabi/bin'
283          - found '/toolchains/gcc-4.9.0-nolibc/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-gcc'
284       - looking in '/toolchains/gcc-4.9.0-nolibc/arm-unknown-linux-gnueabi/usr/bin'
285 Tool chain test:  OK, arch='arm', priority 3
286 Toolchain '/toolchains/gcc-4.9.0-nolibc/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-gcc' at priority 3 will be ignored because another toolchain for arch 'arm' has priority 1
287    - scanning path '/toolchains/gcc-4.9.0-nolibc/sparc-linux'
288       - looking in '/toolchains/gcc-4.9.0-nolibc/sparc-linux/.'
289       - looking in '/toolchains/gcc-4.9.0-nolibc/sparc-linux/bin'
290          - found '/toolchains/gcc-4.9.0-nolibc/sparc-linux/bin/sparc-linux-gcc'
291       - looking in '/toolchains/gcc-4.9.0-nolibc/sparc-linux/usr/bin'
292 Tool chain test:  OK, arch='sparc', priority 4
293    - scanning path '/toolchains/gcc-4.9.0-nolibc/mips-linux'
294       - looking in '/toolchains/gcc-4.9.0-nolibc/mips-linux/.'
295       - looking in '/toolchains/gcc-4.9.0-nolibc/mips-linux/bin'
296          - found '/toolchains/gcc-4.9.0-nolibc/mips-linux/bin/mips-linux-gcc'
297       - looking in '/toolchains/gcc-4.9.0-nolibc/mips-linux/usr/bin'
298 Tool chain test:  OK, arch='mips', priority 4
299    - scanning path '/toolchains/gcc-4.9.0-nolibc/x86_64-linux'
300       - looking in '/toolchains/gcc-4.9.0-nolibc/x86_64-linux/.'
301       - looking in '/toolchains/gcc-4.9.0-nolibc/x86_64-linux/bin'
302          - found '/toolchains/gcc-4.9.0-nolibc/x86_64-linux/bin/x86_64-linux-gcc'
303          - found '/toolchains/gcc-4.9.0-nolibc/x86_64-linux/bin/x86_64-linux-x86_64-linux-gcc'
304       - looking in '/toolchains/gcc-4.9.0-nolibc/x86_64-linux/usr/bin'
305 Tool chain test:  OK, arch='x86_64', priority 4
306 Tool chain test:  OK, arch='x86_64', priority 4
307 Toolchain '/toolchains/gcc-4.9.0-nolibc/x86_64-linux/bin/x86_64-linux-x86_64-linux-gcc' at priority 4 will be ignored because another toolchain for arch 'x86_64' has priority 4
308    - scanning path '/toolchains/gcc-4.9.0-nolibc/m68k-linux'
309       - looking in '/toolchains/gcc-4.9.0-nolibc/m68k-linux/.'
310       - looking in '/toolchains/gcc-4.9.0-nolibc/m68k-linux/bin'
311          - found '/toolchains/gcc-4.9.0-nolibc/m68k-linux/bin/m68k-linux-gcc'
312       - looking in '/toolchains/gcc-4.9.0-nolibc/m68k-linux/usr/bin'
313 Tool chain test:  OK, arch='m68k', priority 4
314    - scanning path '/toolchains/gcc-4.9.0-nolibc/powerpc-linux'
315       - looking in '/toolchains/gcc-4.9.0-nolibc/powerpc-linux/.'
316       - looking in '/toolchains/gcc-4.9.0-nolibc/powerpc-linux/bin'
317          - found '/toolchains/gcc-4.9.0-nolibc/powerpc-linux/bin/powerpc-linux-gcc'
318       - looking in '/toolchains/gcc-4.9.0-nolibc/powerpc-linux/usr/bin'
319 Tool chain test:  OK, arch='powerpc', priority 4
320    - scanning path '/toolchains/gcc-4.6.3-nolibc/bfin-uclinux'
321       - looking in '/toolchains/gcc-4.6.3-nolibc/bfin-uclinux/.'
322       - looking in '/toolchains/gcc-4.6.3-nolibc/bfin-uclinux/bin'
323          - found '/toolchains/gcc-4.6.3-nolibc/bfin-uclinux/bin/bfin-uclinux-gcc'
324       - looking in '/toolchains/gcc-4.6.3-nolibc/bfin-uclinux/usr/bin'
325 Tool chain test:  OK, arch='bfin', priority 6
326    - scanning path '/toolchains/gcc-4.6.3-nolibc/sparc-linux'
327       - looking in '/toolchains/gcc-4.6.3-nolibc/sparc-linux/.'
328       - looking in '/toolchains/gcc-4.6.3-nolibc/sparc-linux/bin'
329          - found '/toolchains/gcc-4.6.3-nolibc/sparc-linux/bin/sparc-linux-gcc'
330       - looking in '/toolchains/gcc-4.6.3-nolibc/sparc-linux/usr/bin'
331 Tool chain test:  OK, arch='sparc', priority 4
332 Toolchain '/toolchains/gcc-4.6.3-nolibc/sparc-linux/bin/sparc-linux-gcc' at priority 4 will be ignored because another toolchain for arch 'sparc' has priority 4
333    - scanning path '/toolchains/gcc-4.6.3-nolibc/mips-linux'
334       - looking in '/toolchains/gcc-4.6.3-nolibc/mips-linux/.'
335       - looking in '/toolchains/gcc-4.6.3-nolibc/mips-linux/bin'
336          - found '/toolchains/gcc-4.6.3-nolibc/mips-linux/bin/mips-linux-gcc'
337       - looking in '/toolchains/gcc-4.6.3-nolibc/mips-linux/usr/bin'
338 Tool chain test:  OK, arch='mips', priority 4
339 Toolchain '/toolchains/gcc-4.6.3-nolibc/mips-linux/bin/mips-linux-gcc' at priority 4 will be ignored because another toolchain for arch 'mips' has priority 4
340    - scanning path '/toolchains/gcc-4.6.3-nolibc/m68k-linux'
341       - looking in '/toolchains/gcc-4.6.3-nolibc/m68k-linux/.'
342       - looking in '/toolchains/gcc-4.6.3-nolibc/m68k-linux/bin'
343          - found '/toolchains/gcc-4.6.3-nolibc/m68k-linux/bin/m68k-linux-gcc'
344       - looking in '/toolchains/gcc-4.6.3-nolibc/m68k-linux/usr/bin'
345 Tool chain test:  OK, arch='m68k', priority 4
346 Toolchain '/toolchains/gcc-4.6.3-nolibc/m68k-linux/bin/m68k-linux-gcc' at priority 4 will be ignored because another toolchain for arch 'm68k' has priority 4
347    - scanning path '/toolchains/gcc-4.6.3-nolibc/powerpc-linux'
348       - looking in '/toolchains/gcc-4.6.3-nolibc/powerpc-linux/.'
349       - looking in '/toolchains/gcc-4.6.3-nolibc/powerpc-linux/bin'
350          - found '/toolchains/gcc-4.6.3-nolibc/powerpc-linux/bin/powerpc-linux-gcc'
351       - looking in '/toolchains/gcc-4.6.3-nolibc/powerpc-linux/usr/bin'
352 Tool chain test:  OK, arch='powerpc', priority 4
353 Tool chain test:  OK, arch='or32', priority 4
354    - scanning path '/'
355       - looking in '/.'
356       - looking in '/bin'
357       - looking in '/usr/bin'
358          - found '/usr/bin/i586-mingw32msvc-gcc'
359          - found '/usr/bin/c89-gcc'
360          - found '/usr/bin/x86_64-linux-gnu-gcc'
361          - found '/usr/bin/gcc'
362          - found '/usr/bin/c99-gcc'
363          - found '/usr/bin/arm-linux-gnueabi-gcc'
364          - found '/usr/bin/aarch64-linux-gnu-gcc'
365          - found '/usr/bin/winegcc'
366          - found '/usr/bin/arm-linux-gnueabihf-gcc'
367 Tool chain test:  OK, arch='i586', priority 11
368 Tool chain test:  OK, arch='c89', priority 11
369 Tool chain test:  OK, arch='x86_64', priority 4
370 Toolchain '/usr/bin/x86_64-linux-gnu-gcc' at priority 4 will be ignored because another toolchain for arch 'x86_64' has priority 4
371 Tool chain test:  OK, arch='sandbox', priority 11
372 Tool chain test:  OK, arch='c99', priority 11
373 Tool chain test:  OK, arch='arm', priority 4
374 Toolchain '/usr/bin/arm-linux-gnueabi-gcc' at priority 4 will be ignored because another toolchain for arch 'arm' has priority 1
375 Tool chain test:  OK, arch='aarch64', priority 4
376 Toolchain '/usr/bin/aarch64-linux-gnu-gcc' at priority 4 will be ignored because another toolchain for arch 'aarch64' has priority 4
377 Tool chain test:  OK, arch='sandbox', priority 11
378 Toolchain '/usr/bin/winegcc' at priority 11 will be ignored because another toolchain for arch 'sandbox' has priority 11
379 Tool chain test:  OK, arch='arm', priority 4
380 Toolchain '/usr/bin/arm-linux-gnueabihf-gcc' at priority 4 will be ignored because another toolchain for arch 'arm' has priority 1
381 List of available toolchains (34):
382 aarch64   : /toolchains/gcc-4.9.0-nolibc/aarch64-linux/bin/aarch64-linux-gcc
383 alpha     : /toolchains/gcc-4.9.0-nolibc/alpha-linux/bin/alpha-linux-gcc
384 am33_2.0  : /toolchains/gcc-4.9.0-nolibc/am33_2.0-linux/bin/am33_2.0-linux-gcc
385 arm       : /opt/arm-eabi-4.6/bin/arm-eabi-gcc
386 bfin      : /toolchains/gcc-4.6.3-nolibc/bfin-uclinux/bin/bfin-uclinux-gcc
387 c89       : /usr/bin/c89-gcc
388 c99       : /usr/bin/c99-gcc
389 frv       : /toolchains/gcc-4.9.0-nolibc/frv-linux/bin/frv-linux-gcc
390 h8300     : /toolchains/gcc-4.9.0-nolibc/h8300-elf/bin/h8300-elf-gcc
391 hppa      : /toolchains/gcc-4.9.0-nolibc/hppa-linux/bin/hppa-linux-gcc
392 hppa64    : /toolchains/gcc-4.9.0-nolibc/hppa64-linux/bin/hppa64-linux-gcc
393 i386      : /toolchains/gcc-4.9.0-nolibc/i386-linux/bin/i386-linux-gcc
394 i586      : /usr/bin/i586-mingw32msvc-gcc
395 ia64      : /toolchains/gcc-4.9.0-nolibc/ia64-linux/bin/ia64-linux-gcc
396 m32r      : /toolchains/gcc-4.9.0-nolibc/m32r-linux/bin/m32r-linux-gcc
397 m68k      : /toolchains/gcc-4.9.0-nolibc/m68k-linux/bin/m68k-linux-gcc
398 microblaze: /toolchains/gcc-4.9.0-nolibc/microblaze-linux/bin/microblaze-linux-gcc
399 mips      : /toolchains/gcc-4.9.0-nolibc/mips-linux/bin/mips-linux-gcc
400 mips64    : /toolchains/gcc-4.9.0-nolibc/mips64-linux/bin/mips64-linux-gcc
401 or32      : /toolchains/gcc-4.5.1-nolibc/or32-linux/bin/or32-linux-gcc
402 powerpc   : /toolchains/gcc-4.9.0-nolibc/powerpc-linux/bin/powerpc-linux-gcc
403 powerpc64 : /toolchains/gcc-4.9.0-nolibc/powerpc64-linux/bin/powerpc64-linux-gcc
404 ppc64le   : /toolchains/gcc-4.9.0-nolibc/ppc64le-linux/bin/ppc64le-linux-gcc
405 s390x     : /toolchains/gcc-4.9.0-nolibc/s390x-linux/bin/s390x-linux-gcc
406 sandbox   : /usr/bin/gcc
407 sh4       : /toolchains/gcc-4.6.3-nolibc/sh4-linux/bin/sh4-linux-gcc
408 sparc     : /toolchains/gcc-4.9.0-nolibc/sparc-linux/bin/sparc-linux-gcc
409 sparc64   : /toolchains/gcc-4.9.0-nolibc/sparc64-linux/bin/sparc64-linux-gcc
410 tilegx    : /toolchains/gcc-4.6.2-nolibc/tilegx-linux/bin/tilegx-linux-gcc
411 x86       : /opt/gcc-4.6.3-nolibc/x86_64-linux/bin/x86_64-linux-gcc
412 x86_64    : /toolchains/gcc-4.9.0-nolibc/x86_64-linux/bin/x86_64-linux-gcc
413
414
415 You can see that everything is covered, even some strange ones that won't
416 be used (c88 and c99). This is a feature.
417
418
419 5. Install new toolchains if needed
420
421 You can download toolchains and update the [toolchain] section of the
422 settings file to find them.
423
424 To make this easier, buildman can automatically download and install
425 toolchains from kernel.org. First list the available architectures:
426
427 $ ./tools/buildman/buildman --fetch-arch list
428 Checking: https://www.kernel.org/pub/tools/crosstool/files/bin/x86_64/4.6.3/
429 Checking: https://www.kernel.org/pub/tools/crosstool/files/bin/x86_64/4.6.2/
430 Checking: https://www.kernel.org/pub/tools/crosstool/files/bin/x86_64/4.5.1/
431 Checking: https://www.kernel.org/pub/tools/crosstool/files/bin/x86_64/4.2.4/
432 Available architectures: alpha am33_2.0 arm bfin cris crisv32 frv h8300
433 hppa hppa64 i386 ia64 m32r m68k mips mips64 or32 powerpc powerpc64 s390x sh4
434 sparc sparc64 tilegx x86_64 xtensa
435
436 Then pick one and download it:
437
438 $ ./tools/buildman/buildman --fetch-arch or32
439 Checking: https://www.kernel.org/pub/tools/crosstool/files/bin/x86_64/4.6.3/
440 Checking: https://www.kernel.org/pub/tools/crosstool/files/bin/x86_64/4.6.2/
441 Checking: https://www.kernel.org/pub/tools/crosstool/files/bin/x86_64/4.5.1/
442 Downloading: https://www.kernel.org/pub/tools/crosstool/files/bin/x86_64/4.5.1//x86_64-gcc-4.5.1-nolibc_or32-linux.tar.xz
443 Unpacking to: /home/sjg/.buildman-toolchains
444 Testing
445       - looking in '/home/sjg/.buildman-toolchains/gcc-4.5.1-nolibc/or32-linux/.'
446       - looking in '/home/sjg/.buildman-toolchains/gcc-4.5.1-nolibc/or32-linux/bin'
447          - found '/home/sjg/.buildman-toolchains/gcc-4.5.1-nolibc/or32-linux/bin/or32-linux-gcc'
448 Tool chain test:  OK
449
450 Or download them all from kernel.org and move them to /toolchains directory,
451
452 $ ./tools/buildman/buildman --fetch-arch all
453 $ sudo mkdir -p /toolchains
454 $ sudo mv ~/.buildman-toolchains/*/* /toolchains/
455
456 For those not available from kernel.org, download from the following links.
457
458 arc: https://github.com/foss-for-synopsys-dwc-arc-processors/toolchain/releases/
459     download/arc-2016.09-release/arc_gnu_2016.09_prebuilt_uclibc_le_archs_linux_install.tar.gz
460 blackfin: http://sourceforge.net/projects/adi-toolchain/files/
461     blackfin-toolchain-elf-gcc-4.5-2014R1_45-RC2.x86_64.tar.bz2
462 nds32: http://osdk.andestech.com/packages/
463     nds32le-linux-glibc-v1.tgz
464 nios2: http://sourcery.mentor.com/public/gnu_toolchain/nios2-linux-gnu/
465     sourceryg++-2015.11-27-nios2-linux-gnu-i686-pc-linux-gnu.tar.bz2
466 sh: http://sourcery.mentor.com/public/gnu_toolchain/sh-linux-gnu/
467     renesas-4.4-200-sh-linux-gnu-i686-pc-linux-gnu.tar.bz2
468
469 Note openrisc kernel.org toolchain is out of date. Download the latest one from
470 http://opencores.org/or1k/OpenRISC_GNU_tool_chain#Prebuilt_versions - eg:
471 ftp://ocuser:ocuser@openrisc.opencores.org/toolchain/gcc-or1k-elf-4.8.1-x86.tar.bz2.
472
473 Buildman should now be set up to use your new toolchain.
474
475 At the time of writing, U-Boot has these architectures:
476
477    arc, arm, blackfin, m68k, microblaze, mips, nds32, nios2, openrisc
478    powerpc, sandbox, sh, sparc, x86
479
480 Of these, only arc and nds32 are not available at kernel.org..
481
482
483 How to run it
484 =============
485
486 First do a dry run using the -n flag: (replace <branch> with a real, local
487 branch with a valid upstream)
488
489 $ ./tools/buildman/buildman -b <branch> -n
490
491 If it can't detect the upstream branch, try checking out the branch, and
492 doing something like 'git branch --set-upstream-to upstream/master'
493 or something similar. Buildman will try to guess a suitable upstream branch
494 if it can't find one (you will see a message like" Guessing upstream as ...).
495
496 As an example:
497
498 Dry run, so not doing much. But I would do this:
499
500 Building 18 commits for 1059 boards (4 threads, 1 job per thread)
501 Build directory: ../lcd9b
502     5bb3505 Merge branch 'master' of git://git.denx.de/u-boot-arm
503     c18f1b4 tegra: Use const for pinmux_config_pingroup/table()
504     2f043ae tegra: Add display support to funcmux
505     e349900 tegra: fdt: Add pwm binding and node
506     424a5f0 tegra: fdt: Add LCD definitions for Tegra
507     0636ccf tegra: Add support for PWM
508     a994fe7 tegra: Add SOC support for display/lcd
509     fcd7350 tegra: Add LCD driver
510     4d46e9d tegra: Add LCD support to Nvidia boards
511     991bd48 arm: Add control over cachability of memory regions
512     54e8019 lcd: Add CONFIG_LCD_ALIGNMENT to select frame buffer alignment
513     d92aff7 lcd: Add support for flushing LCD fb from dcache after update
514     dbd0677 tegra: Align LCD frame buffer to section boundary
515     0cff9b8 tegra: Support control of cache settings for LCD
516     9c56900 tegra: fdt: Add LCD definitions for Seaboard
517     5cc29db lcd: Add CONFIG_CONSOLE_SCROLL_LINES option to speed console
518     cac5a23 tegra: Enable display/lcd support on Seaboard
519     49ff541 wip
520
521 Total boards to build for each commit: 1059
522
523 This shows that it will build all 1059 boards, using 4 threads (because
524 we have a 4-core CPU). Each thread will run with -j1, meaning that each
525 make job will use a single CPU. The list of commits to be built helps you
526 confirm that things look about right. Notice that buildman has chosen a
527 'base' directory for you, immediately above your source tree.
528
529 Buildman works entirely inside the base directory, here ../lcd9b,
530 creating a working directory for each thread, and creating output
531 directories for each commit and board.
532
533
534 Suggested Workflow
535 ==================
536
537 To run the build for real, take off the -n:
538
539 $ ./tools/buildman/buildman -b <branch>
540
541 Buildman will set up some working directories, and get started. After a
542 minute or so it will settle down to a steady pace, with a display like this:
543
544 Building 18 commits for 1059 boards (4 threads, 1 job per thread)
545   528   36  124 /19062  1:13:30  : SIMPC8313_SP
546
547 This means that it is building 19062 board/commit combinations. So far it
548 has managed to successfully build 528. Another 36 have built with warnings,
549 and 124 more didn't build at all. Buildman expects to complete the process
550 in around an hour and a quarter. Use this time to buy a faster computer.
551
552
553 To find out how the build went, ask for a summary with -s. You can do this
554 either before the build completes (presumably in another terminal) or
555 afterwards. Let's work through an example of how this is used:
556
557 $ ./tools/buildman/buildman -b lcd9b -s
558 ...
559 01: Merge branch 'master' of git://git.denx.de/u-boot-arm
560    powerpc:   + galaxy5200_LOWBOOT
561 02: tegra: Use const for pinmux_config_pingroup/table()
562 03: tegra: Add display support to funcmux
563 04: tegra: fdt: Add pwm binding and node
564 05: tegra: fdt: Add LCD definitions for Tegra
565 06: tegra: Add support for PWM
566 07: tegra: Add SOC support for display/lcd
567 08: tegra: Add LCD driver
568 09: tegra: Add LCD support to Nvidia boards
569 10: arm: Add control over cachability of memory regions
570 11: lcd: Add CONFIG_LCD_ALIGNMENT to select frame buffer alignment
571 12: lcd: Add support for flushing LCD fb from dcache after update
572        arm:   + lubbock
573 13: tegra: Align LCD frame buffer to section boundary
574 14: tegra: Support control of cache settings for LCD
575 15: tegra: fdt: Add LCD definitions for Seaboard
576 16: lcd: Add CONFIG_CONSOLE_SCROLL_LINES option to speed console
577 17: tegra: Enable display/lcd support on Seaboard
578 18: wip
579
580 This shows which commits have succeeded and which have failed. In this case
581 the build is still in progress so many boards are not built yet (use -u to
582 see which ones). But still we can see a few failures. The galaxy5200_LOWBOOT
583 never builds correctly. This could be a problem with our toolchain, or it
584 could be a bug in the upstream. The good news is that we probably don't need
585 to blame our commits. The bad news is that our commits are not tested on that
586 board.
587
588 Commit 12 broke lubbock. That's what the '+ lubbock' means. The failure
589 is never fixed by a later commit, or you would see lubbock again, in green,
590 without the +.
591
592 To see the actual error:
593
594 $ ./tools/buildman/buildman -b <branch> -se lubbock
595 ...
596 12: lcd: Add support for flushing LCD fb from dcache after update
597        arm:   + lubbock
598 +common/libcommon.o: In function `lcd_sync':
599 +/u-boot/lcd9b/.bm-work/00/common/lcd.c:120: undefined reference to `flush_dcache_range'
600 +arm-none-linux-gnueabi-ld: BFD (Sourcery G++ Lite 2010q1-202) 2.19.51.20090709 assertion fail /scratch/julian/2010q1-release-linux-lite/obj/binutils-src-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu/bfd/elf32-arm.c:12572
601 +make: *** [/u-boot/lcd9b/.bm-work/00/build/u-boot] Error 139
602 13: tegra: Align LCD frame buffer to section boundary
603 14: tegra: Support control of cache settings for LCD
604 15: tegra: fdt: Add LCD definitions for Seaboard
605 16: lcd: Add CONFIG_CONSOLE_SCROLL_LINES option to speed console
606 -/u-boot/lcd9b/.bm-work/00/common/lcd.c:120: undefined reference to `flush_dcache_range'
607 +/u-boot/lcd9b/.bm-work/00/common/lcd.c:125: undefined reference to `flush_dcache_range'
608 17: tegra: Enable display/lcd support on Seaboard
609 18: wip
610
611 So the problem is in lcd.c, due to missing cache operations. This information
612 should be enough to work out what that commit is doing to break these
613 boards. (In this case pxa did not have cache operations defined).
614
615 If you see error lines marked with '-', that means that the errors were fixed
616 by that commit. Sometimes commits can be in the wrong order, so that a
617 breakage is introduced for a few commits and fixed by later commits. This
618 shows up clearly with buildman. You can then reorder the commits and try
619 again.
620
621 At commit 16, the error moves: you can see that the old error at line 120
622 is fixed, but there is a new one at line 126. This is probably only because
623 we added some code and moved the broken line further down the file.
624
625 If many boards have the same error, then -e will display the error only
626 once. This makes the output as concise as possible. To see which boards have
627 each error, use -l. So it is safe to omit the board name - you will not get
628 lots of repeated output for every board.
629
630 Buildman tries to distinguish warnings from errors, and shows warning lines
631 separately with a 'w' prefix.
632
633 The full build output in this case is available in:
634
635 ../lcd9b/12_of_18_gd92aff7_lcd--Add-support-for/lubbock/
636
637    done: Indicates the build was done, and holds the return code from make.
638          This is 0 for a good build, typically 2 for a failure.
639
640    err:  Output from stderr, if any. Errors and warnings appear here.
641
642    log:  Output from stdout. Normally there isn't any since buildman runs
643          in silent mode. Use -V to force a verbose build (this passes V=1
644          to 'make')
645
646    toolchain: Shows information about the toolchain used for the build.
647
648    sizes: Shows image size information.
649
650 It is possible to get the build binary output there also. Use the -k option
651 for this. In that case you will also see some output files, like:
652
653    System.map  toolchain  u-boot  u-boot.bin  u-boot.map  autoconf.mk
654    (also SPL versions u-boot-spl and u-boot-spl.bin if available)
655
656
657 Checking Image Sizes
658 ====================
659
660 A key requirement for U-Boot is that you keep code/data size to a minimum.
661 Where a new feature increases this noticeably it should normally be put
662 behind a CONFIG flag so that boards can leave it disabled and keep the image
663 size more or less the same with each new release.
664
665 To check the impact of your commits on image size, use -S. For example:
666
667 $ ./tools/buildman/buildman -b us-x86 -sS
668 Summary of 10 commits for 1066 boards (4 threads, 1 job per thread)
669 01: MAKEALL: add support for per architecture toolchains
670 02: x86: Add function to get top of usable ram
671        x86: (for 1/3 boards)  text -272.0  rodata +41.0
672 03: x86: Add basic cache operations
673 04: x86: Permit bootstage and timer data to be used prior to relocation
674        x86: (for 1/3 boards)  data +16.0
675 05: x86: Add an __end symbol to signal the end of the U-Boot binary
676        x86: (for 1/3 boards)  text +76.0
677 06: x86: Rearrange the output input to remove BSS
678        x86: (for 1/3 boards)  bss -2140.0
679 07: x86: Support relocation of FDT on start-up
680        x86: +   coreboot-x86
681 08: x86: Add error checking to x86 relocation code
682 09: x86: Adjust link device tree include file
683 10: x86: Enable CONFIG_OF_CONTROL on coreboot
684
685
686 You can see that image size only changed on x86, which is good because this
687 series is not supposed to change any other board. From commit 7 onwards the
688 build fails so we don't get code size numbers. The numbers are fractional
689 because they are an average of all boards for that architecture. The
690 intention is to allow you to quickly find image size problems introduced by
691 your commits.
692
693 Note that the 'text' region and 'rodata' are split out. You should add the
694 two together to get the total read-only size (reported as the first column
695 in the output from binutil's 'size' utility).
696
697 A useful option is --step which lets you skip some commits. For example
698 --step 2 will show the image sizes for only every 2nd commit (so it will
699 compare the image sizes of the 1st, 3rd, 5th... commits). You can also use
700 --step 0 which will compare only the first and last commits. This is useful
701 for an overview of how your entire series affects code size. It will build
702 only the upstream commit and your final branch commit.
703
704 You can also use -d to see a detailed size breakdown for each board. This
705 list is sorted in order from largest growth to largest reduction.
706
707 It is even possible to go a little further with the -B option (--bloat). This
708 shows where U-Boot has bloated, breaking the size change down to the function
709 level. Example output is below:
710
711 $ ./tools/buildman/buildman -b us-mem4 -sSdB
712 ...
713 19: Roll crc32 into hash infrastructure
714        arm: (for 10/10 boards)  all -143.4  bss +1.2  data -4.8  rodata -48.2 text -91.6
715             paz00          :  all +23  bss -4  rodata -29  text +56
716                u-boot: add: 1/0, grow: 3/-2 bytes: 168/-104 (64)
717                  function                                   old     new   delta
718                  hash_command                                80     160     +80
719                  crc32_wd_buf                                 -      56     +56
720                  ext4fs_read_file                           540     568     +28
721                  insert_var_value_sub                       688     692      +4
722                  run_list_real                             1996    1992      -4
723                  do_mem_crc                                 168      68    -100
724             trimslice      :  all -9  bss +16  rodata -29  text +4
725                u-boot: add: 1/0, grow: 1/-3 bytes: 136/-124 (12)
726                  function                                   old     new   delta
727                  hash_command                                80     160     +80
728                  crc32_wd_buf                                 -      56     +56
729                  ext4fs_iterate_dir                         672     668      -4
730                  ext4fs_read_file                           568     548     -20
731                  do_mem_crc                                 168      68    -100
732             whistler       :  all -9  bss +16  rodata -29  text +4
733                u-boot: add: 1/0, grow: 1/-3 bytes: 136/-124 (12)
734                  function                                   old     new   delta
735                  hash_command                                80     160     +80
736                  crc32_wd_buf                                 -      56     +56
737                  ext4fs_iterate_dir                         672     668      -4
738                  ext4fs_read_file                           568     548     -20
739                  do_mem_crc                                 168      68    -100
740             seaboard       :  all -9  bss -28  rodata -29  text +48
741                u-boot: add: 1/0, grow: 3/-2 bytes: 160/-104 (56)
742                  function                                   old     new   delta
743                  hash_command                                80     160     +80
744                  crc32_wd_buf                                 -      56     +56
745                  ext4fs_read_file                           548     568     +20
746                  run_list_real                             1996    2000      +4
747                  do_nandboot                                760     756      -4
748                  do_mem_crc                                 168      68    -100
749             colibri_t20    :  all -9  rodata -29  text +20
750                u-boot: add: 1/0, grow: 2/-3 bytes: 140/-112 (28)
751                  function                                   old     new   delta
752                  hash_command                                80     160     +80
753                  crc32_wd_buf                                 -      56     +56
754                  read_abs_bbt                               204     208      +4
755                  do_nandboot                                760     756      -4
756                  ext4fs_read_file                           576     568      -8
757                  do_mem_crc                                 168      68    -100
758             ventana        :  all -37  bss -12  rodata -29  text +4
759                u-boot: add: 1/0, grow: 1/-3 bytes: 136/-124 (12)
760                  function                                   old     new   delta
761                  hash_command                                80     160     +80
762                  crc32_wd_buf                                 -      56     +56
763                  ext4fs_iterate_dir                         672     668      -4
764                  ext4fs_read_file                           568     548     -20
765                  do_mem_crc                                 168      68    -100
766             harmony        :  all -37  bss -16  rodata -29  text +8
767                u-boot: add: 1/0, grow: 2/-3 bytes: 140/-124 (16)
768                  function                                   old     new   delta
769                  hash_command                                80     160     +80
770                  crc32_wd_buf                                 -      56     +56
771                  nand_write_oob_syndrome                    428     432      +4
772                  ext4fs_iterate_dir                         672     668      -4
773                  ext4fs_read_file                           568     548     -20
774                  do_mem_crc                                 168      68    -100
775             medcom-wide    :  all -417  bss +28  data -16  rodata -93  text -336
776                u-boot: add: 1/-1, grow: 1/-2 bytes: 88/-376 (-288)
777                  function                                   old     new   delta
778                  crc32_wd_buf                                 -      56     +56
779                  do_fat_read_at                            2872    2904     +32
780                  hash_algo                                   16       -     -16
781                  do_mem_crc                                 168      68    -100
782                  hash_command                               420     160    -260
783             tec            :  all -449  bss -4  data -16  rodata -93  text -336
784                u-boot: add: 1/-1, grow: 1/-2 bytes: 88/-376 (-288)
785                  function                                   old     new   delta
786                  crc32_wd_buf                                 -      56     +56
787                  do_fat_read_at                            2872    2904     +32
788                  hash_algo                                   16       -     -16
789                  do_mem_crc                                 168      68    -100
790                  hash_command                               420     160    -260
791             plutux         :  all -481  bss +16  data -16  rodata -93  text -388
792                u-boot: add: 1/-1, grow: 1/-3 bytes: 68/-408 (-340)
793                  function                                   old     new   delta
794                  crc32_wd_buf                                 -      56     +56
795                  do_load_serial_bin                        1688    1700     +12
796                  hash_algo                                   16       -     -16
797                  do_fat_read_at                            2904    2872     -32
798                  do_mem_crc                                 168      68    -100
799                  hash_command                               420     160    -260
800    powerpc: (for 5/5 boards)  all +37.4  data -3.2  rodata -41.8  text +82.4
801             MPC8610HPCD    :  all +55  rodata -29  text +84
802                u-boot: add: 1/0, grow: 0/-1 bytes: 176/-96 (80)
803                  function                                   old     new   delta
804                  hash_command                                 -     176    +176
805                  do_mem_crc                                 184      88     -96
806             MPC8641HPCN    :  all +55  rodata -29  text +84
807                u-boot: add: 1/0, grow: 0/-1 bytes: 176/-96 (80)
808                  function                                   old     new   delta
809                  hash_command                                 -     176    +176
810                  do_mem_crc                                 184      88     -96
811             MPC8641HPCN_36BIT:  all +55  rodata -29  text +84
812                u-boot: add: 1/0, grow: 0/-1 bytes: 176/-96 (80)
813                  function                                   old     new   delta
814                  hash_command                                 -     176    +176
815                  do_mem_crc                                 184      88     -96
816             sbc8641d       :  all +55  rodata -29  text +84
817                u-boot: add: 1/0, grow: 0/-1 bytes: 176/-96 (80)
818                  function                                   old     new   delta
819                  hash_command                                 -     176    +176
820                  do_mem_crc                                 184      88     -96
821             xpedite517x    :  all -33  data -16  rodata -93  text +76
822                u-boot: add: 1/-1, grow: 0/-1 bytes: 176/-112 (64)
823                  function                                   old     new   delta
824                  hash_command                                 -     176    +176
825                  hash_algo                                   16       -     -16
826                  do_mem_crc                                 184      88     -96
827 ...
828
829
830 This shows that commit 19 has reduced codesize for arm slightly and increased
831 it for powerpc. This increase was offset in by reductions in rodata and
832 data/bss.
833
834 Shown below the summary lines are the sizes for each board. Below each board
835 are the sizes for each function. This information starts with:
836
837    add - number of functions added / removed
838    grow - number of functions which grew / shrunk
839    bytes - number of bytes of code added to / removed from all functions,
840             plus the total byte change in brackets
841
842 The change seems to be that hash_command() has increased by more than the
843 do_mem_crc() function has decreased. The function sizes typically add up to
844 roughly the text area size, but note that every read-only section except
845 rodata is included in 'text', so the function total does not exactly
846 correspond.
847
848 It is common when refactoring code for the rodata to decrease as the text size
849 increases, and vice versa.
850
851
852 The .buildman file
853 ==================
854
855 The .buildman file provides information about the available toolchains and
856 also allows build flags to be passed to 'make'. It consists of several
857 sections, with the section name in square brackets. Within each section are
858 a set of (tag, value) pairs.
859
860 '[toolchain]' section
861
862     This lists the available toolchains. The tag here doesn't matter, but
863     make sure it is unique. The value is the path to the toolchain. Buildman
864     will look in that path for a file ending in 'gcc'. It will then execute
865     it to check that it is a C compiler, passing only the --version flag to
866     it. If the return code is 0, buildman assumes that it is a valid C
867     compiler. It uses the first part of the name as the architecture and
868     strips off the last part when setting the CROSS_COMPILE environment
869     variable (parts are delimited with a hyphen).
870
871     For example powerpc-linux-gcc will be noted as a toolchain for 'powerpc'
872     and CROSS_COMPILE will be set to powerpc-linux- when using it.
873
874 '[toolchain-alias]' section
875
876     This converts toolchain architecture names to U-Boot names. For example,
877     if an x86 toolchains is called i386-linux-gcc it will not normally be
878     used for architecture 'x86'. Adding 'x86: i386 x86_64' to this section
879     will tell buildman that the i386 and x86_64 toolchains can be used for
880     the x86 architecture.
881
882 '[make-flags]' section
883
884     U-Boot's build system supports a few flags (such as BUILD_TAG) which
885     affect the build product. These flags can be specified in the buildman
886     settings file. They can also be useful when building U-Boot against other
887     open source software.
888
889     [make-flags]
890     at91-boards=ENABLE_AT91_TEST=1
891     snapper9260=${at91-boards} BUILD_TAG=442
892     snapper9g45=${at91-boards} BUILD_TAG=443
893
894     This will use 'make ENABLE_AT91_TEST=1 BUILD_TAG=442' for snapper9260
895     and 'make ENABLE_AT91_TEST=1 BUILD_TAG=443' for snapper9g45. A special
896     variable ${target} is available to access the target name (snapper9260
897     and snapper9g20 in this case). Variables are resolved recursively. Note
898     that variables can only contain the characters A-Z, a-z, 0-9, hyphen (-)
899     and underscore (_).
900
901     It is expected that any variables added are dealt with in U-Boot's
902     config.mk file and documented in the README.
903
904     Note that you can pass ad-hoc options to the build using environment
905     variables, for example:
906
907        SOME_OPTION=1234 ./tools/buildman/buildman my_board
908
909
910 Quick Sanity Check
911 ==================
912
913 If you have made changes and want to do a quick sanity check of the
914 currently checked-out source, run buildman without the -b flag. This will
915 build the selected boards and display build status as it runs (i.e. -v is
916 enabled automatically). Use -e to see errors/warnings as well.
917
918
919 Building Ranges
920 ===============
921
922 You can build a range of commits by specifying a range instead of a branch
923 when using the -b flag. For example:
924
925     upstream/master..us-buildman
926
927 will build commits in us-buildman that are not in upstream/master.
928
929
930 Building Faster
931 ===============
932
933 By default, buildman executes 'make mrproper' prior to building the first
934 commit for each board. This causes everything to be built from scratch. If you
935 trust the build system's incremental build capabilities, you can pass the -I
936 flag to skip the 'make mproper' invocation, which will reduce the amount of
937 work 'make' does, and hence speed up the build. This flag will speed up any
938 buildman invocation, since it reduces the amount of work done on any build.
939
940 One possible application of buildman is as part of a continual edit, build,
941 edit, build, ... cycle; repeatedly applying buildman to the same change or
942 series of changes while making small incremental modifications to the source
943 each time. This provides quick feedback regarding the correctness of recent
944 modifications. In this scenario, buildman's default choice of build directory
945 causes more build work to be performed than strictly necessary.
946
947 By default, each buildman thread uses a single directory for all builds. When a
948 thread builds multiple boards, the configuration built in this directory will
949 cycle through various different configurations, one per board built by the
950 thread. Variations in the configuration will force a rebuild of affected source
951 files when a thread switches between boards. Ideally, such buildman-induced
952 rebuilds would not happen, thus allowing the build to operate as efficiently as
953 the build system and source changes allow. buildman's -P flag may be used to
954 enable this; -P causes each board to be built in a separate (board-specific)
955 directory, thus avoiding any buildman-induced configuration changes in any
956 build directory.
957
958 U-Boot's build system embeds information such as a build timestamp into the
959 final binary. This information varies each time U-Boot is built. This causes
960 various files to be rebuilt even if no source changes are made, which in turn
961 requires that the final U-Boot binary be re-linked. This unnecessary work can
962 be avoided by turning off the timestamp feature. This can be achieved by
963 setting the SOURCE_DATE_EPOCH environment variable to 0.
964
965 Combining all of these options together yields the command-line shown below.
966 This will provide the quickest possible feedback regarding the current content
967 of the source tree, thus allowing rapid tested evolution of the code.
968
969     SOURCE_DATE_EPOCH=0 ./tools/buildman/buildman -I -P tegra
970
971
972 Checking configuration
973 ======================
974
975 A common requirement when converting CONFIG options to Kconfig is to check
976 that the effective configuration has not changed due to the conversion.
977 Buildman supports this with the -K option, used after a build. This shows
978 differences in effective configuration between one commit and the next.
979
980 For example:
981
982     $ buildman -b kc4 -sK
983     ...
984     43: Convert CONFIG_SPL_USBETH_SUPPORT to Kconfig
985     arm:
986     + u-boot.cfg: CONFIG_SPL_ENV_SUPPORT=1 CONFIG_SPL_NET_SUPPORT=1
987     + u-boot-spl.cfg: CONFIG_SPL_MMC_SUPPORT=1 CONFIG_SPL_NAND_SUPPORT=1
988     + all: CONFIG_SPL_ENV_SUPPORT=1 CONFIG_SPL_MMC_SUPPORT=1 CONFIG_SPL_NAND_SUPPORT=1 CONFIG_SPL_NET_SUPPORT=1
989     am335x_evm_usbspl :
990     + u-boot.cfg: CONFIG_SPL_ENV_SUPPORT=1 CONFIG_SPL_NET_SUPPORT=1
991     + u-boot-spl.cfg: CONFIG_SPL_MMC_SUPPORT=1 CONFIG_SPL_NAND_SUPPORT=1
992     + all: CONFIG_SPL_ENV_SUPPORT=1 CONFIG_SPL_MMC_SUPPORT=1 CONFIG_SPL_NAND_SUPPORT=1 CONFIG_SPL_NET_SUPPORT=1
993     44: Convert CONFIG_SPL_USB_HOST_SUPPORT to Kconfig
994     ...
995
996 This shows that commit 44 enabled three new options for the board
997 am335x_evm_usbspl which were not enabled in commit 43. There is also a
998 summary for 'arm' showing all the changes detected for that architecture.
999 In this case there is only one board with changes, so 'arm' output is the
1000 same as 'am335x_evm_usbspl'/
1001
1002 The -K option uses the u-boot.cfg, spl/u-boot-spl.cfg and tpl/u-boot-tpl.cfg
1003 files which are produced by a build. If all you want is to check the
1004 configuration you can in fact avoid doing a full build, using -D. This tells
1005 buildman to configuration U-Boot and create the .cfg files, but not actually
1006 build the source. This is 5-10 times faster than doing a full build.
1007
1008 By default buildman considers the follow two configuration methods
1009 equivalent:
1010
1011    #define CONFIG_SOME_OPTION
1012
1013    CONFIG_SOME_OPTION=y
1014
1015 The former would appear in a header filer and the latter in a defconfig
1016 file. The achieve this, buildman considers 'y' to be '1' in configuration
1017 variables. This avoids lots of useless output when converting a CONFIG
1018 option to Kconfig. To disable this behaviour, use --squash-config-y.
1019
1020
1021 Checking the environment
1022 ========================
1023
1024 When converting CONFIG options which manipulate the default environment,
1025 a common requirement is to check that the default environment has not
1026 changed due to the conversion. Buildman supports this with the -U option,
1027 used after a build. This shows differences in the default environment
1028 between one commit and the next.
1029
1030 For example:
1031
1032 $ buildman -b squash brppt1 -sU
1033 boards.cfg is up to date. Nothing to do.
1034 Summary of 2 commits for 3 boards (3 threads, 3 jobs per thread)
1035 01: Migrate bootlimit to Kconfig
1036 02: Squashed commit of the following:
1037    c brppt1_mmc: altbootcmd=mmc dev 1; run mmcboot0; -> mmc dev 1; run mmcboot0
1038    c brppt1_spi: altbootcmd=mmc dev 1; run mmcboot0; -> mmc dev 1; run mmcboot0
1039    + brppt1_nand: altbootcmd=run usbscript
1040    - brppt1_nand:  altbootcmd=run usbscript
1041 (no errors to report)
1042
1043 This shows that commit 2 modified the value of 'altbootcmd' for 'brppt1_mmc'
1044 and 'brppt1_spi', removing a trailing semicolon. 'brppt1_nand' gained an a
1045 value for 'altbootcmd', but lost one for ' altbootcmd'.
1046
1047 The -U option uses the u-boot.env files which are produced by a build.
1048
1049
1050 Building with clang
1051 ===================
1052
1053 To build with clang (sandbox only), use the -O option to override the
1054 toolchain. For example:
1055
1056    buildman -O clang-7 --board sandbox
1057
1058
1059 Doing a simple build
1060 ====================
1061
1062 In some cases you just want to build a single board and get the full output, use
1063 the -w option, for example:
1064
1065    buildman -o /tmp/build --board sandbox -w
1066
1067 This will write the full build into /tmp/build including object files.
1068
1069
1070 Other options
1071 =============
1072
1073 Buildman has various other command-line options. Try --help to see them.
1074
1075 To find out what toolchain prefix buildman will use for a build, use the -A
1076 option.
1077
1078 To request that compiler warnings be promoted to errors, use -E. This passes the
1079 -Werror flag to the compiler. Note that the build can still produce warnings
1080 with -E, e.g. the migration warnings:
1081
1082         ===================== WARNING ======================
1083         This board does not use CONFIG_DM_MMC. Please update
1084         ...
1085         ====================================================
1086
1087 When doing builds, Buildman's return code will reflect the overall result:
1088
1089     0 (success)     No errors or warnings found
1090     128             Errors found
1091     129             Warnings found (only if no -W)
1092
1093 You can use -W to tell Buildman to return 0 (success) instead of 129 when
1094 warnings are found. Note that it can be useful to combine -E and -W. This means
1095 that all compiler warnings will produce failures (code 128) and all other
1096 warnings will produce success (since 129 is changed to 0).
1097
1098 If there are both warnings and errors, errors win, so buildman returns 128.
1099
1100
1101 How to change from MAKEALL
1102 ==========================
1103
1104 Buildman includes most of the features of MAKEALL and is generally faster
1105 and easier to use. In particular it builds entire branches: if a particular
1106 commit introduces an error in a particular board, buildman can easily show
1107 you this, even if a later commit fixes that error.
1108
1109 The reasons to deprecate MAKEALL are:
1110 - We don't want to maintain two build systems
1111 - Buildman is typically faster
1112 - Buildman has a lot more features
1113
1114 But still, many people will be sad to lose MAKEALL. If you are used to
1115 MAKEALL, here are a few pointers.
1116
1117 First you need to set up your tool chains - see the 'Setting up' section
1118 for details. Once you have your required toolchain(s) detected then you are
1119 ready to go.
1120
1121 To build the current source tree, run buildman without a -b flag:
1122
1123    ./tools/buildman/buildman <list of things to build>
1124
1125 This will build the current source tree for the given boards and display
1126 the results and errors.
1127
1128 However buildman usually works on entire branches, and for that you must
1129 specify a board flag:
1130
1131    ./tools/buildman/buildman -b <branch_name> <list of things to build>
1132
1133 followed by (afterwards, or perhaps concurrently in another terminal):
1134
1135    ./tools/buildman/buildman -b <branch_name> -s <list of things to build>
1136
1137 to see the results of the build. Rather than showing you all the output,
1138 buildman just shows a summary, with red indicating that a commit introduced
1139 an error and green indicating that a commit fixed an error. Use the -e
1140 flag to see the full errors and -l to see which boards caused which errors.
1141
1142 If you really want to see build results as they happen, use -v when doing a
1143 build (and -e to see the errors/warnings too).
1144
1145 You don't need to stick around on that branch while buildman is running. It
1146 checks out its own copy of the source code, so you can change branches,
1147 add commits, etc. without affecting the build in progress.
1148
1149 The <list of things to build> can include board names, architectures or the
1150 like. There are no flags to disambiguate since ambiguities are rare. Using
1151 the examples from MAKEALL:
1152
1153 Examples:
1154   - build all Power Architecture boards:
1155       MAKEALL -a powerpc
1156       MAKEALL --arch powerpc
1157       MAKEALL powerpc
1158           ** buildman -b <branch> powerpc
1159   - build all PowerPC boards manufactured by vendor "esd":
1160       MAKEALL -a powerpc -v esd
1161           ** buildman -b <branch> esd
1162   - build all PowerPC boards manufactured either by "keymile" or "siemens":
1163       MAKEALL -a powerpc -v keymile -v siemens
1164           ** buildman -b <branch> keymile siemens
1165   - build all Freescale boards with MPC83xx CPUs, plus all 4xx boards:
1166       MAKEALL -c mpc83xx -v freescale 4xx
1167           ** buildman -b <branch> mpc83xx freescale 4xx
1168
1169 Buildman automatically tries to use all the CPUs in your machine. If you
1170 are building a lot of boards it will use one thread for every CPU core
1171 it detects in your machine. This is like MAKEALL's BUILD_NBUILDS option.
1172 You can use the -T flag to change the number of threads. If you are only
1173 building a few boards, buildman will automatically run make with the -j
1174 flag to increase the number of concurrent make tasks. It isn't normally
1175 that helpful to fiddle with this option, but if you use the BUILD_NCPUS
1176 option in MAKEALL then -j is the equivalent in buildman.
1177
1178 Buildman puts its output in ../<branch_name> by default but you can change
1179 this with the -o option. Buildman normally does out-of-tree builds: use -i
1180 to disable that if you really want to. But be careful that once you have
1181 used -i you pollute buildman's copies of the source tree, and you will need
1182 to remove the build directory (normally ../<branch_name>) to run buildman
1183 in normal mode (without -i).
1184
1185 Buildman doesn't keep the output result normally, but use the -k option to
1186 do this.
1187
1188 Please read 'Theory of Operation' a few times as it will make a lot of
1189 things clearer.
1190
1191 Some options you might like are:
1192
1193    -B shows which functions are growing/shrinking in which commit - great
1194         for finding code bloat.
1195    -S shows image sizes for each commit (just an overall summary)
1196    -u shows boards that you haven't built yet
1197    --step 0 will build just the upstream commit and the last commit of your
1198         branch. This is often a quick sanity check that your branch doesn't
1199         break anything. But note this does not check bisectability!
1200
1201
1202 TODO
1203 ====
1204
1205 This has mostly be written in my spare time as a response to my difficulties
1206 in testing large series of patches. Apart from tidying up there is quite a
1207 bit of scope for improvement. Things like better error diffs and easier
1208 access to log files. Also it would be nice if buildman could 'hunt' for
1209 problems, perhaps by building a few boards for each arch, or checking
1210 commits for changed files and building only boards which use those files.
1211
1212
1213 Credits
1214 =======
1215
1216 Thanks to Grant Grundler <grundler@chromium.org> for his ideas for improving
1217 the build speed by building all commits for a board instead of the other
1218 way around.
1219
1220
1221 Simon Glass
1222 sjg@chromium.org
1223 Halloween 2012
1224 Updated 12-12-12
1225 Updated 23-02-13