use relative layer dirs to make build relocatable

This patch replaces the absolute paths that are injected into BBLAYERS
by relative ones. These are relative to TOPDIR.
By that, the whole build directory becomes relocatable.

This is of value when using a shared sstate cache and build machines
with varying build locations (e.g. gitlab-ci runners).

Signed-off-by: Felix Moessbauer <felix.moessbauer@siemens.com>
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
This commit is contained in:
Felix Moessbauer 2022-04-27 14:10:31 +02:00 committed by Jan Kiszka
parent b3405be5e8
commit 94e0e999f2
2 changed files with 19 additions and 6 deletions

View File

@ -260,6 +260,16 @@ class WriteBBConfig(Command):
return 'write_bbconfig'
def execute(self, ctx):
def _get_layer_path_under_topdir(ctx, layer):
"""
Returns a path relative to ${TOPDIR}.
TOPDIR is a BB variable pointing to the build directory.
It is not expanded by KAS, hence we avoid
absolute paths pointing into the build host.
"""
relpath = os.path.relpath(layer, ctx.build_dir)
return '${TOPDIR}/' + relpath
def _write_bblayers_conf(ctx):
filename = ctx.build_dir + '/conf/bblayers.conf'
if not os.path.isdir(os.path.dirname(filename)):
@ -268,7 +278,8 @@ class WriteBBConfig(Command):
fds.write(ctx.config.get_bblayers_conf_header())
fds.write('BBLAYERS ?= " \\\n ')
fds.write(' \\\n '.join(
sorted(layer for repo in ctx.config.get_repos()
sorted(_get_layer_path_under_topdir(ctx, layer)
for repo in ctx.config.get_repos()
for layer in repo.layers)))
fds.write('"\n')
fds.write('BBPATH ?= "${TOPDIR}"\n')

View File

@ -26,6 +26,8 @@ from kas import kas
import pytest
LAYERBASE = '${TOPDIR}/..'
@pytest.fixture
def dokas(tmpdir):
@ -42,7 +44,7 @@ def test_layers_default(dokas):
match = 0
with open('build/conf/bblayers.conf', 'r') as f:
for line in f:
if 'test_layers/kas ' in line:
if '{}/kas '.format(LAYERBASE) in line:
match += 1
assert(match == 1)
@ -51,7 +53,7 @@ def test_layers_include(dokas):
match = 0
with open('build/conf/bblayers.conf', 'r') as f:
for line in f:
if 'test_layers/kas1/meta-' in line:
if '{}/kas1/meta-'.format(LAYERBASE) in line:
match += 1
assert(match == 2)
@ -59,11 +61,11 @@ def test_layers_include(dokas):
def test_layers_exclude(dokas):
with open('build/conf/bblayers.conf', 'r') as f:
for line in f:
assert('test_layers/kas2' not in line)
assert('{}/kas2'.format(LAYERBASE) not in line)
def test_layers_strip_dot(dokas):
with open('build/conf/bblayers.conf', 'r') as f:
lines = f.readlines()
assert(any('test_layers/kas3 ' in x for x in lines))
assert(any('test_layers/kas3/meta-bar' in x for x in lines))
assert(any('{}/kas3 '.format(LAYERBASE) in x for x in lines))
assert(any('{}/kas3/meta-bar'.format(LAYERBASE) in x for x in lines))