bitbake-layers: add a command to save the active build configuration as a template into a layer

This is the reverse of setting up a build by pointing TEMPLATECONF to a directory
with a template and running '. oe-init-build-env': this takes the config files from build/conf,
replaces site-specific paths in bblayers.conf with ##OECORE##-relative paths, and copies
the config files into a specified layer under a specified template name.

In many or perhaps most cases such static prefabricated configurations (that require no
further editing) are just enough, and I believe they should be offered by the
official configuration management. On the other hand, generating build configurations with a
sufficiently versatile tool is a far more complex problem, and one we should try to tackle
once we see where and how static configs fall short.

Tooling to discover and select these templates when setting up a build will be provided later on.

How to use:

alex@Zen2:/srv/work/alex/poky/build-layersetup$ bitbake-layers save-build-conf ../../meta-alex/ test-1
NOTE: Starting bitbake server...
NOTE: Configuration template placed into /srv/work/alex/meta-alex/conf/templates/test-1
Please review the files in there, and particularly provide a configuration description in /srv/work/alex/meta-alex/conf/templates/test-1/conf-notes.txt
You can try out the configuration with
TEMPLATECONF=/srv/work/alex/meta-alex/conf/templates/test-1 . /srv/work/alex/poky/oe-init-build-env build-try-test-1
alex@Zen2:/srv/work/alex/poky/build-layersetup$

(From OE-Core rev: f319534dc8fc68dfe120d129154a509f0cd6a3b0)

Signed-off-by: Alexander Kanavin <alex@linutronix.de>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Alexander Kanavin 2022-08-31 13:13:56 +02:00 committed by Richard Purdie
parent 8791c77a40
commit 3f9e3feb22
2 changed files with 90 additions and 0 deletions

View File

@ -0,0 +1,85 @@
#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: GPL-2.0-only
#
import logging
import os
import stat
import sys
import shutil
import json
import bb.utils
import bb.process
from bblayers.common import LayerPlugin
logger = logging.getLogger('bitbake-layers')
sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))
import oe.buildcfg
def plugin_init(plugins):
return BuildConfPlugin()
class BuildConfPlugin(LayerPlugin):
notes_fixme = """FIXME: Please place here the description of this build configuration.
It will be shown to the users when they set up their builds via TEMPLATECONF.
"""
def _save_conf(self, templatename, templatepath, oecorepath, relpaths_to_oecore):
confdir = os.path.join(os.environ["BBPATH"], "conf")
destdir = os.path.join(templatepath, "conf", "templates", templatename)
os.makedirs(destdir, exist_ok=True)
with open(os.path.join(confdir, "local.conf")) as src:
with open(os.path.join(destdir, "local.conf.sample"), 'w') as dest:
dest.write(src.read())
with open(os.path.join(confdir, "bblayers.conf")) as src:
with open(os.path.join(destdir, "bblayers.conf.sample"), 'w') as dest:
bblayers_data = src.read()
for (abspath, relpath) in relpaths_to_oecore:
bblayers_data = bblayers_data.replace(abspath, "##OEROOT##/" + relpath)
dest.write(bblayers_data)
with open(os.path.join(destdir, "conf-notes.txt"), 'w') as dest:
dest.write(self.notes_fixme)
logger.info("""Configuration template placed into {}
Please review the files in there, and particularly provide a configuration description in {}
You can try out the configuration with
TEMPLATECONF={} . {}/oe-init-build-env build-try-{}"""
.format(destdir, os.path.join(destdir, "conf-notes.txt"), destdir, oecorepath, templatename))
def do_save_build_conf(self, args):
""" Save the currently active build configuration (conf/local.conf, conf/bblayers.conf) as a template into a layer.\n This template can later be used for setting up builds via TEMPLATECONF. """
repos = {}
layers = oe.buildcfg.get_layer_revisions(self.tinfoil.config_data)
targetlayer = None
oecore = None
for l in layers:
if l[0] == os.path.abspath(args.layerpath):
targetlayer = l[0]
if l[1] == 'meta':
oecore = os.path.dirname(l[0])
if not targetlayer:
logger.error("Layer {} not in one of the currently enabled layers:\n{}".format(args.layerpath, "\n".join([l[0] for l in layers])))
elif not oecore:
logger.error("Openembedded-core not in one of the currently enabled layers:\n{}".format("\n".join([l[0] for l in layers])))
else:
relpaths_to_oecore = [(l[0], os.path.relpath(l[0], start=oecore)) for l in layers]
self._save_conf(args.templatename, targetlayer, oecore, relpaths_to_oecore)
def register_commands(self, sp):
parser_build_conf = self.add_command(sp, 'save-build-conf', self.do_save_build_conf, parserecipes=False)
parser_build_conf.add_argument('layerpath',
help='The path to the layer where the configuration template should be saved.')
parser_build_conf.add_argument('templatename',
help='The name of the configuration template.')

View File

@ -113,6 +113,11 @@ class BitbakeLayers(OESelftestTestCase):
self.assertEqual(bb_vars['BBFILE_PRIORITY_%s' % layername], str(priority), 'BBFILE_PRIORITY_%s != %d' % (layername, priority))
result = runCmd('bitbake-layers save-build-conf {} {}'.format(layerpath, "buildconf-1"))
for f in ('local.conf.sample', 'bblayers.conf.sample', 'conf-notes.txt'):
fullpath = os.path.join(layerpath, "conf", "templates", "buildconf-1", f)
self.assertTrue(os.path.exists(fullpath), "Template configuration file {} not found".format(fullpath))
def get_recipe_basename(self, recipe):
recipe_file = ""
result = runCmd("bitbake-layers show-recipes -f %s" % recipe)