Complete Yocto mirror with license table for TQMa6UL (2038-compliance)

- 264 license table entries with exact download URLs (224/264 resolved)
- Complete sources/ directory with all BitBake recipes
- Build configuration: tqma6ul-multi-mba6ulx, spaetzle (musl)
- Full traceability for Softwarefreigabeantrag
- GCC 13.4.0, Linux 6.6.102, U-Boot 2023.04, musl 1.2.4
- License distribution: GPL-2.0 (24), MIT (23), GPL-2.0+ (18), BSD-3 (16)
This commit is contained in:
Siggi (OpenClaw Agent)
2026-03-01 20:58:18 +00:00
commit 16accb6b24
15086 changed files with 1292356 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
# Copyright (C) 2017-2018 Wind River Systems, Inc.
#
# SPDX-License-Identifier: GPL-2.0-only
#
import unittest
import tempfile
import os
import bb
import logging
class LayersTest(unittest.TestCase):
def setUp(self):
self.origdir = os.getcwd()
self.d = bb.data.init()
# At least one variable needs to be set
self.d.setVar('DL_DIR', os.getcwd())
if os.environ.get("BB_SKIP_NETTESTS") == "yes":
self.d.setVar('BB_NO_NETWORK', '1')
self.tempdir = tempfile.mkdtemp()
self.logger = logging.getLogger("BitBake")
def tearDown(self):
os.chdir(self.origdir)
if os.environ.get("BB_TMPDIR_NOCLEAN") == "yes":
print("Not cleaning up %s. Please remove manually." % self.tempdir)
else:
bb.utils.prunedir(self.tempdir)

View File

@@ -0,0 +1,110 @@
# Copyright (C) 2018 Wind River Systems, Inc.
#
# SPDX-License-Identifier: GPL-2.0-only
#
import os
import bb
import layerindexlib
from layerindexlib.tests.common import LayersTest
class LayerIndexCookerTest(LayersTest):
def setUp(self):
LayersTest.setUp(self)
# Note this is NOT a comprehensive test of cooker, as we can't easily
# configure the test data. But we can emulate the basics of the layer.conf
# files, so that is what we will do.
new_topdir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "testdata")
new_bbpath = os.path.join(new_topdir, "build")
self.d.setVar('TOPDIR', new_topdir)
self.d.setVar('BBPATH', new_bbpath)
self.d = bb.parse.handle("%s/conf/bblayers.conf" % new_bbpath, self.d, True)
for layer in self.d.getVar('BBLAYERS').split():
self.d = bb.parse.handle("%s/conf/layer.conf" % layer, self.d, True)
self.layerindex = layerindexlib.LayerIndex(self.d)
self.layerindex.load_layerindex('cooker://', load=['layerDependencies'])
def test_layerindex_is_empty(self):
self.assertFalse(self.layerindex.is_empty(), msg="Layerindex is not empty!")
def test_dependency_resolution(self):
# Verify depth first searching...
(dependencies, invalidnames) = self.layerindex.find_dependencies(names=['meta-python'])
first = True
for deplayerbranch in dependencies:
layerBranch = dependencies[deplayerbranch][0]
layerDeps = dependencies[deplayerbranch][1:]
if not first:
continue
first = False
# Top of the deps should be openembedded-core, since everything depends on it.
self.assertEqual(layerBranch.layer.name, "openembedded-core", msg='Top dependency not openembedded-core')
# meta-python should cause an openembedded-core dependency, if not assert!
for dep in layerDeps:
if dep.layer.name == 'meta-python':
break
else:
self.assertTrue(False, msg='meta-python was not found')
# Only check the first element...
break
else:
if first:
# Empty list, this is bad.
self.assertTrue(False, msg='Empty list of dependencies')
# Last dep should be the requested item
layerBranch = dependencies[deplayerbranch][0]
self.assertEqual(layerBranch.layer.name, "meta-python", msg='Last dependency not meta-python')
def test_find_collection(self):
def _check(collection, expected):
self.logger.debug("Looking for collection %s..." % collection)
result = self.layerindex.find_collection(collection)
if expected:
self.assertIsNotNone(result, msg="Did not find %s when it shouldn't be there" % collection)
else:
self.assertIsNone(result, msg="Found %s when it should be there" % collection)
tests = [ ('core', True),
('openembedded-core', False),
('networking-layer', True),
('meta-python', True),
('openembedded-layer', True),
('notpresent', False) ]
for collection,result in tests:
_check(collection, result)
def test_find_layerbranch(self):
def _check(name, expected):
self.logger.debug("Looking for layerbranch %s..." % name)
result = self.layerindex.find_layerbranch(name)
if expected:
self.assertIsNotNone(result, msg="Did not find %s when it shouldn't be there" % collection)
else:
self.assertIsNone(result, msg="Found %s when it should be there" % collection)
tests = [ ('openembedded-core', True),
('core', False),
('networking-layer', True),
('meta-python', True),
('openembedded-layer', True),
('notpresent', False) ]
for collection,result in tests:
_check(collection, result)

