| // -*- mode:doc; -*- |
| // vim: set syntax=asciidoc: |
| |
| == General Buildroot usage |
| |
| include::make-tips.adoc[] |
| |
| include::rebuilding-packages.adoc[] |
| |
| === Offline builds |
| |
| If you intend to do an offline build and just want to download |
| all sources that you previously selected in the configurator |
| ('menuconfig', 'nconfig', 'xconfig' or 'gconfig'), then issue: |
| |
| ---- |
| $ make source |
| ---- |
| |
| You can now disconnect or copy the content of your +dl+ |
| directory to the build-host. |
| |
| === Building out-of-tree |
| |
| As default, everything built by Buildroot is stored in the directory |
| +output+ in the Buildroot tree. |
| |
| Buildroot also supports building out of tree with a syntax similar to |
| the Linux kernel. To use it, add +O=<directory>+ to the make command |
| line: |
| |
| ---- |
| $ make O=/tmp/build menuconfig |
| ---- |
| |
| Or: |
| |
| ---- |
| $ cd /tmp/build; make O=$PWD -C path/to/buildroot menuconfig |
| ---- |
| |
| All the output files will be located under +/tmp/build+. If the +O+ |
| path does not exist, Buildroot will create it. |
| |
| *Note:* the +O+ path can be either an absolute or a relative path, but if it's |
| passed as a relative path, it is important to note that it is interpreted |
| relative to the main Buildroot source directory, *not* the current working |
| directory. |
| |
| When using out-of-tree builds, the Buildroot +.config+ and temporary |
| files are also stored in the output directory. This means that you can |
| safely run multiple builds in parallel using the same source tree as |
| long as they use unique output directories. |
| |
| For ease of use, Buildroot generates a Makefile wrapper in the output |
| directory - so after the first run, you no longer need to pass +O=<...>+ |
| and +-C <...>+, simply run (in the output directory): |
| |
| ---- |
| $ make <target> |
| ---- |
| |
| [[env-vars]] |
| |
| === Environment variables |
| |
| Buildroot also honors some environment variables, when they are passed |
| to +make+ or set in the environment: |
| |
| * +HOSTCXX+, the host C++ compiler to use |
| * +HOSTCC+, the host C compiler to use |
| * +UCLIBC_CONFIG_FILE=<path/to/.config>+, path to |
| the uClibc configuration file, used to compile uClibc, if an |
| internal toolchain is being built. |
| + |
| Note that the uClibc configuration file can also be set from the |
| configuration interface, so through the Buildroot +.config+ file; this |
| is the recommended way of setting it. |
| + |
| * +BUSYBOX_CONFIG_FILE=<path/to/.config>+, path to |
| the BusyBox configuration file. |
| + |
| Note that the BusyBox configuration file can also be set from the |
| configuration interface, so through the Buildroot +.config+ file; this |
| is the recommended way of setting it. |
| + |
| * +BR2_CCACHE_DIR+ to override the directory where |
| Buildroot stores the cached files when using ccache. |
| + |
| * +BR2_DL_DIR+ to override the directory in which |
| Buildroot stores/retrieves downloaded files. |
| + |
| Note that the Buildroot download directory can also be set from the |
| configuration interface, so through the Buildroot +.config+ file. See |
| xref:download-location[] for more details on how you can set the download |
| directory. |
| * +BR2_GRAPH_ALT+, if set and non-empty, to use an alternate color-scheme in |
| build-time graphs |
| * +BR2_GRAPH_OUT+ to set the filetype of generated graphs, either +pdf+ (the |
| default), or +png+. |
| * +BR2_GRAPH_DEPS_OPTS+ to pass extra options to the dependency graph; see |
| xref:graph-depends[] for the accepted options |
| * +BR2_GRAPH_DOT_OPTS+ is passed verbatim as options to the +dot+ utility to |
| draw the dependency graph. |
| * +BR2_GRAPH_SIZE_OPTS+ to pass extra options to the size graph; see |
| xref:graph-size[] for the acepted options |
| |
| An example that uses config files located in the toplevel directory and |
| in your $HOME: |
| |
| ---- |
| $ make UCLIBC_CONFIG_FILE=uClibc.config BUSYBOX_CONFIG_FILE=$HOME/bb.config |
| ---- |
| |
| If you want to use a compiler other than the default +gcc+ |
| or +g+++ for building helper-binaries on your host, then do |
| |
| ---- |
| $ make HOSTCXX=g++-4.3-HEAD HOSTCC=gcc-4.3-HEAD |
| ---- |
| |
| === Dealing efficiently with filesystem images |
| |
| Filesystem images can get pretty big, depending on the filesystem you choose, |
| the number of packages, whether you provisioned free space... Yet, some |
| locations in the filesystems images may just be _empty_ (e.g. a long run of |
| 'zeroes'); such a file is called a _sparse_ file. |
| |
| Most tools can handle sparse files efficiently, and will only store or write |
| those parts of a sparse file that are not empty. |
| |
| For example: |
| |
| * +tar+ accepts the +-S+ option to tell it to only store non-zero blocks |
| of sparse files: |
| ** +tar cf archive.tar -S [files...]+ will efficiently store sparse files |
| in a tarball |
| ** +tar xf archive.tar -S+ will efficiently store sparse files extracted |
| from a tarball |
| |
| * +cp+ accepts the +--sparse=WHEN+ option (+WHEN+ is one of +auto+, |
| +never+ or +always+): |
| ** +cp --sparse=always source.file dest.file+ will make +dest.file+ a |
| sparse file if +source.file+ has long runs of zeroes |
| |
| Other tools may have similar options. Please consult their respective man |
| pages. |
| |
| You can use sparse files if you need to store the filesystem images (e.g. |
| to transfer from one machine to another), or if you need to send them (e.g. |
| to the Q&A team). |
| |
| Note however that flashing a filesystem image to a device while using the |
| sparse mode of +dd+ may result in a broken filesystem (e.g. the block bitmap |
| of an ext2 filesystem may be corrupted; or, if you have sparse files in |
| your filesystem, those parts may not be all-zeroes when read back). You |
| should only use sparse files when handling files on the build machine, not |
| when transferring them to an actual device that will be used on the target. |
| |
| === Details about packages |
| |
| [[package-details]] |
| |
| Buildroot can produce a JSON blurb that describes the set of enabled |
| packages in the current configuration, together with their |
| dependencies, licenses and other metadata. This JSON blurb is produced |
| by using the +show-info+ make target: |
| |
| ---- |
| make show-info |
| ---- |
| |
| Buildroot can also produce details about packages as HTML and JSON |
| output using the +pkg-stats+ make target. Amongst other things, these |
| details include whether known CVEs (security vulnerabilities) affect |
| the packages in your current configuration. It also shows if there is |
| a newer upstream version for those packages. |
| |
| ---- |
| make pkg-stats |
| ---- |
| |
| === Graphing the dependencies between packages |
| |
| [[graph-depends]] |
| |
| One of Buildroot's jobs is to know the dependencies between packages, |
| and make sure they are built in the right order. These dependencies |
| can sometimes be quite complicated, and for a given system, it is |
| often not easy to understand why such or such package was brought into |
| the build by Buildroot. |
| |
| In order to help understanding the dependencies, and therefore better |
| understand what is the role of the different components in your |
| embedded Linux system, Buildroot is capable of generating dependency |
| graphs. |
| |
| To generate a dependency graph of the full system you have compiled, |
| simply run: |
| |
| ---- |
| make graph-depends |
| ---- |
| |
| You will find the generated graph in |
| +output/graphs/graph-depends.pdf+. |
| |
| If your system is quite large, the dependency graph may be too complex |
| and difficult to read. It is therefore possible to generate the |
| dependency graph just for a given package: |
| |
| ---- |
| make <pkg>-graph-depends |
| ---- |
| |
| You will find the generated graph in |
| +output/graph/<pkg>-graph-depends.pdf+. |
| |
| Note that the dependency graphs are generated using the +dot+ tool |
| from the _Graphviz_ project, which you must have installed on your |
| system to use this feature. In most distributions, it is available as |
| the +graphviz+ package. |
| |
| By default, the dependency graphs are generated in the PDF |
| format. However, by passing the +BR2_GRAPH_OUT+ environment variable, you |
| can switch to other output formats, such as PNG, PostScript or |
| SVG. All formats supported by the +-T+ option of the +dot+ tool are |
| supported. |
| |
| ---- |
| BR2_GRAPH_OUT=svg make graph-depends |
| ---- |
| |
| The +graph-depends+ behaviour can be controlled by setting options in the |
| +BR2_GRAPH_DEPS_OPTS+ environment variable. The accepted options are: |
| |
| * +--depth N+, +-d N+, to limit the dependency depth to +N+ levels. The |
| default, +0+, means no limit. |
| |
| * +--stop-on PKG+, +-s PKG+, to stop the graph on the package +PKG+. |
| +PKG+ can be an actual package name, a glob, the keyword 'virtual' |
| (to stop on virtual packages), or the keyword 'host' (to stop on |
| host packages). The package is still present on the graph, but its |
| dependencies are not. |
| |
| * +--exclude PKG+, +-x PKG+, like +--stop-on+, but also omits +PKG+ from |
| the graph. |
| |
| * +--transitive+, +--no-transitive+, to draw (or not) the transitive |
| dependencies. The default is to not draw transitive dependencies. |
| |
| * +--colors R,T,H+, the comma-separated list of colors to draw the |
| root package (+R+), the target packages (+T+) and the host packages |
| (+H+). Defaults to: +lightblue,grey,gainsboro+ |
| |
| ---- |
| BR2_GRAPH_DEPS_OPTS='-d 3 --no-transitive --colors=red,green,blue' make graph-depends |
| ---- |
| |
| === Graphing the build duration |
| |
| [[graph-duration]] |
| |
| When the build of a system takes a long time, it is sometimes useful |
| to be able to understand which packages are the longest to build, to |
| see if anything can be done to speed up the build. In order to help |
| such build time analysis, Buildroot collects the build time of each |
| step of each package, and allows to generate graphs from this data. |
| |
| To generate the build time graph after a build, run: |
| |
| ---- |
| make graph-build |
| ---- |
| |
| This will generate a set of files in +output/graphs+ : |
| |
| * +build.hist-build.pdf+, a histogram of the build time for each |
| package, ordered in the build order. |
| |
| * +build.hist-duration.pdf+, a histogram of the build time for each |
| package, ordered by duration (longest first) |
| |
| * +build.hist-name.pdf+, a histogram of the build time for each |
| package, order by package name. |
| |
| * +build.pie-packages.pdf+, a pie chart of the build time per package |
| |
| * +build.pie-steps.pdf+, a pie chart of the global time spent in each |
| step of the packages build process. |
| |
| This +graph-build+ target requires the Python Matplotlib and Numpy |
| libraries to be installed (+python-matplotlib+ and +python-numpy+ on |
| most distributions), and also the +argparse+ module if you're using a |
| Python version older than 2.7 (+python-argparse+ on most |
| distributions). |
| |
| By default, the output format for the graph is PDF, but a different |
| format can be selected using the +BR2_GRAPH_OUT+ environment variable. The |
| only other format supported is PNG: |
| |
| ---- |
| BR2_GRAPH_OUT=png make graph-build |
| ---- |
| |
| [[graph-size]] |
| === Graphing the filesystem size contribution of packages |
| |
| When your target system grows, it is sometimes useful to understand |
| how much each Buildroot package is contributing to the overall root |
| filesystem size. To help with such an analysis, Buildroot collects |
| data about files installed by each package and using this data, |
| generates a graph and CSV files detailing the size contribution of |
| the different packages. |
| |
| To generate these data after a build, run: |
| |
| ---- |
| make graph-size |
| ---- |
| |
| This will generate: |
| |
| * +output/graphs/graph-size.pdf+, a pie chart of the contribution of |
| each package to the overall root filesystem size |
| |
| * +output/graphs/package-size-stats.csv+, a CSV file giving the size |
| contribution of each package to the overall root filesystem size |
| |
| * +output/graphs/file-size-stats.csv+, a CSV file giving the size |
| contribution of each installed file to the package it belongs, and |
| to the overall filesystem size. |
| |
| This +graph-size+ target requires the Python Matplotlib library to be |
| installed (+python-matplotlib+ on most distributions), and also the |
| +argparse+ module if you're using a Python version older than 2.7 |
| (+python-argparse+ on most distributions). |
| |
| Just like for the duration graph, a +BR2_GRAPH_OUT+ environment variable |
| is supported to adjust the output file format. See xref:graph-depends[] |
| for details about this environment variable. |
| |
| Additionally, one may set the environment variable +BR2_GRAPH_SIZE_OPTS+ |
| to further control the generated graph. Accepted options are: |
| |
| * `--size-limit X`, `-l X`, will group all packages which individual |
| contribution is below `X` percent, to a single entry labelled _Others_ |
| in the graph. By default, `X=0.01`, which means packages each |
| contributing less than 1% are grouped under _Others_. Accepted values |
| are in the range `[0.0..1.0]`. |
| |
| * `--iec`, `--binary`, `--si`, `--decimal`, to use IEC (binary, powers |
| of 1024) or SI (decimal, powers of 1000; the default) prefixes. |
| |
| * `--biggest-first`, to sort packages in decreasing size order, rather |
| than in increasing size order. |
| |
| .Note |
| The collected filesystem size data is only meaningful after a complete |
| clean rebuild. Be sure to run +make clean all+ before using +make |
| graph-size+. |
| |
| To compare the root filesystem size of two different Buildroot compilations, |
| for example after adjusting the configuration or when switching to another |
| Buildroot release, use the +size-stats-compare+ script. It takes two |
| +file-size-stats.csv+ files (produced by +make graph-size+) as input. |
| Refer to the help text of this script for more details: |
| |
| ---- |
| utils/size-stats-compare -h |
| ---- |
| |
| [[top-level-parallel-build]] |
| === Top-level parallel build |
| |
| .Note |
| This section deals with a very experimental feature, which is known to |
| break even in some non-unusual situations. Use at your own risk. |
| |
| Buildroot has always been capable of using parallel build on a per |
| package basis: each package is built by Buildroot using +make -jN+ (or |
| the equivalent invocation for non-make-based build systems). The level |
| of parallelism is by default number of CPUs + 1, but it can be |
| adjusted using the +BR2_JLEVEL+ configuration option. |
| |
| Until 2020.02, Buildroot was however building packages in a serial |
| fashion: each package was built one after the other, without |
| parallelization of the build between packages. As of 2020.02, |
| Buildroot has experimental support for *top-level parallel build*, |
| which allows some signicant build time savings by building packages |
| that have no dependency relationship in parallel. This feature is |
| however marked as experimental and is known not to work in some cases. |
| |
| In order to use top-level parallel build, one must: |
| |
| . Enable the option +BR2_PER_PACKAGE_DIRECTORIES+ in the Buildroot |
| configuration |
| |
| . Use +make -jN+ when starting the Buildroot build |
| |
| Internally, the +BR2_PER_PACKAGE_DIRECTORIES+ will enable a mechanism |
| called *per-package directories*, which will have the following |
| effects: |
| |
| * Instead of a global _target_ directory and a global _host_ directory |
| common to all packages, per-package _target_ and _host_ directories |
| will be used, in +$(O)/per-package/<pkg>/target/+ and |
| +$(O)/per-package/<pkg>/host/+ respectively. Those folders will be |
| populated from the corresponding folders of the package dependencies |
| at the beginning of +<pkg>+ build. The compiler and all other tools |
| will therefore only be able to see and access files installed by |
| dependencies explicitly listed by +<pkg>+. |
| |
| * At the end of the build, the global _target_ and _host_ directories |
| will be populated, located in +$(O)/target+ and +$(O)/host+ |
| respectively. This means that during the build, those folders will |
| be empty and it's only at the very end of the build that they will |
| be populated. |
| |
| include::advanced.adoc[] |