// -*- mode:doc; -*- // vim: set syntax=asciidoc: [[customize-dir-structure]] === Recommended directory structure When customizing Buildroot for your project, you will be creating one or more project-specific files that need to be stored somewhere. While most of these files could be placed in _any_ location as their path is to be specified in the Buildroot configuration, the Buildroot developers recommend a specific directory structure which is described in this section. Orthogonal to this directory structure, you can choose _where_ you place this structure itself: either inside the Buildroot tree, or outside of it using a br2-external tree. Both options are valid, the choice is up to you. ----- +-- board/ | +-- / | +-- / | +-- linux.config | +-- busybox.config | +-- | +-- post_build.sh | +-- post_image.sh | +-- rootfs_overlay/ | | +-- etc/ | | +-- | +-- patches/ | +-- foo/ | | +-- | +-- libbar/ | +-- | +-- configs/ | +-- _defconfig | +-- package/ | +-- / | +-- Config.in (if not using a br2-external tree) | +-- .mk (if not using a br2-external tree) | +-- package1/ | | +-- Config.in | | +-- package1.mk | +-- package2/ | +-- Config.in | +-- package2.mk | +-- Config.in (if using a br2-external tree) +-- external.mk (if using a br2-external tree) +-- external.desc (if using a br2-external tree) ------ Details on the files shown above are given further in this chapter. Note: if you choose to place this structure outside of the Buildroot tree but in a br2-external tree, the and possibly components may be superfluous and can be left out. ==== Implementing layered customizations It is quite common for a user to have several related projects that partly need the same customizations. Instead of duplicating these customizations for each project, it is recommended to use a layered customization approach, as explained in this section. Almost all of the customization methods available in Buildroot, like post-build scripts and root filesystem overlays, accept a space-separated list of items. The specified items are always treated in order, from left to right. By creating more than one such item, one for the common customizations and another one for the really project-specific customizations, you can avoid unnecessary duplication. Each layer is typically embodied by a separate directory inside +board//+. Depending on your projects, you could even introduce more than two layers. An example directory structure for where a user has two customization layers 'common' and 'fooboard' is: ----- +-- board/ +-- / +-- common/ | +-- post_build.sh | +-- rootfs_overlay/ | | +-- ... | +-- patches/ | +-- ... | +-- fooboard/ +-- linux.config +-- busybox.config +-- +-- post_build.sh +-- rootfs_overlay/ | +-- ... +-- patches/ +-- ... ----- For example, if the user has the +BR2_GLOBAL_PATCH_DIR+ configuration option set as: ----- BR2_GLOBAL_PATCH_DIR="board//common/patches board//fooboard/patches" ----- then first the patches from the 'common' layer would be applied, followed by the patches from the 'fooboard' layer.