View File

@@ -0,0 +1,210 @@
# Copyright (C) 2017-2018 Wind River Systems, Inc.
#
# SPDX-License-Identifier: GPL-2.0-only
#
from layerindexlib.tests.common import LayersTest
class LayerIndexObjectsTest(LayersTest):
def setUp(self):
from layerindexlib import LayerIndexObj, Branch, LayerItem, LayerBranch, LayerDependency, Recipe, Machine, Distro
LayersTest.setUp(self)
self.index = LayerIndexObj()
branchId = 0
layerItemId = 0
layerBranchId = 0
layerDependencyId = 0
recipeId = 0
machineId = 0
distroId = 0
self.index.branches = {}
self.index.layerItems = {}
self.index.layerBranches = {}
self.index.layerDependencies = {}
self.index.recipes = {}
self.index.machines = {}
self.index.distros = {}
branchId += 1
self.index.branches[branchId] = Branch(self.index)
self.index.branches[branchId].define_data(branchId,
'test_branch', 'bb_test_branch')
self.index.branches[branchId].lockData()
layerItemId +=1
self.index.layerItems[layerItemId] = LayerItem(self.index)
self.index.layerItems[layerItemId].define_data(layerItemId,
'test_layerItem', vcs_url='git://git_test_url/test_layerItem')
self.index.layerItems[layerItemId].lockData()
layerBranchId +=1
self.index.layerBranches[layerBranchId] = LayerBranch(self.index)
self.index.layerBranches[layerBranchId].define_data(layerBranchId,
'test_collection', '99', layerItemId,
branchId)
recipeId += 1
self.index.recipes[recipeId] = Recipe(self.index)
self.index.recipes[recipeId].define_data(recipeId, 'test_git.bb',
'recipes-test', 'test', 'git',
layerBranchId)
machineId += 1
self.index.machines[machineId] = Machine(self.index)
self.index.machines[machineId].define_data(machineId,
'test_machine', 'test_machine',
layerBranchId)
distroId += 1
self.index.distros[distroId] = Distro(self.index)
self.index.distros[distroId].define_data(distroId,
'test_distro', 'test_distro',
layerBranchId)
layerItemId +=1
self.index.layerItems[layerItemId] = LayerItem(self.index)
self.index.layerItems[layerItemId].define_data(layerItemId, 'test_layerItem 2',
vcs_url='git://git_test_url/test_layerItem')
layerBranchId +=1
self.index.layerBranches[layerBranchId] = LayerBranch(self.index)
self.index.layerBranches[layerBranchId].define_data(layerBranchId,
'test_collection_2', '72', layerItemId,
branchId, actual_branch='some_other_branch')
layerDependencyId += 1
self.index.layerDependencies[layerDependencyId] = LayerDependency(self.index)
self.index.layerDependencies[layerDependencyId].define_data(layerDependencyId,
layerBranchId, 1)
layerDependencyId += 1
self.index.layerDependencies[layerDependencyId] = LayerDependency(self.index)
self.index.layerDependencies[layerDependencyId].define_data(layerDependencyId,
layerBranchId, 1, required=False)
def test_branch(self):
branch = self.index.branches[1]
self.assertEqual(branch.id, 1)
self.assertEqual(branch.name, 'test_branch')
self.assertEqual(branch.short_description, 'test_branch')
self.assertEqual(branch.bitbake_branch, 'bb_test_branch')
def test_layerItem(self):
layerItem = self.index.layerItems[1]
self.assertEqual(layerItem.id, 1)
self.assertEqual(layerItem.name, 'test_layerItem')
self.assertEqual(layerItem.summary, 'test_layerItem')
self.assertEqual(layerItem.description, 'test_layerItem')
self.assertEqual(layerItem.vcs_url, 'git://git_test_url/test_layerItem')
self.assertEqual(layerItem.vcs_web_url, None)
self.assertIsNone(layerItem.vcs_web_tree_base_url)
self.assertIsNone(layerItem.vcs_web_file_base_url)
self.assertIsNotNone(layerItem.updated)
layerItem = self.index.layerItems[2]
self.assertEqual(layerItem.id, 2)
self.assertEqual(layerItem.name, 'test_layerItem 2')
self.assertEqual(layerItem.summary, 'test_layerItem 2')
self.assertEqual(layerItem.description, 'test_layerItem 2')
self.assertEqual(layerItem.vcs_url, 'git://git_test_url/test_layerItem')
self.assertIsNone(layerItem.vcs_web_url)
self.assertIsNone(layerItem.vcs_web_tree_base_url)
self.assertIsNone(layerItem.vcs_web_file_base_url)
self.assertIsNotNone(layerItem.updated)
def test_layerBranch(self):
layerBranch = self.index.layerBranches[1]
self.assertEqual(layerBranch.id, 1)
self.assertEqual(layerBranch.collection, 'test_collection')
self.assertEqual(layerBranch.version, '99')
self.assertEqual(layerBranch.vcs_subdir, '')
self.assertEqual(layerBranch.actual_branch, 'test_branch')
self.assertIsNotNone(layerBranch.updated)
self.assertEqual(layerBranch.layer_id, 1)
self.assertEqual(layerBranch.branch_id, 1)
self.assertEqual(layerBranch.layer, self.index.layerItems[1])
self.assertEqual(layerBranch.branch, self.index.branches[1])
layerBranch = self.index.layerBranches[2]
self.assertEqual(layerBranch.id, 2)
self.assertEqual(layerBranch.collection, 'test_collection_2')
self.assertEqual(layerBranch.version, '72')
self.assertEqual(layerBranch.vcs_subdir, '')
self.assertEqual(layerBranch.actual_branch, 'some_other_branch')
self.assertIsNotNone(layerBranch.updated)
self.assertEqual(layerBranch.layer_id, 2)
self.assertEqual(layerBranch.branch_id, 1)
self.assertEqual(layerBranch.layer, self.index.layerItems[2])
self.assertEqual(layerBranch.branch, self.index.branches[1])
def test_layerDependency(self):
layerDependency = self.index.layerDependencies[1]
self.assertEqual(layerDependency.id, 1)
self.assertEqual(layerDependency.layerbranch_id, 2)
self.assertEqual(layerDependency.layerbranch, self.index.layerBranches[2])
self.assertEqual(layerDependency.layer_id, 2)
self.assertEqual(layerDependency.layer, self.index.layerItems[2])
self.assertTrue(layerDependency.required)
self.assertEqual(layerDependency.dependency_id, 1)
self.assertEqual(layerDependency.dependency, self.index.layerItems[1])
self.assertEqual(layerDependency.dependency_layerBranch, self.index.layerBranches[1])
layerDependency = self.index.layerDependencies[2]
self.assertEqual(layerDependency.id, 2)
self.assertEqual(layerDependency.layerbranch_id, 2)
self.assertEqual(layerDependency.layerbranch, self.index.layerBranches[2])
self.assertEqual(layerDependency.layer_id, 2)
self.assertEqual(layerDependency.layer, self.index.layerItems[2])
self.assertFalse(layerDependency.required)
self.assertEqual(layerDependency.dependency_id, 1)
self.assertEqual(layerDependency.dependency, self.index.layerItems[1])
self.assertEqual(layerDependency.dependency_layerBranch, self.index.layerBranches[1])
def test_recipe(self):
recipe = self.index.recipes[1]
self.assertEqual(recipe.id, 1)
self.assertEqual(recipe.layerbranch_id, 1)
self.assertEqual(recipe.layerbranch, self.index.layerBranches[1])
self.assertEqual(recipe.layer_id, 1)
self.assertEqual(recipe.layer, self.index.layerItems[1])
self.assertEqual(recipe.filename, 'test_git.bb')
self.assertEqual(recipe.filepath, 'recipes-test')
self.assertEqual(recipe.fullpath, 'recipes-test/test_git.bb')
self.assertEqual(recipe.summary, "")
self.assertEqual(recipe.description, "")
self.assertEqual(recipe.section, "")
self.assertEqual(recipe.pn, 'test')
self.assertEqual(recipe.pv, 'git')
self.assertEqual(recipe.license, "")
self.assertEqual(recipe.homepage, "")
self.assertEqual(recipe.bugtracker, "")
self.assertEqual(recipe.provides, "")
self.assertIsNotNone(recipe.updated)
self.assertEqual(recipe.inherits, "")
def test_machine(self):
machine = self.index.machines[1]
self.assertEqual(machine.id, 1)
self.assertEqual(machine.layerbranch_id, 1)
self.assertEqual(machine.layerbranch, self.index.layerBranches[1])
self.assertEqual(machine.layer_id, 1)
self.assertEqual(machine.layer, self.index.layerItems[1])
self.assertEqual(machine.name, 'test_machine')
self.assertEqual(machine.description, 'test_machine')
self.assertIsNotNone(machine.updated)
def test_distro(self):
distro = self.index.distros[1]
self.assertEqual(distro.id, 1)
self.assertEqual(distro.layerbranch_id, 1)
self.assertEqual(distro.layerbranch, self.index.layerBranches[1])
self.assertEqual(distro.layer_id, 1)
self.assertEqual(distro.layer, self.index.layerItems[1])
self.assertEqual(distro.name, 'test_distro')
self.assertEqual(distro.description, 'test_distro')
self.assertIsNotNone(distro.updated)

