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