| // -*- mode:doc; -*- |
| // vim: set syntax=asciidoc: |
| |
| [[full-rebuild]] |
| === Understanding when a full rebuild is necessary |
| |
| Buildroot does not attempt to detect what parts of the system should |
| be rebuilt when the system configuration is changed through +make |
| menuconfig+, +make xconfig+ or one of the other configuration |
| tools. In some cases, Buildroot should rebuild the entire system, in |
| some cases, only a specific subset of packages. But detecting this in |
| a completely reliable manner is very difficult, and therefore the |
| Buildroot developers have decided to simply not attempt to do this. |
| |
| Instead, it is the responsibility of the user to know when a full |
| rebuild is necessary. As a hint, here are a few rules of thumb that |
| can help you understand how to work with Buildroot: |
| |
| * When the target architecture configuration is changed, a complete |
| rebuild is needed. Changing the architecture variant, the binary |
| format or the floating point strategy for example has an impact on |
| the entire system. |
| |
| * When the toolchain configuration is changed, a complete rebuild |
| generally is needed. Changing the toolchain configuration often |
| involves changing the compiler version, the type of C library or |
| its configuration, or some other fundamental configuration item, |
| and these changes have an impact on the entire system. |
| |
| * When an additional package is added to the configuration, a full |
| rebuild is not necessarily needed. Buildroot will detect that this |
| package has never been built, and will build it. However, if this |
| package is a library that can optionally be used by packages that |
| have already been built, Buildroot will not automatically rebuild |
| those. Either you know which packages should be rebuilt, and you |
| can rebuild them manually, or you should do a full rebuild. For |
| example, let's suppose you have built a system with the +ctorrent+ |
| package, but without +openssl+. Your system works, but you realize |
| you would like to have SSL support in +ctorrent+, so you enable the |
| +openssl+ package in Buildroot configuration and restart the |
| build. Buildroot will detect that +openssl+ should be built and |
| will be build it, but it will not detect that +ctorrent+ should be |
| rebuilt to benefit from +openssl+ to add OpenSSL support. You will |
| either have to do a full rebuild, or rebuild +ctorrent+ itself. |
| |
| * When a package is removed from the configuration, Buildroot does |
| not do anything special. It does not remove the files installed by |
| this package from the target root filesystem or from the toolchain |
| _sysroot_. A full rebuild is needed to get rid of this |
| package. However, generally you don't necessarily need this package |
| to be removed right now: you can wait for the next lunch break to |
| restart the build from scratch. |
| |
| * When the sub-options of a package are changed, the package is not |
| automatically rebuilt. After making such changes, rebuilding only |
| this package is often sufficient, unless enabling the package |
| sub-option adds some features to the package that are useful for |
| another package which has already been built. Again, Buildroot does |
| not track when a package should be rebuilt: once a package has been |
| built, it is never rebuilt unless explicitly told to do so. |
| |
| * When a change to the root filesystem skeleton is made, a full |
| rebuild is needed. However, when changes to the root filesystem |
| overlay, a post-build script or a post-image script are made, |
| there is no need for a full rebuild: a simple +make+ invocation |
| will take the changes into account. |
| |
| * When a package listed in +FOO_DEPENDENCIES+ is rebuilt or removed, |
| the package +foo+ is not automatically rebuilt. For example, if a |
| package +bar+ is listed in +FOO_DEPENDENCIES+ with +FOO_DEPENDENCIES |
| = bar+ and the configuration of the +bar+ package is changed, the |
| configuration change would not result in a rebuild of package +foo+ |
| automatically. In this scenario, you may need to either rebuild any |
| packages in your build which reference +bar+ in their +DEPENDENCIES+, |
| or perform a full rebuild to ensure any +bar+ dependent packages are |
| up to date. |
| |
| Generally speaking, when you're facing a build error and you're unsure |
| of the potential consequences of the configuration changes you've |
| made, do a full rebuild. If you get the same build error, then you are |
| sure that the error is not related to partial rebuilds of packages, |
| and if this error occurs with packages from the official Buildroot, do |
| not hesitate to report the problem! As your experience with Buildroot |
| progresses, you will progressively learn when a full rebuild is really |
| necessary, and you will save more and more time. |
| |
| For reference, a full rebuild is achieved by running: |
| |
| --------------- |
| $ make clean all |
| --------------- |
| |
| [[rebuild-pkg]] |
| === Understanding how to rebuild packages |
| |
| One of the most common questions asked by Buildroot users is how to |
| rebuild a given package or how to remove a package without rebuilding |
| everything from scratch. |
| |
| Removing a package is unsupported by Buildroot without |
| rebuilding from scratch. This is because Buildroot doesn't keep track |
| of which package installs what files in the +output/staging+ and |
| +output/target+ directories, or which package would be compiled differently |
| depending on the availability of another package. |
| |
| The easiest way to rebuild a single package from scratch is to remove |
| its build directory in +output/build+. Buildroot will then re-extract, |
| re-configure, re-compile and re-install this package from scratch. You |
| can ask buildroot to do this with the +make <package>-dirclean+ command. |
| |
| On the other hand, if you only want to restart the build process of a |
| package from its compilation step, you can run +make <package>-rebuild+. It |
| will restart the compilation and installation of the package, but not from |
| scratch: it basically re-executes +make+ and +make install+ inside the package, |
| so it will only rebuild files that changed. |
| |
| If you want to restart the build process of a package from its configuration |
| step, you can run +make <package>-reconfigure+. It will restart the |
| configuration, compilation and installation of the package. |
| |
| While +<package>-rebuild+ implies +<package>-reinstall+ and |
| +<package>-reconfigure+ implies +<package>-rebuild+, these targets as well |
| as +<package>+ only act on the said package, and do not trigger re-creating |
| the root filesystem image. If re-creating the root filesystem in necessary, |
| one should in addition run +make+ or +make all+. |
| |
| Internally, Buildroot creates so-called _stamp files_ to keep track of |
| which build steps have been completed for each package. They are |
| stored in the package build directory, |
| +output/build/<package>-<version>/+ and are named |
| +.stamp_<step-name>+. The commands detailed above simply manipulate |
| these stamp files to force Buildroot to restart a specific set of |
| steps of a package build process. |
| |
| Further details about package special make targets are explained in |
| xref:pkg-build-steps[]. |