View File

@@ -0,0 +1,171 @@
# Copyright (C) 2017-2018 Wind River Systems, Inc.
#
# SPDX-License-Identifier: GPL-2.0-only
#
import unittest
import os
import layerindexlib
from layerindexlib.tests.common import LayersTest
def skipIfNoNetwork():
if os.environ.get("BB_SKIP_NETTESTS") == "yes":
return unittest.skip("Network tests being skipped")
return lambda f: f
class LayerIndexWebRestApiTest(LayersTest):
@skipIfNoNetwork()
def setUp(self):
self.assertFalse(os.environ.get("BB_SKIP_NETTESTS") == "yes", msg="BB_SKIP_NETTESTS set, but we tried to test anyway")
LayersTest.setUp(self)
self.layerindex = layerindexlib.LayerIndex(self.d)
self.layerindex.load_layerindex('https://layers.openembedded.org/layerindex/api/;branch=sumo', load=['layerDependencies'])
@skipIfNoNetwork()
def test_layerindex_is_empty(self):
self.assertFalse(self.layerindex.is_empty(), msg="Layerindex is empty")
@skipIfNoNetwork()
def test_layerindex_store_file(self):
self.layerindex.store_layerindex('file://%s/file.json' % self.tempdir, self.layerindex.indexes[0])
self.assertTrue(os.path.isfile('%s/file.json' % self.tempdir), msg="Temporary file was not created by store_layerindex")
reload = layerindexlib.LayerIndex(self.d)
reload.load_layerindex('file://%s/file.json' % self.tempdir)
self.assertFalse(reload.is_empty(), msg="Layerindex is empty")
# Calculate layerItems in original index that should NOT be in reload
layerItemNames = []
for itemId in self.layerindex.indexes[0].layerItems:
layerItemNames.append(self.layerindex.indexes[0].layerItems[itemId].name)
for layerBranchId in self.layerindex.indexes[0].layerBranches:
layerItemNames.remove(self.layerindex.indexes[0].layerBranches[layerBranchId].layer.name)
for itemId in reload.indexes[0].layerItems:
self.assertFalse(reload.indexes[0].layerItems[itemId].name in layerItemNames, msg="Item reloaded when it shouldn't have been")
# Compare the original to what we wrote...
for type in self.layerindex.indexes[0]._index:
if type == 'apilinks' or \
type == 'layerItems' or \
type in self.layerindex.indexes[0].config['local']:
continue
for id in getattr(self.layerindex.indexes[0], type):
self.logger.debug("type %s" % (type))
self.assertTrue(id in getattr(reload.indexes[0], type), msg="Id number not in reloaded index")
self.logger.debug("%s ? %s" % (getattr(self.layerindex.indexes[0], type)[id], getattr(reload.indexes[0], type)[id]))
self.assertEqual(getattr(self.layerindex.indexes[0], type)[id], getattr(reload.indexes[0], type)[id], msg="Reloaded contents different")
@skipIfNoNetwork()
def test_layerindex_store_split(self):
self.layerindex.store_layerindex('file://%s' % self.tempdir, self.layerindex.indexes[0])
reload = layerindexlib.LayerIndex(self.d)
reload.load_layerindex('file://%s' % self.tempdir)
self.assertFalse(reload.is_empty(), msg="Layer index is empty")
for type in self.layerindex.indexes[0]._index:
if type == 'apilinks' or \
type == 'layerItems' or \
type in self.layerindex.indexes[0].config['local']:
continue
for id in getattr(self.layerindex.indexes[0] ,type):
self.logger.debug("type %s" % (type))
self.assertTrue(id in getattr(reload.indexes[0], type), msg="Id number missing from reloaded data")
self.logger.debug("%s ? %s" % (getattr(self.layerindex.indexes[0] ,type)[id], getattr(reload.indexes[0], type)[id]))
self.assertEqual(getattr(self.layerindex.indexes[0] ,type)[id], getattr(reload.indexes[0], type)[id], msg="reloaded data does not match original")
@skipIfNoNetwork()
def test_dependency_resolution(self):
# Verify depth first searching...
(dependencies, invalidnames) = self.layerindex.find_dependencies(names=['meta-python'])
first = True
for deplayerbranch in dependencies:
layerBranch = dependencies[deplayerbranch][0]
layerDeps = dependencies[deplayerbranch][1:]
if not first:
continue
first = False
# Top of the deps should be openembedded-core, since everything depends on it.
self.assertEqual(layerBranch.layer.name, "openembedded-core", msg='OpenEmbedded-Core is no the first dependency')
# meta-python should cause an openembedded-core dependency, if not assert!
for dep in layerDeps:
if dep.layer.name == 'meta-python':
break
else:
self.logger.debug("meta-python was not found")
raise self.failureException
# Only check the first element...
break
else:
# Empty list, this is bad.
self.logger.debug("Empty list of dependencies")
self.assertIsNotNone(first, msg="Empty list of dependencies")
# Last dep should be the requested item
layerBranch = dependencies[deplayerbranch][0]
self.assertEqual(layerBranch.layer.name, "meta-python", msg="Last dependency not meta-python")
@skipIfNoNetwork()
def test_find_collection(self):
def _check(collection, expected):
self.logger.debug("Looking for collection %s..." % collection)
result = self.layerindex.find_collection(collection)
if expected:
self.assertIsNotNone(result, msg="Did not find %s when it should be there" % collection)
else:
self.assertIsNone(result, msg="Found %s when it shouldn't be there" % collection)
tests = [ ('core', True),
('openembedded-core', False),
('networking-layer', True),
('meta-python', True),
('openembedded-layer', True),
('notpresent', False) ]
for collection,result in tests:
_check(collection, result)
@skipIfNoNetwork()
def test_find_layerbranch(self):
def _check(name, expected):
self.logger.debug("Looking for layerbranch %s..." % name)
for index in self.layerindex.indexes:
for layerbranchid in index.layerBranches:
self.logger.debug("Present: %s" % index.layerBranches[layerbranchid].layer.name)
result = self.layerindex.find_layerbranch(name)
if expected:
self.assertIsNotNone(result, msg="Did not find %s when it should be there" % collection)
else:
self.assertIsNone(result, msg="Found %s when it shouldn't be there" % collection)
tests = [ ('openembedded-core', True),
('core', False),
('meta-networking', True),
('meta-python', True),
('meta-oe', True),
('notpresent', False) ]
for collection,result in tests:
_check(collection, result)

