Build system ============ This page explains internals of the Gluon build system. It is currently very incomplete; please contribute if you can! Feed management --------------- Rather that relying on the *feed.conf* mechanism of OpenWrt directly, Gluon manages its feeds (*"modules"*) using a collection of scripts. This solution was selected for multiple reasons: - Feeds lists from Gluon base and the site repository are combined - Patchsets are applied to downloaded feed repositories automatically The following variables specifically affect the feed management: GLUON_FEEDS List of base feeds; defined in file *modules* in Gluon base GLUON_SITE_FEED List of site feeds; defined in file *modules* in site config \*_REPO, \*_BRANCH, \*_COMMIT Git repository URL, branch and and commit ID of the feeds to use. The branch name may be omitted; the default branch will be used in this case. GLUON_BASE_FEEDS Additional feed definitions to be added to *feeds.conf* verbatim. By default, this contains a reference to the Gluon base packages; when using the Gluon build system to build a non-Gluon system, the variable can be set to the empty string. Helper scripts -------------- Several tasks of the build process have been separated from the Makefile into external scripts, which are stored in the *scripts* directory. This was done to ease maintenance of these scripts and the Makefile, by avoiding a lot of escaping. These scripts are either bash or Lua scripts that run on the build system. default_feeds.sh Defines the constant ``DEFAULT_FEEDS`` with the names of all feeds listed in *openwrt/feeds.conf.default*. This script is only used as an include by other scripts. feeds.sh Creates the *openwrt/feeds.conf* file from ``FEEDS`` and ``DEFAULT_FEEDS``. The feeds from ``FEEDS`` are linked to the matching subfolder of *packages/* and not explicitly defined feeds of ``DEFAULT_FEEDS`` are setup as dummy (src-dummy). This *openwrt/feeds.conf* is used to reinstall all packages of all feeds with the *openwrt/scripts/feeds* tool. modules.sh Defines the constant ``GLUON_MODULES`` and ``FEEDS`` by reading the *modules* file of the root-folder and the site-folder. The returned variables look like: - ``FEEDS``: "*feedA feedB ...*" - ``GLUON_MODULES``: "*openwrt packages/feedA packages/feedB ...*" This script is only used as an include by other scripts. patch.sh (Re-)applies the patches from the *patches* directory to all ``GLUON_MODULES`` and checks out the files to the filesystem. This is done for each repo by: - creating a temporary clone of the downloaded repo from the *packages* folder - use only branch *base* - applying all patches via *git am* on top of this temporary *base* branch - name this branch *patched* - copying the temporary clone to the *packages* folder - use *git fetch* with the temporary clone as source - call *git checkout* to update the filesystem - updating all git submodules This two directory solution ensures that the current *packages* folder wwill not be changed until all patches apply. And avoids touching the patched files, when only the underlying *base* branch is changed, which prevents them from triggering a recompilation. update.sh Sets up a working clone of the ``GLUON_MODULES`` (external repos) from the external source and installs it into *packages/* directory. It simply tries to set the *base* branch of the cloned repo to the correct commit. If this fails it fetches the upstream branch and tries again to set the local *base* branch.