This is a very broad question!
First, here is a summary on how to inspect your build performance
and dependencies when using the openembedded/yocto project. This answers the first part of the question.
What packages take more time to build?
Use the buildstats with the pybootchartgui tool produce a build chart.
Details:
Set USER_CLASSES += "buildstats"
in your $BUILDIR/conf/local.conf
file. This will dump detailed performance data in
$BUILDDIR/tmp/buildstats/<DATE>
. Next use the pybootchartgui.py
script (in
poky/scripts/pybootchartgui
) to generate the chart. This will help you
localize possible bottlenecks in the build. Of course, if you have a
lot of recipes to bake, your chart will be huge. To remove some noise
use the -m MINTIME
command line option.
For example:
poky/scripts/pybootchartgui/pybootchartgui.py -m 600 $BUILDDIR/tmp/buildstats/201312310904
will only display tasks (do_compile, do_fetch, etc.) that take longer
than 10 minutes (600 seconds) to run.
How to check for package dependencies?
To explore the dependencies of a particular package use the depexp
utility. For example, to explore the dependencies of eglibc use:
bitbake -g -u depexp eglibc
This will give a better understanding of what each recipe depends on
at both run and compile time.
How to check if there are any circular dependencies and how to solve them?
bitbake automatically detects circular dependencies and prints an error message when such a thing happens.
The error message contains the name of the packages causing this circular dependency.
How to check if there are recipes which aren't used and how to safely remove them?
bitbake calculates dependencies automatically and won't build
packages which aren't needed by your target. If you find some unwanted packages in your image and you wish to remove them:
- use
bitbake -g -u depexp <TARGET>
to inspect how the package gets pulled in
- modify the needed recipes in your layer (by creating a bbappend for example) to eliminate the dependency manually
Improving overall build performance
Finally, some tips on how to improve the overall build performance. This answers the second part of the question.
- Clean up your dependencies (
bitbake -g -u depexp <TARGET>
is your friend). Building less stuff takes less time.
- bitbake can automatically cache the build outputs and use it for
future builds, this cache is called the "shared-state cache" and is
controlled with the
SSTATE_DIR
variable in your local.conf
.
- Set the
BB_NUMBER_THREADS
and PARALLEL_MAKE
variables in your local.conf
to match your
machine's resources. These variables control how many tasks are run
in parallel and how many processes 'make' should run in parallel (-j
option) respectively.
- Put the 'build' directory on its own disk.
- Use the ext4 filesystem without journaling and with these mount
options:
noatime,barrier=0,commit=6000
. WARNING: This makes your
hdd unreliable in case of power losses. Do not store anything of
value on this hdd.
- building images with
-dev
and/or -dbg
packages increases the
do_rootfs task time considerably. Make sure you enable them (see
EXTRA_IMAGE_FEATURES
in your local.conf
) only when needed.
- openembedded and yocto both support icecream (distributed compile). See the icecc class and this post.
- Buy a faster machine ;)
References:
Yocto Build Performance Wiki
Bitbake GUI tools