View File

@@ -0,0 +1,11 @@
This test data is used to verify the 'cooker' module of the layerindex.
The module consists of a faux project bblayers.conf with four layers defined.
layer1 - openembedded-core
layer2 - networking-layer
layer3 - meta-python
layer4 - openembedded-layer (meta-oe)
Since we do not have a fully populated cooker, we use this to test the
basic index generation, and not any deep recipe based contents.

View File

@@ -0,0 +1,15 @@
LAYERSERIES_CORENAMES = "sumo"
# LAYER_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
LCONF_VERSION = "7"
BBPATH = "${TOPDIR}"
BBFILES ?= ""
BBLAYERS ?= " \
${TOPDIR}/layer1 \
${TOPDIR}/layer2 \
${TOPDIR}/layer3 \
${TOPDIR}/layer4 \
"

View File

@@ -0,0 +1,17 @@
# We have a conf and classes directory, add to BBPATH
BBPATH .= ":${LAYERDIR}"
# We have recipes-* directories, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb"
BBFILE_COLLECTIONS += "core"
BBFILE_PATTERN_core = "^${LAYERDIR}/"
BBFILE_PRIORITY_core = "5"
LAYERSERIES_CORENAMES = "sumo"
# This should only be incremented on significant changes that will
# cause compatibility issues with other layers
LAYERVERSION_core = "11"
LAYERSERIES_COMPAT_core = "sumo"
BBLAYERS_LAYERINDEX_NAME_core = "openembedded-core"

