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