View File

@@ -0,0 +1,20 @@
# We have a conf and classes directory, add to BBPATH
BBPATH .= ":${LAYERDIR}"
# We have a packages directory, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
${LAYERDIR}/recipes-*/*/*.bbappend"
BBFILE_COLLECTIONS += "networking-layer"
BBFILE_PATTERN_networking-layer := "^${LAYERDIR}/"
BBFILE_PRIORITY_networking-layer = "5"
# This should only be incremented on significant changes that will
# cause compatibility issues with other layers
LAYERVERSION_networking-layer = "1"
LAYERDEPENDS_networking-layer = "core"
LAYERDEPENDS_networking-layer += "openembedded-layer"
LAYERDEPENDS_networking-layer += "meta-python"
LAYERSERIES_COMPAT_networking-layer = "sumo"

View File

@@ -0,0 +1,19 @@
# We might have a conf and classes directory, append to BBPATH
BBPATH .= ":${LAYERDIR}"
# We have recipes directories, add to BBFILES
BBFILES += "${LAYERDIR}/recipes*/*/*.bb ${LAYERDIR}/recipes*/*/*.bbappend"
BBFILE_COLLECTIONS += "meta-python"
BBFILE_PATTERN_meta-python := "^${LAYERDIR}/"
BBFILE_PRIORITY_meta-python = "7"
# This should only be incremented on significant changes that will
# cause compatibility issues with other layers
LAYERVERSION_meta-python = "1"
LAYERDEPENDS_meta-python = "core openembedded-layer"
LAYERSERIES_COMPAT_meta-python = "sumo"
LICENSE_PATH += "${LAYERDIR}/licenses"

View File

@@ -0,0 +1,22 @@
# We have a conf and classes directory, append to BBPATH
BBPATH .= ":${LAYERDIR}"
# We have a recipes directory, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend"
BBFILE_COLLECTIONS += "openembedded-layer"
BBFILE_PATTERN_openembedded-layer := "^${LAYERDIR}/"
# Define the priority for recipes (.bb files) from this layer,
# choosing carefully how this layer interacts with all of the
# other layers.
BBFILE_PRIORITY_openembedded-layer = "6"
# This should only be incremented on significant changes that will
# cause compatibility issues with other layers
LAYERVERSION_openembedded-layer = "1"
LAYERDEPENDS_openembedded-layer = "core"
LAYERSERIES_COMPAT_openembedded-layer = "sumo"